RT-Thread операционная система: μC/OS-II совместимый слой для RT-Thread
μC/OS-II RTOS Application Compatibility Layer (ACL) for RT-Thread
Позволяет приложениям, разработанным на основе μC/OS-II, легко мигрировать на операционную систему RT-Thread.
[TOC]
Этот текст содержит изображения, которые могут не загрузиться при просмотре через китайский интернет из-за ограничений. Чтобы прочитать текст полностью, скачайте или клонируйте проект и обратитесь к файлу «docs/中文说明文档.pdf».
Это совместимый слой для операционной системы RT-Thread, который позволяет проектам, основанным на μCOS-II от Micriμm, быстро и без проблем перейти на RT-Thread. При разработке и написании совместимого слоя мы старались сохранить оригинальный стиль μC/OS-II. Проект полностью написан на языке C.
Поддерживаемые версии: μC/OS-II 2.00–2.93 все версии.
Разработчиков, желающих перейти с μCOS-II на RT-Thread и имеющих опыт работы с μCOS-II. Этот совместимый слой поможет вам использовать существующие навыки и привычки для быстрого запуска проектов, а затем постепенно изучить API и стиль программирования RT-Thread. С этим слоем изучение RT-Thread больше не будет препятствием!
Задач (потоков), написанных на μCOS-II, которые нужно использовать в проектах на базе RT-Thread.
Старых проектов, требующих перехода с μC/OS на RT-Thread.
Быстрой разработки продуктов на основе RT-Thread для разработчиков, имеющих опыт работы с μC/OS, но не знакомых с RT-Thread. Это поможет упростить повторное использование программного обеспечения, сократить время обучения микроконтроллерных разработчиков и время вывода новых устройств на рынок.
Предотвращения ошибок, вызванных мышлением, сформированным опытом работы с μC/OS, при переходе на RT-Thread. Такие ошибки часто трудно обнаружить.
Например:
Различные параметры программных таймеров.
Разные типы данных для стеков задач.
Компонент | Версия | Файл конфигурации | Описание |
---|---|---|---|
RT-Thread nano | 3.1.3 | rtconfig.h | |
μC/OS-II | 2.93.00 | os_cfg.h app_hooks.c |
Совместимость со всеми версиями μCOS-II 2.00-2.93 |
RT-Thread: https://www.rt-thread.org/
Документация: https://www.rt-thread.org/document/site/tutorial/nano/an0038-nano-introduction/
μCOS-II: https://www.micrium.com/
Документация: https://doc.micrium.com/pages/viewpage.action?pageId=10753158
Имитационный проект основан на платформе STM32F103.
Путь к проекту Keil: rt-thread-3.1.3/bsp/stm32f103/Project.uvprojx.
Необходимо заранее установить RT-Thread Nano версии 3.1.3 Keil Support Package.
Примечание: для отладки используется USART2, а не USART1.
(Если вы используете версию RT-Thread Nano, следуйте инструкциям ниже; если вы используете полную версию RT-Thread, перейдите к разделу [4. Env инструмент для автоматической настройки проекта](#4 Env инструмент для автоматической настройки проекта))
#define OS_TMR_CFG_TICKS_PER_SEC 10u /* Rate at which timer management task runs (Hz) */
В оригинальной версии μCOS-II этот макрос определяет базовую частоту сигнала таймера программного таймера (Гц). В RT-Thread базовая частота сигнала таймера программного таймера равна OS Ticks. Поэтому для преобразования времени программного таймера μCOS-II во время программного таймера RT-Thread необходимо использовать этот макрос. Убедитесь, что его значение совпадает со значением, используемым в исходном проекте μCOS-II. Обратите внимание, что хотя базовая частота сигнала таймера программного таймера определена в этом макросе, базовая частота сигнала таймера в совместимом слое равна частоте OS Ticks, поэтому переменная .OSTmrMatch
структуры OS_Tmr
сохраняет значение, рассчитанное по частоте OS Ticks.
Поскольку совместимый слой использует механизм выделения памяти ядра RT-Thread, связанные макроопределения были удалены из совместимого слоя.
Этот совместимый слой полностью совместим со стандартным процессом инициализации, предоставленным Micrium. Если вы переносите старый проект, вам не нужно вносить какие-либо изменения в часть инициализации μCOS-II.
Если вы не хотите вручную инициализировать этот совместимый слой в своём приложении, вы можете определить макрос PKG_USING_UCOSII_WRAPPER_AUTOINIT в файле rtconfig.h (рекомендуется). См. раздел [4.2.1 Включить автоматическую инициализацию μC/OS-II](#4.2.1 Enable uCOS-II wrapper automatically init). μCOS-II: Размер стека задач и RT-Thread
Размер стека задач в μCOS-II измеряется в единицах sizeof(CPU_STK)
, а в RT-Thread — в sizeof(rt_uint8_t)
. Несмотря на то, что в слое совместимости преобразование уже было выполнено, при заполнении необходимо обратить внимание на то, чтобы все API μCOS-II и макроопределения соответствовали стандартам μCOS-II, где размер стека равен sizeof(CPU_STK)
.
Пример неправильного подхода:
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t thread2_stack[1024];//ошибка: смешивание типов данных RT-Thread для определения стека потоков
OSTaskCreateExt(task,
0,
&task_stack[TASK_SIZE-1],
TASK_PRIO,
0,
&task_stack[0],
sizeof(thread2_stack),//размер стека задачи (ошибка: этот параметр измеряется в sizeof(CPU_STK))
0,
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
Правильный подход:
#define THREAD_STACK_SIZE 256 //правильно, размер стека должен быть определён через макрос и измеряться в sizeof(CPU_STK)
ALIGN(RT_ALIGN_SIZE)
static CPU_STK thread2_stack[THREAD_STACK_SIZE];//правильно, использование собственных типов данных uCOS-II для определения стека задач
OSTaskCreateExt(task,
0,
&task_stack[TASK_SIZE-1],
TASK_PRIO,
0,
&task_stack[0],
THREAD_STACK_SIZE,//размер стека задачи (правильно)
0,
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
Дополнительно реализована функция OSMutexCreateEx()
, которая не присутствует в оригинальной версии μCOS-II. В функции OSMutexCreate()
первый параметр prio
в слое совместимости не имеет значения, поэтому этот параметр был исключён из OSMutexCreateEx()
для удобства использования. Это связано с тем, что реализация μCOS-II слишком устарела и не поддерживает одинаковые задачи с одинаковым приоритетом. Рекомендуется использовать этот API:
OS_EVENT *OSMutexCreateEx (INT8U *perr);
Также была добавлена функция OSQCreateEx()
, которой нет в оригинальной версии μCOS-II. Первый параметр size
в этой функции в слое совместимости также не имеет смысла, поэтому он был исключен из OSQCreateEx()
для упрощения использования. Рекомендуется использовать эту функцию:
OS_EVENT *OSQCreateEx (INT16U size);
INT8U OSTaskCreate (void (*task)(void *p_arg),
void *p_arg,
OS_STK *ptos,
INT8U prio);
INT16U OSEventPendMulti (OS_EVENT **pevents_pend,
OS_EVENT **pevents_rdy,
void **pmsgs_rdy,
INT32U timeout,
INT8U *perr);
Крючки функций μCOS-II отвечают только за слой совместимости μCOS-II. То есть, если вы зарегистрировали функцию OSTaskDelHook
, она будет вызываться только при вызове функции OSTaskDel
, но не при вызове rt_thread_detach
(это обрабатывается крючками функций RT-Thread). Это сделано для того, чтобы слои μCOS-II и RT-Thread оставались раздельными и μCOS-II не вмешивался во внутренние операции RT-Thread.
Крючки функций μCOS-II реализованы в двух файлах: os_cpu_c.c
и app_hooks.c
. В соответствии с концепцией μCOS-II, os_cpu_c.c
предоставляет исходные крючки функций (эти функции вызываются непосредственно соответствующими функциями), и этот файл, включая его внутренние крючки функций, написан инженерами по миграции. Разработчики приложений не должны изменять содержимое этого файла. os_cpu_c.c
также предоставляет указатели функций для регистрации и использования крючков функций в файле app_hooks.c
, который разработчики приложений могут изменять. Другими словами, мы можем вызывать функции, которые нам нужны в крючках функций, в файле app_hooks.c
.
Следующие оригинальные крючки функций μCOS-II будут удалены, и их функции будут переданы RT-Thread:
void OSTaskReturnHook (OS_TCB *p_tcb);
void OSTaskSwHook (void);
void OSTimeTickHook (void);
Соответствующие крючки функций уровня приложения также будут удалены:
void App_TaskReturnHook (OS_TCB *p_tcb);
void App_TaskSwHook (void);
void App_TimeTickHook (void);
В μCOS-II статистика задач является системной задачей, которая может быть включена или выключена с помощью макроса OS_TASK_STAT_EN
. Она позволяет выполнять некоторые статистические операции во время работы системы. Использование процессора представлено целым числом от 0 до 100 (соответственно 0% - 100%).
Однако RT-Thread не имеет статистики задач, поэтому необходимо создать задачу для обеспечения совместимости с исходной версией μCOS-II. Эта задача будет автоматически создана при инициализации слоя совместимости, и пользователям не нужно вмешиваться. Пользователи могут получить текущую загрузку процессора, вызвав глобальную переменную OSCPUUsage
, и стратегия расчёта загрузки процессора такая же, как в исходной версии μCOS-II.
Этот слой совместимости пытается максимально сохранить контрольные блоки задач и объектов ядра (структур), чтобы старые программы могли работать без изменений при прямом доступе к членам этих структур.
Например, структура OS_TCB
содержит большинство членов оригинальной структуры. Если вам не нужны совместимые члены структуры, вы можете определить макрос PKG_USING_UCOSII_WRAPPER_TINY
, и структура OS_TCB
значительно сократится. Вы также можете отключить OS_TASK_PROFILE_EN
, OS_TASK_NAME_EN
и OS_CFG_TASK_REG_TBL_SIZE
, чтобы ещё больше сократить структуру. Глобальные переменные
В настоящий момент этот уровень совместимости может использовать следующие глобальные переменные μCOS-II (находятся в файле ucos_ii.h
). Конкретное значение этих глобальных переменных см. в разделе 2.2 «Шаги миграции» в списке литературы.
#if OS_TASK_STAT_EN > 0u
OS_EXT INT8U OSCPUUsage; /* Процент использования ЦП */
OS_EXT INT32U OSIdleCtrMax; /* Максимальное значение, которое счётчик простоя может принять за 1 секунду. */
OS_EXT INT32U OSIdleCtrRun; /* Значение, достигнутое счётчиком простоя во время выполнения за 1 секунду. */
OS_EXT BOOLEAN OSStatRdy; /* Флаг, указывающий, что задача статистики готова */
OS_EXT OS_STK OSTaskStatStk[OS_TASK_STAT_STK_SIZE]; /* Стек задачи статистики */
#endif
#define OSIntNesting rt_interrupt_get_nest() /* Уровень вложенности прерываний */
#define OSLockNesting rt_critical_level() /* Уровень блокировки многозадачности */
#define OSPrioCur rt_thread_self()->current_priority /* Приоритет текущей задачи */
OS_EXT BOOLEAN OSRunning; /* Флаг, показывающий, что ядро работает */
OS_EXT INT8U OSTaskCtr; /* Количество созданных задач */
#if OS_TASK_STAT_EN > 0u
OS_EXT volatile INT32U OSIdleCtr; /* Счётчик простоя */
#endif
#ifdef OS_SAFETY_CRITICAL_IEC61508
OS_EXT BOOLEAN OSSafetyCriticalStartFlag;
#endif
#define OSTCBCur ((OS_TCB*)rt_thread_self()) /* Указатель на текущий запущенный TCB */
OS_EXT OS_TCB *OSTCBFreeList; /* Указатель на список свободных TCBs */
OS_EXT OS_TCB *OSTCBList; /* Указатель на двусвязный список TCBs */
OS_EXT OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO + 1u]; /* Таблица указателей на созданные TCBs */
OS_EXT OS_TCB OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS]; /* Таблица TCBs */
#if (OS_MEM_EN > 0u) && (OS_MAX_MEM_PART > 0u)
OS_EXT OS_MEM *OSMemFreeList; /* Указатель на свободный список памяти
``` **Разделы**
OS_EXT OS_MEM OSMemTbl[OS_MAX_MEM_PART];/* Storage for memory partition manager */
#endif
#if OS_TASK_REG_TBL_SIZE > 0u
OS_EXT INT8U OSTaskRegNextAvailID; /* Next available Task register ID */
#endif
#if OS_TIME_GET_SET_EN > 0u
#define OSTime rt_tick_get() /* Current value of system time (in ticks) */
#endif
#if OS_TMR_EN > 0u
#define OSTmrTime rt_tick_get() /* Current timer time */
#endif
**4. Инструменты Env для автоматической настройки в проекте**
**4.1. Метод настройки**
В RT-Thread Nano Edition необходимо вручную добавить слой совместимости uCOS-II в проект, но если вы используете полную версию RT-Thread, то можно автоматически добавить его с помощью инструмента Env. Вот как это сделать:
RT-Thread online packages
system packages --->
Micrium: Micrium software products porting for RT-Thread --->
uCOS-II Wrapper --->
Enable uCOS-II wrapper automatically init
Enable uCOS-II wrapper tiny mode
Version (latest) --->
**4.2. Описание дополнительных функций**
4.2.1 Enable uCOS-II wrapper automatically init
Слой совместимости uCOS-II поддерживает инициализацию в соответствии с шагами оригинальной версии uCOS-II. Однако в некоторых случаях пользователь может не захотеть вручную инициализировать слой совместимости и сразу запустить прикладные задачи или модули. В этом случае можно использовать этот макрос. После определения этого макроса в файле rtconfig.h и перед входом в основной поток после завершения инициализации RT-Thread слой совместимости будет автоматически инициализирован. Пользователю нужно только сосредоточиться на прикладных задачах uCOS-II.
Если эта функция включена, в файле rtconfig.h будет определён макрос PKG_USING_UCOSII_WRAPPER_AUTOINIT. В функции файла os_rtwrap.c будут включены и автоматически выполнены во время инициализации RT-Thread.
Чтобы использовать эту функцию в Nano Edition, можно вручную определить макрос PKG_USING_UCOSII_WRAPPER_AUTOINIT в файле rtconfig.h.
```c
/**
* 自动初始化
* uCOS-II兼容层支持按照uCOS-II原版的初始化步骤进行初始化,但是在有些情况,
* 用户不想手动初始化uCOS-II兼容层,想要直接运行应用层任务或模块,则可以使用该
* 宏定义。在rtconfig.h中定义本宏定义后,在RT-Thread初始化完成并进入到main线程之前
* 会自动将uCOS-II兼容层初始化完毕,用户仅需要专注于uCOS-II的应用级任务即可。
* The wrapper supports uCOS-II standard startup procedure. Alternatively,
* if you want to run uCOS-II apps directly and ignore the startup procedure,
* you can choose this option.
*/
#ifdef PKG_USING_UCOSII_WRAPPER_AUTOINIT
static int rt_ucosii_autoinit(void)
{
OSInit(); /*uCOS-II操作系统初始化*/
OSStart(); /*开始运行uCOS-II操作系统*/
#if OS_TASK_STAT_EN > 0u
OSStatInit();
#endif
return 0;
}
INIT_PREV_EXPORT(rt_ucosii_autoinit);
#endif
4.2.2 Enable uCOS-II wrapper tiny mode
Если вам не нужны члены переменных структуры задач/ядер в процессе использования, вы можете включить эту опцию. ENV автоматически определит макрос PKG_USING_UCOSII_WRAPPER_TINY в файле rtconfig.h. Этот режим удовлетворяет основным требованиям совместимости всех API и рекомендуется к включению.
5. Ссылки
5.1 RT-Thread Nano Migration Tutorial
Официальная документация: https://www.rt-thread.org/document/site/tutorial/nano/an0038-nano-introduction/ Видеоурок: На основе MDK миграции RT-Thread Nano: https://www.bilibili.com/video/BV1TJ411673o На основе IAR миграции RT-Thread Nano: https://www.bilibili.com/video/BV1BJ41177CW На основе CubeMX миграции RT-Thread Nano: https://www.bilibili.com/video/BV1KJ41167qg
Вы можете посмотреть эту статью, чтобы перейти непосредственно из uCOS-II к RT-Thread: https://mp.weixin.qq.com/s/EY73hn2IeBV2NQcLPYUbjw
5.2 RT-Thread FinSH Control Console Tutorial
Официальная документация: https://www.rt-thread.org/document/site/programming-manual/finsh/finsh/ Видеоурок: https://www.bilibili.com/video/BV1r741137sY?p=1
6. Другое
6.1 Контакты
Поддержка: Meco Man Контакты: jiantingman@foxmail.com
6.2 Домашняя страница
https://github.com/mysterywolf/RT-Thread-wrapper-of-uCOS-II https://gitee.com/mysterywolf/RT-Thread-wrapper-of-uCOS-II (внутренний зеркальный сайт, синхронизируется периодически)
6.3 Открытый исходный код
Используется лицензия Apache-2.0. Пожалуйста, ознакомьтесь с содержанием файла LICENSE в проекте.
6.4 Поддержка
Если вам нравится этот проект, вы можете нажать кнопку «Star» в правом верхнем углу этой страницы, чтобы поддержать меня. Это поможет мне продолжать поддерживать этот проект.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )