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 и т.д.
Это руководство предназначено для компилятора 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.
Перенос базового ядра 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 и создание нового проекта
Как показано на рисунке выше: используйте фильтрацию MCU для нахождения соответствующей модели чипа для вашей платы. После двойного щелчка откроется окно конфигурации проекта, как показано ниже:
После нажатия кнопки "Создать код" результат будет следующим: в каталоге с makefile откройте командную строку Windows (нажав Shift+правый клик мыши и выбрав "Открыть командную строку здесь"), введите команду make, чтобы скомпилировать основной проект в GCC. После завершения компиляции вы увидите сгенерированные файлы elf и bin. С помощью соответствующего инструмента вы сможете загрузить файл bin на плату для выполнения.
Исходный код 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.
Как показано на рисунке, создайте основной каталог TencentOS_tiny и добавьте четыре подкаталога. Каталоги arch, kernel и osal можно скопировать напрямую из репозитория кода, а в каталоге board поместите код вашего базового проекта. Название нашей целевой платы — NUCLEO_L073RZ, и весь код базового проекта можно скопировать в соответствующий каталог, как показано на следующем рисунке:
Далее перейдите в каталог TencentOS_tiny/board/NUCLEO_L073RZ и откройте файл Makefile, чтобы добавить исходный код ядра TencentOS tiny.
Перед добавлением кода определите путь 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
.
kernel
, которая содержит поддиректории core
и pm
. В core
содержится базовое ядро, а pm
— это компоненты ядра для снижения энергопотребления. При базовой портировке можно не добавлять код из директории pm
, как показано на следующем рисунке, добавляя исходный код базового ядра:CMSIS OS — это адаптация уровня абстракции операционной системы, которую TencentOS tiny использует для совместимости с стандартом CMSIS. Это упрощает переход бизнес-логики с других RTOS на TencentOS tiny.
Перед добавлением директории заголовочных файлов, в директории проекта, который нужно портировать, создайте директорию TOS_CONFIG
для хранения конфигурационных заголовочных файлов TencentOS tiny, то есть файла tos_config.h
, который будет создан далее.
Все директории заголовочных файлов, которые нужно добавить для TencentOS tiny, представлены на следующем рисунке:
Так как файл порта сборки ядра port_s.S
использует расширение .S
вместо .s
, нам нужно добавить правило компиляции для .S
в файле makefile
, как показано на следующем рисунке:
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`:

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

```### 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;
}
```Как показано на рисунке:

Далее добавьте код инициализации ядра TencentOS tiny в функцию main в main.c после инициализации аппаратных периферий:
```markdown
osKernelInitialize(); // Инициализация ядра TencentOS tiny
osThreadCreate(osThread(task1), NULL); // Создание задачи task1
osThreadCreate(osThread(task2), NULL); // Создание задачи task2
osKernelStart(); // Запуск TencentOS tiny
```
Как показано на рисунке:

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

Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )