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.
Это руководство предназначено для компилятора Keil, поэтому перед переносом ядра TencentOS tiny вам потребуется установить компилятор Keil. Компилятор Keil для ARM Cortex M также известен как MDK, последняя версия 5.28a, доступна по адресу: https://www.keil.com/demo/eval/arm.htm. Заполните форму регистрации, чтобы скачать, после завершения загрузки установите в окружении Windows, следуя инструкциям. После установки вам потребуется приобрести лицензию для избежания ограничения загрузки до 32 КБ флэш-памяти.Так как новые версии компилятора MDK и пакета поддержки чипов разделены, после установки MDK (Keil) вам также потребуется установить пакет поддержки чипов (PACK пакет), соответствующий вашему чипу. Например, для примера в этом руководстве, использующего плату разработки NUCLEO-L037RZ с чипом STM32L073RZ, вам потребуется установить пакет поддержки чипов Keil.STM32L0xx_DFP.2.0.1.pack. Все поддерживаемые чипами пакеты PACK доступны по адресу: http://www.keil.com/dd2/Pack/#/eula-container. Вам нужно будет скачать соответствующий пакет PACK для вашего чипа, вы также можете загрузить и установить его в интегрированной среде разработки MDK.### 1.3 Подготовка базового проекта без операционной системы для вашего чипа
Перенос базового ядра TencentOS tiny требует подготовки базового проекта без операционной системы для вашего чипа. Этот проект включает базовые файлы запуска чипа, базовые настройки (часы, частота и т.д.), а также драйверы последовательного порта и базовых GPIO для тестирования RTOS.
В этом руководстве используется официальное программное обеспечение STM32CubeMX для автоматической генерации проекта без операционной системы для MDK. Ссылка для загрузки STM32CubeMX: https://www.st.com/content/st_com/zh/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html.
Перед установкой STM32CubeMx вам также потребуется установить среду JDK, вы можете найти инструкции по установке и настройке JDK в интернете, здесь мы не будем подробно останавливаться на этом. CubeMX установлена, теперь можно использовать CubeMX для создания базового проекта для разработки доски NUCLEO-L073RZ. Если ваша микросхема не STM32, а ARM Cortex M-серии от другого производителя, вы можете подготовить базовый проект, следуя руководству производителя. Последующие шаги по переносу ядра будут одинаковыми.
Как показано на рисунке выше: используйте фильтрацию микроконтроллеров, чтобы найти модель микроконтроллера, соответствующую вашей разработочной доске. После двойного щелчка откроется интерфейс конфигурации проекта, как показано на следующем рисунке:
После нажатия кнопки "Создать код" результат будет следующим:
Таким образом, проект для NUCLEO-L073RZ создан. Этот проект можно скомпилировать и загрузить на доску для выполнения.
Исходный код TencentOS tiny открыт для публичного доступа, адрес для загрузки с GitHub: https://github.com/Tencent/TencentOS-tiny.git
Первый уровень каталога | Второй уровень каталога | Описание |
---|---|---|
arch | arm | TencentOS tiny, адаптированный для IP-ядра (включает код прерываний, планирования, тиков для M-ядра) |
board | NUCLEO_L073RZ | Проект для переноса на целевую микросхему |
kernel | core | Исходный код ядра TencentOS tiny |
pm | Исходный код модуля энергосбережения TencentOS tiny | |
osal | cmsis_os | TencentOS tiny, предоставляемое адаптирование CMSIS OS |
Так как данный учебник описывает только перенос ядра TencentOS tiny, здесь используются исходные коды только из четырех каталогов: arch, board, kernel и osal.
Как показано на рисунке, создайте основной каталог TencentOS_tiny и добавьте четыре подкаталога. Каталоги arch, kernel и osal можно скопировать напрямую из репозитория кода, а в каталоге board поместите исходные коды нативного проекта, созданные ранее. Название нашего разрабатываемого устройства — NUCLEO_L073RZ, и все исходные коды нативного проекта можно скопировать в соответствующий каталог, как показано на следующем рисунке:
Далее перейдите в каталог TencentOS_tiny/board/NUCLEO_L073RZ/MDK-ARM и откройте проект Keil, чтобы начать добавлять исходные коды ядра TencentOS tiny.### 2. Добавление кода платформы arch
Файл tos_cpu.c — это файл адаптации CPU для TencentOS tiny, который включает инициализацию стека, адаптацию прерываний и т.д. Если ваше устройство использует ARM Cortex M ядро, этот файл можно не изменять, так как M0, M3, M4 и M7 являются универсальными, а другие IP ядра требуют перенастройки.
Файл port_s.S содержит ассемблерные коды для управления задачами, такие как управление стеком. Файл port_c.c адаптирует systick и т.д. Эти два файла уникальны для каждого IP ядра и компилятора. Если ваше устройство использует ARM Cortex M ядро, мы уже адаптировали их для вас. Например, если мы переносим ядро для STM32L073RZ, которое использует ARM Cortex M0+ ядро и компилятор Keil, мы выбираем адаптированные файлы из каталога arch\arm\arm-v7m\cortex-m0+\armcc. Если ваше устройство использует STM32F429IG, которое использует ARM Cortex M4 ядро и компилятор GCC, вы выбираете адаптированные файлы из каталога arch\arm\arm-v7m\cortex-m4\gcc.
Исходные коды ядра находятся в каталоге kernel, который содержит два каталога: core и pm. Каталог core содержит базовое ядро, а каталог pm — компоненты для снижения энергопотребления. При базовом переносе можно не добавлять исходные коды из каталога pm. Как показано на следующем рисунке, добавьте все исходные коды базового ядра:
CMSIS OS — это адаптированный слой абстракции OS для TencentOS tiny, который позволяет упростить переход бизнес-логики с других RTOS на TencentOS tiny.
Добавим директорию с заголовочными файлами перед тем, как создадим в директории проекта, который нужно перенести, новую папку TOS_CONFIG для хранения заголовочных файлов конфигурации 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
``````c
#define TOS_CFG_EVENT_EN 1u // Макропarameter для включения/отключения модуля событий в 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 // Макропarameter для включения/отключения функции по умолчанию для динамического пула памяти в TencentOS tiny
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100 // Конфигурация размера по умолчанию для динамического пула памяти в TencentOS tiny
#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_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
#define TOS_CFG_TIMER_AS_PROC 1u // Конфигурация для включения режима функции для таймера
#endif
После настройки TencentOS tiny по указанному выше шаблону, файл tos_config.h
следует поместить в директорию проекта для выбранной платформы. Например, в данном руководстве файл tos_config.h
помещается в директорию board\NUCLEO_L073RZ\TOS_CONFIG
.
Таким образом, все необходимые компоненты TencentOS tiny добавлены в проект.
stm32l0xx_it.c
. В файле stm32l0xx_it.c
включите заголовочный файл tos.h
.
```Перед функцией
PendSV_Handler
в файле `stm32l0xx_it.c` добавьте ключевое слово `__weak`, так как эта функция уже переопределена в ассемблерном коде планировщика TencentOS tiny. В функции `SysTick_Handler` добавьте функцию планировщика TencentOS tiny, как показано на следующем рисунке:
main.c
добавьте заголовочный файл TencentOS tiny и напишите функцию задачи.#include "cmsis_os.h"
// Задача 1
#define ЗАДАЧА1_Размер_Стека 256
void задача1(void *pdata);
osThreadDef(задача1, osPriorityNormal, 1, ЗАДАЧА1_Размер_Стека);
// Задача 2
#define ЗАДАЧА2_Размер_Стека 256
void задача2(void *pdata);
osThreadDef(задача2, osPriorityNormal, 1, ЗАДАЧА2_Размер_Стека);
void задача1(void *pdata)
{
int count = 1;
while(1)
{
printf("\r\nПривет, мир!\r\n###Это задача 1, счетчик равен %d \r\n", count++);
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
osDelay(2000);
}
}
void задача2(void *pdata)
{
int count = 1;
while(1)
{
printf("\r\nПривет, TencentOS !\r\n***Это задача 2, счетчик равен %d \r\n", count++);
osDelay(1000);
}
}
int fputc(int ch, FILE *f)
{
if (ch == '\n')
{
HAL_UART_Transmit(&huart2, (void *)"\r", 1, 30000);
}
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
Как показано на рисунке:
Далее после инициализации аппаратных периферий в функции main в файле main.c добавьте код инициализации TencentOS tiny:
osKernelInitialize(); //Инициализация ядра TencentOS tiny
osThreadCreate(osThread(задача1), NULL); //Создание задачи задача1
osThreadCreate(osThread(задача2), NULL); //Создание задачи задача2
osKernelStart(); //Запуск TencentOS tiny
```Как показано на рисунке:

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

Следуйте инструкциям на рисунке для компиляции и загрузки на разработочный модуль, чтобы завершить тестирование TencentOS tiny. Как показано на рисунке ниже, можно увидеть, что информация поочередно выводится в последовательный порт, что указывает на то, что две задачи выполняются и переключаются между собой:

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