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

OSCHINA-MIRROR/topnetfish-TencentOS-tiny

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

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

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 Подготовка среды компиляции

Это руководство предназначено для использования компилятора IAR, поэтому перед переносом ядра вам необходимо установить компилятор IAR. Последняя версия IAR — 8.40, доступна по адресу: https://www.iar.com/iar-embedded-workbench/#!?currentTab=free-trials

После загрузки установите его в окружении Windows, следуя инструкциям. После установки вы можете использовать его бесплатно в течение gst дней, после чего вам потребуется приобрести лицензию на программное обеспечение.

1.3 Подготовка базового проекта безRTOS для вашего чипаПеренос базового ядра TencentOS tiny требует подготовки базового проекта безRTOS для вашего чипа. Проект безRTOS включает базовые файлы запуска чипа, базовые настройки (часы, частоту и т.д.), а также UART, базовые драйверы GPIO для тестирования RTOS.В этом руководстве используется официальное программное обеспечение STM32CubeMX для автоматической генерации проекта безRTOS для IAR. Ссылка для загрузки 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 в интернете, поэтому здесь не будет подробного описания.

После установки STM32CubeMX вы можете использовать его для создания базового проекта безRTOS для платы разработки NUCLEO-L073RZ. Если ваш чип не является STM32, а другим производителем ARM Cortex M, вы можете подготовить базовый проект безRTOS в соответствии с руководством производителя. Последующие шаги переноса ядра будут одинаковыми.

1.3.1 Создание нового проекта в STM32CubeMX

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

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

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

3.4 Настройка интерфейса Pin для конфигурации последовательного порта

3.5 Настройка интерфейса Pin для конфигурации GPIO

3.6 Настройка общего шины часов

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

3.8 Настройка метода генерации кода

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

3.10 Проект без операционной системы для IAR

После нажатия кнопки "Сгенерировать код", результат генерации проекта без операционной системы будет следующим:

Таким образом, проект без операционной системы для платы NUCLEO-L073RZ сгенерирован. Этот проект можно скомпилировать и загрузить на плату для выполнения.

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

Исходный код TencentOS tiny открыт и доступен для загрузки по адресу: https://github.com/Tencent/TencentOS-tiny.git| Первый уровень каталога | Второй уровень каталога | Описание | |--------------------------|--------------------------|----------| | arch | arm | TencentOS tiny, адаптированный для ARM-ядра (включает код для прерываний, планирования и тика) | | board | NUCLEO_L073RZ | Проекты для целевой микроконтроллерной платы | | kernel | core | Исходный код ядра TencentOS tiny | | | pm | Исходный код модуля энергосбережения TencentOS tiny | | osal | cmsis_os | TencentOS tiny, адаптированный для CMSIS OS |Так как в этом руководстве рассматривается только адаптация ядра TencentOS tiny, здесь используются исходные коды каталогов arch, board, kernel и osal.

2. Адаптация ядра

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

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

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

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

В разделе кода навигации IAR добавляем группу tos/arch для добавления исходных кодов TencentOS tiny для платформы arch.

Файл 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+, используя компилятор IAR, мы выбираем адаптированные файлы из папки arch\arm\arm-v7m\cortex-m0+\iccarm. Если ваша плата разработки — STM32F429IG с ядром M4 и компилятором GCC, вы выбираете адаптированные файлы из папки arch\arm\arm-v7m\cortex-m4\gcc.

3. Добавление исходных кодов ядра

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

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

CMSIS OS — это адаптированный слой абстракции OS для TencentOS tiny, который позволяет упростить переход бизнес-логики с других RTOS на TencentOS tiny. В разделе кода навигации IAR добавляем группу tos/cmsis-os для добавления исходных кодов CMSIS OS.

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

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

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

6. Создание конфигурационного файла системы 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		// Макропarameter для включения функции динамического создания задач в TencentOS tiny

#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
``````c
#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN  1u		// Макропараметр для включения функции по умолчанию для динамического пула памяти в 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_TICKLESS_EN             0u		// Конфигурация включения модуля Tickless для низкого энергопотребления в TencentOS tiny

#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
``````c
#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		// Настройка, указывающая, следует ли конфигурировать TIMER как функциональный режим

#endif

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

Таким образом, все необходимые файлы TencentOS tiny добавлены в проект.

Третий шаг: создание задач TencentOS tiny и тестирование результата переноса

1. Изменение части кода

Изменение функций прерываний в файле stm32l0xx_it.c

В файле stm32l0xx_it.c включите заголовочный файл tos.h:

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

2. Создание тестовых задач TencentOS tiny

Включение заголовочных файлов TencentOS tiny в файл main.c и написание функций задач

#include "cmsis_os.h"

// Задача 1
#define TASK1_STK_SIZE		256
void task1(void *pdata);
osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
```// Задача 2
#define TASK2_STK_SIZE		256
void task2(void *pdata);
osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);

void task1(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 task2(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, добавьте код инициализации и запуска TencentOS tiny:

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

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

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

![](https://main.qcloudimg.com/raw/b0f9d16064c4aeffa5f8c3dfbfbc0dbd.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