1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/topnetfish-TencentOS-tiny

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
12.TencentOS_tiny_porting_guide_gcc.md 24 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 27.04.2025 08:26 ea59f9a

Руководство по переносу ядра TencentOS tiny (GCC версия)

1. Подготовка перед переносом

1.1 Подготовка целевого оборудования (платы разработки/чипов/модулей)

TencentOS tiny в настоящее время поддерживает перенос для чипов ARM Cortex M, таких как полный ряд STM32 на основе Cortex M, полный ряд NXP на основе Cortex M и т.д. В этом руководстве будет использоваться официальная демонстрационная плата STM32 NUCLEO-L073RZ для примера переноса. Методы переноса для других плат ARM Cortex M аналогичны.

Для отладки ARM Cortex M также требуется эмулятор. Плата NUCLEO-L073RZ имеет встроенный эмулятор ST-Link. Если ваша плата разработки или модуль чипа не имеет встроенного эмулятора, вам потребуется подключить внешний эмулятор, такой как J-Link, U-Link и т.д.

1.2 Подготовка среды компиляции

Это руководство предназначено для компилятора GCC, поэтому перед переносом ядра TencentOS tiny вам нужно установить компилятор GCC. Ссылка для загрузки GCC, который может компилировать ARM Cortex M, выглядит так: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

Как показано на изображении выше, загрузите версию GCC для Windows (exe) или Linux. После завершения загрузки установите его в окружении Windows, следуя инструкциям.

Внимание: После завершения установки убедитесь, что вы выбрали опцию "Добавить путь к переменной окружения".В окружении Windows нет среды make, поэтому вам также нужно установить инструмент make. Инструмент make используется для сборки проекта с помощью файла Makefile. Версия: gnu-mcu-eclipse-build-tools-2.9-20170629-1013-win64-setup.exe

Ссылка для загрузки: https://github.com/gnu-mcu-eclipse/windows-build-tools/releases/tag/v2.9-20170629-1013

Установите его, дважды щелкнув по файлу. После завершения установки добавьте путь к исполняемому файлу make в переменную окружения PATH Windows. По умолчанию путь установки выглядит так: C:\Program Files\GNU MCU Eclipse\Build Tools\2.9-20170629-1013\bin\bin.

1.3 Подготовка базового проекта безRTOS для вашего чипа

Перенос базового ядра TencentOS tiny требует подготовки базового проекта безRTOS для вашего чипа. Проект безRTOS включает базовые файлы запуска чипа, базовые настройки (часы, частота и т.д.), а также драйверы UART и GPIO для тестирования RTOS.

В этом руководстве используется официальное программное обеспечение STM32CubeMX для автоматической генерации проекта GCC безRTOS. Ссылка для загрузки STM32CubeMX выглядит так: [https://www.st.com/en/development-tools/stm32cubemx.html].

Установка STM32CubeMx требует предварительной установки JDK-среды. Вы можете найти инструкции по установке и настройке JDK-среды в интернете, поэтому здесь мы не будем подробно останавливаться на этом вопросе.После завершения установки CubeMX вы сможете использовать CubeMX для создания боссовых проектов для платы NUCLEO-L073RZ. Если ваш чип не является STM32 и относится к другому производителю ARM Cortex M-серии, вы можете подготовить боссовый проект в соответствии с инструкциями производителя. Последующие шаги по переносу ядра будут одинаковыми.#### 3.1 Запуск STM32CubeMx и создание нового проекта

3.2 Выбор модели MCU

Как показано на рисунке выше: используйте фильтрацию MCU для нахождения соответствующей модели чипа для вашей платы. После двойного щелчка откроется окно конфигурации проекта, как показано ниже:

3.3 Настройка источника тактового сигнала в окне Pin

3.4 Настройка последовательного порта в окне Pin

3.5 Настройка GPIO в окне Pin

3.6 Настройка тактового сигнала шины

3.7 Настройка параметров генерации проекта

3.9 Генерация проекта

3.10 Компиляция основного проекта в GCC

После нажатия кнопки "Создать код" результат будет следующим: в каталоге с makefile откройте командную строку Windows (нажав Shift+правый клик мыши и выбрав "Открыть командную строку здесь"), введите команду make, чтобы скомпилировать основной проект в GCC. После завершения компиляции вы увидите сгенерированные файлы elf и bin. С помощью соответствующего инструмента вы сможете загрузить файл bin на плату для выполнения.

4. Подготовка исходного кода TencentOS tiny

Исходный код TencentOS tiny открыт, адрес для загрузки с GitHub:

https://github.com/Tencent/TencentOS-tiny.git

Первый уровень каталога Второй уровень каталога Описание
arch arm Исходный код TencentOS tiny, адаптированный для IP-ядра архитектуры (включая код прерываний, планировщика, тика и т.д.)
board NUCLEO_L073RZ Проектные файлы для целевой микросхемы
kernel core Исходный код ядра TencentOS tiny
pm Исходный код модуля низкого энергопотребления TencentOS tiny
osal cmsis_os Исходный код адаптации CMSIS OS для TencentOS tiny

Так как данный учебник описывает только процесс переноса ядра TencentOS tiny, здесь используются исходные коды только из каталогов arch, board, kernel и osal.

2. Перенос ядра

1. Планирование структуры каталогов

Как показано на рисунке, создайте основной каталог TencentOS_tiny и добавьте четыре подкаталога. Каталоги arch, kernel и osal можно скопировать напрямую из репозитория кода, а в каталоге board поместите код вашего базового проекта. Название нашей целевой платы — NUCLEO_L073RZ, и весь код базового проекта можно скопировать в соответствующий каталог, как показано на следующем рисунке:

Далее перейдите в каталог TencentOS_tiny/board/NUCLEO_L073RZ и откройте файл Makefile, чтобы добавить исходный код ядра TencentOS tiny.

2. Добавление кода платформы arch

Перед добавлением кода определите путь TOP_DIR в файле Makefile, используемый как верхний каталог TencentOS tiny. Текущий файл Makefile находится во втором уровне подкаталога, поэтому можно определить относительный путь к верхнему каталогу как TOP_DIR = ../../, как показано на следующем рисунке:

Затем добавьте C-код из каталога arch после C_SOURCES в файле Makefile, а также добавьте раздел ASM_SOURCES, включающий ассемблерный код .S.

tos_cpu.c — это файл адаптации CPU для TencentOS tiny, включая инициализацию стека, адаптацию прерываний и т.д. Если ваша микросхема — ARM Cortex M-ядра, этот файл можно не изменять, так как M0, M3, M4 и M7 являются универсальными, а для других IP-ядер требуется новая адаптация. Файл port_s.S содержит ассемблерный код для задачи планирования в TencentOS tiny, который выполняет операции по загрузке и сохранению стека. Файл port_c.c предназначен для поддержки systick и других функций. Эти файлы уникальны для каждого ядра IP и компилятора. Если ваше устройство имеет ядро ARM Cortex M, мы уже адаптировали его. Например, если мы переносим на чип STM32L073RZ, который имеет ядро ARM Cortex M0+, и используем компилятор GCC, мы выбираем адаптированные файлы из директории arch\arm\arm-v7m\cortex-m0+\gcc. Если ваша плата разработки имеет ядро STM32F429IG, которое является ядром M4, и вы используете компилятор Keil, вы можете выбрать адаптированные файлы из директории arch\arm\arm-v7m\cortex-m4\armcc.

3. Добавление исходного кода ядраИсходный код ядра находится в директории kernel, которая содержит поддиректории core и pm. В core содержится базовое ядро, а pm — это компоненты ядра для снижения энергопотребления. При базовой портировке можно не добавлять код из директории pm, как показано на следующем рисунке, добавляя исходный код базового ядра:

4. Добавление исходного кода CMSIS OS

CMSIS OS — это адаптация уровня абстракции операционной системы, которую TencentOS tiny использует для совместимости с стандартом CMSIS. Это упрощает переход бизнес-логики с других RTOS на TencentOS tiny.

5. Добавление директории заголовочных файлов TencentOS tiny

Перед добавлением директории заголовочных файлов, в директории проекта, который нужно портировать, создайте директорию TOS_CONFIG для хранения конфигурационных заголовочных файлов TencentOS tiny, то есть файла tos_config.h, который будет создан далее.

Все директории заголовочных файлов, которые нужно добавить для TencentOS tiny, представлены на следующем рисунке:

6. Изменение правил компиляции в файле makefile

Так как файл порта сборки ядра port_s.S использует расширение .S вместо .s, нам нужно добавить правило компиляции для .S в файле makefile, как показано на следующем рисунке:

7. Создание конфигурационного файла системы TencentOS tiny tos_config.h

#ifndef _TOS_CONFIG_H_
#define _TOS_CONFIG_H_

#include "stm32l0xx.h"	// Заголовочный файл для целевого микроконтроллера, который пользователь должен изменить в зависимости от ситуации

#define TOS_CFG_TASK_PRIO_MAX           10u 	// Конфигурация максимального количества поддерживаемых приоритетов в TencentOS tiny

#define TOS_CFG_ROUND_ROBIN_EN          0u		// Конфигурация включения/отключения режима времени кругового обмена в ядре TencentOS tiny

#define TOS_CFG_OBJECT_VERIFY_EN        1u		// Конфигурация включения/отключения проверки легальности указателей в TencentOS tiny

#define TOS_CFG_TASK_DYNAMIC_CREATE_EN  1u		// Макропредопределение для динамического создания задач в TencentOS tiny

#define TOS_CFG_EVENT_EN                1u		// Макропредопределение для модуля событий в TencentOS tiny

#define TOS_CFG_MMBLK_EN                1u		// Конфигурация включения/отключения модуля управления блоками памяти в TencentOS tiny

#define TOS_CFG_MMHEAP_EN               1u		// Конфигурация включения/отключения модуля динамического управления памятью в TencentOS tiny

#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN  1u		// Макропредопределение для включения/отключения стандартного пула динамической памяти в TencentOS tiny

#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100	// Конфигурация размера стандартного пула динамической памяти в TencentOS tiny

Определите конфигурацию TencentOS tiny, используя следующие макросы:```c #define TOS_CFG_MUTEX_EN 1u // Конфигурация TencentOS tiny для включения модуля мьютексов

#define TOS_CFG_MESSAGE_QUEUE_EN 1u // Конфигурация TencentOS tiny для включения модуля очередей сообщений

#define TOS_CFG_MAIL_QUEUE_EN 1u // Конфигурация TencentOS tiny для включения модуля почтовых очередей

#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 1u // Конфигурация TencentOS tiny для включения модуля очередей сообщений с приоритетом

#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN 1u // Конфигурация TencentOS tiny для включения модуля почтовых очередей с приоритетом

#define TOS_CFG_TIMER_EN 1u // Конфигурация TencentOS tiny для включения модуля таймеров

#define TOS_CFG_PWR_MGR_EN 0u // Конфигурация TencentOS tiny для включения модуля управления питанием периферий

#define TOS_CFG_TICKLESS_EN 0u // Конфигурация Tickless модуля управления энергопотреблением

#define TOS_CFG_SEM_EN 1u // Конфигурация TencentOS tiny для включения модуля семафоров

#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN 1u // Конфигурация TencentOS tiny для включения модуля обнаружения глубины стека задач

#define TOS_CFG_FAULT_BACKTRACE_EN 0u // Конфигурация TencentOS tiny для включения модуля обратного прослеживания стека при сбоях

#define TOS_CFG_IDLE_TASK_STK_SIZE 128u // Конфигурация размера стека пустой задачи TencentOS tiny

#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // Конфигурация частоты тиков TencentOS tiny

#define TOS_CFG_CPU_CLOCK (SystemCoreClock) // Конфигурация частоты процессора TencentOS tiny

Тип документа для перевода: markdown
Язык исходного текста: китайский
Язык финального текста должен быть: русский

```c
#define TOS_CFG_TIMER_AS_PROC           1u    // Конфигурация для использования таймера в качестве функции

#endif
```

После настройки конфигурации TencentOS tiny, поместите файл `tos_config.h` в директорию вашего проекта для выбранной платформы, например, в директорию `board\NUCLEO_L073RZ\TOS_CONFIG`.

Теперь исходный код TencentOS tiny полностью добавлен.

## 3. Создание задач TencentOS tiny, тестирование результата трансплантации

### 1. Изменение части кода
#### Изменение функций прерываний в файле stm32l0xx_it.c
В файле `stm32l0xx_it.c` (директория `board\NUCLEO_L073RZ\Src`) включите заголовочный файл `tos.h`:

![](https://main.qcloudimg.com/raw/d3212faec1bb029a1de508697a619a31.png)

В файле `stm32l0xx_it.c` перед функцией `PendSV_Handler` добавьте ключевое слово `__weak`, так как эта функция уже переопределена в ассемблерном коде планировщика TencentOS tiny. В функции `SysTick_Handler` добавьте функцию планировщика TencentOS tiny, как показано на следующем рисунке:

![](https://main.qcloudimg.com/raw/29da9ce673eb20b7996734e251f71d21.png)
```### 2. Создание тестовых задач для TencentOS tiny

#### Добавление заголовочных файлов TencentOS tiny в main.c и написание функций задач
``````markdown
   #include "cmsis_os.h"
   //task1
   #define TASK1_STK_SIZE		512
   void task1(void *pdata);
   osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
   
   //task2
   #define TASK2_STK_SIZE		512
   void task2(void *pdata);
   osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
   
   void task1(void *pdata)
   {
       int count = 1;
       while(1)
       {
           printf("\r\nHello world!\r\n###This is task1, count is %d \r\n", count++);
           HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
           osDelay(2000);
       }
   }
   void task2(void *pdata)
   {
       int count = 1;
       while(1)
       {
           printf("\r\nHello TencentOS !\r\n***This is task2, count is %d \r\n", count++);
           osDelay(1000);
       }
   }
   
   int _write(int fd, char *ptr, int len)
   {
       (void)HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, 0xFFFF);
       return len;
   }
```Как показано на рисунке:
![](https://main.qcloudimg.com/raw/d473f5c834d99573ac664f328f077238.png)

Далее добавьте код инициализации ядра TencentOS tiny в функцию main в main.c после инициализации аппаратных периферий:

```markdown
     osKernelInitialize(); // Инициализация ядра TencentOS tiny
     osThreadCreate(osThread(task1), NULL); // Создание задачи task1
     osThreadCreate(osThread(task2), NULL); // Создание задачи task2
     osKernelStart(); // Запуск TencentOS tiny
```

Как показано на рисунке:
![](https://main.qcloudimg.com/raw/9fe99042cc3bdf0b75aff576337343ba.png)

### 3. Компиляция, загрузка и тестирование результатов портирования TencentOS tiny

После редактирования кода вернитесь в директорию TencentOS_tiny\board\NUCLEO_L073RZ и найдите файл makefile. Откройте командную строку в этой директории и введите команду make для компиляции. Полученный bin-файл загрузите на разработочную плату с помощью загрузочного инструмента. Это завершит тестирование TencentOS tiny. Как показано на рисунке, можно увидеть, что информация в порту последовательного соединения чередуется, что указывает на то, что две задачи выполняются и переключаются между собой:

![](https://main.qcloudimg.com/raw/e64474d46ddb9d622a6e38481c6a7859.png)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/topnetfish-TencentOS-tiny.git
git@api.gitlife.ru:oschina-mirror/topnetfish-TencentOS-tiny.git
oschina-mirror
topnetfish-TencentOS-tiny
topnetfish-TencentOS-tiny
master