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

OSCHINA-MIRROR/mysterywolf-RT-Thread-wrapper-of-uCOS-II

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
readme.md

RT-Thread операционная система: μC/OS-II совместимый слой для RT-Thread

μC/OS-II RTOS Application Compatibility Layer (ACL) for RT-Thread

Позволяет приложениям, разработанным на основе μC/OS-II, легко мигрировать на операционную систему RT-Thread.

  • Если вам нравится проект, пожалуйста, поставьте ему звезду — это лучшая поддержка для него. Если вы хотите внести свой вклад в проект, пожалуйста, fork.

[TOC]

0 Предварительные замечания

Этот текст содержит изображения, которые могут не загрузиться при просмотре через китайский интернет из-за ограничений. Чтобы прочитать текст полностью, скачайте или клонируйте проект и обратитесь к файлу «docs/中文说明文档.pdf».

1 Введение

Это совместимый слой для операционной системы RT-Thread, который позволяет проектам, основанным на μCOS-II от Micriμm, быстро и без проблем перейти на RT-Thread. При разработке и написании совместимого слоя мы старались сохранить оригинальный стиль μC/OS-II. Проект полностью написан на языке C.

Поддерживаемые версии: μC/OS-II 2.00–2.93 все версии.

1.1 Другие совместимые слои для RT-Thread операционных систем

1.2 Подходит для

  • Разработчиков, желающих перейти с μ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. Такие ошибки часто трудно обнаружить.

Например:

  1. Различные параметры программных таймеров.

  2. Разные типы данных для стеков задач.

1.3 Подробная информация о версии

Компонент Версия Файл конфигурации Описание
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

1.4 Веб-сайты

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

2 Использование

2.1 Keil-MDK имитационный проект

Имитационный проект основан на платформе STM32F103.

Путь к проекту Keil: rt-thread-3.1.3/bsp/stm32f103/Project.uvprojx.

Необходимо заранее установить RT-Thread Nano версии 3.1.3 Keil Support Package.

Примечание: для отладки используется USART2, а не USART1.

usart2

2.2 Шаги миграции

(Если вы используете версию RT-Thread Nano, следуйте инструкциям ниже; если вы используете полную версию RT-Thread, перейдите к разделу [4. Env инструмент для автоматической настройки проекта](#4 Env инструмент для автоматической настройки проекта))

  1. Добавьте все файлы из папки uCOS-II в свой проект, сохранив исходную структуру папок. В дополнение к оригинальному μCOS-II добавлен файл os_rtwrap.c, который поддерживает преобразование между RT-Thread и μCOS-II.
  2. Настройте os_cfg.h. Каждое опционное описание конфигурации соответствует оригинальной версии μCOS-II и разъясняется в комментариях. Для получения информации о конфигурации оригинальной версии μCOS-II см.: a) «Встроенное реальное время μC/OS-II (второе издание)», переведённое издательством Beibei Sha и др., издательство Beijing Aviation and Astronautics University. b) Онлайн-документация Micrium μCOS-II: https://doc.micrium.com/pages/viewpage.action?pageId=16879637
  3. Программные таймеры μCOS-II вызываются в потоке таймера, а не в прерывании, поэтому для использования программного таймера μCOS-II необходимо установить макроопределение RT_USING_TIMER_SOFT равным 1 в rtconfig.h.
  4. Поскольку совместимый слой использует механизм распределения памяти ядра RT-Thread, нет необходимости настраивать размер памяти задач и объектов ядра, как в оригинальной версии uCOS-II. Вместо этого определите макрос RT_USING_MEMHEAP в rtconfig.h.

2.3 Файл конфигурации os_cfg.h

#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, связанные макроопределения были удалены из совместимого слоя.

2.4 Запуск

2.4.1 Ручная инициализация процесса

Этот совместимый слой полностью совместим со стандартным процессом инициализации, предоставленным Micrium. Если вы переносите старый проект, вам не нужно вносить какие-либо изменения в часть инициализации μCOS-II.

2.4.2 Автоматическая инициализация процесса

Если вы не хотите вручную инициализировать этот совместимый слой в своём приложении, вы можете определить макрос 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);

3 Интерфейс

3.1 Новые API

Дополнительно реализована функция OSMutexCreateEx(), которая не присутствует в оригинальной версии μCOS-II. В функции OSMutexCreate() первый параметр prio в слое совместимости не имеет значения, поэтому этот параметр был исключён из OSMutexCreateEx() для удобства использования. Это связано с тем, что реализация μCOS-II слишком устарела и не поддерживает одинаковые задачи с одинаковым приоритетом. Рекомендуется использовать этот API:

OS_EVENT  *OSMutexCreateEx (INT8U  *perr);

Также была добавлена функция OSQCreateEx(), которой нет в оригинальной версии μCOS-II. Первый параметр size в этой функции в слое совместимости также не имеет смысла, поэтому он был исключен из OSQCreateEx() для упрощения использования. Рекомендуется использовать эту функцию:

OS_EVENT  *OSQCreateEx (INT16U    size);

3.2 Нереализованные совместимые API (только два)

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);

3.3 Крючки функций

Крючки функций μ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);

3.4 Статистика задач (OS_TaskStat())

В μCOS-II статистика задач является системной задачей, которая может быть включена или выключена с помощью макроса OS_TASK_STAT_EN. Она позволяет выполнять некоторые статистические операции во время работы системы. Использование процессора представлено целым числом от 0 до 100 (соответственно 0% - 100%).

Однако RT-Thread не имеет статистики задач, поэтому необходимо создать задачу для обеспечения совместимости с исходной версией μCOS-II. Эта задача будет автоматически создана при инициализации слоя совместимости, и пользователям не нужно вмешиваться. Пользователи могут получить текущую загрузку процессора, вызвав глобальную переменную OSCPUUsage, и стратегия расчёта загрузки процессора такая же, как в исходной версии μCOS-II.

3.5 Контрольные блоки задач и объекты ядра (структуры)

Этот слой совместимости пытается максимально сохранить контрольные блоки задач и объектов ядра (структур), чтобы старые программы могли работать без изменений при прямом доступе к членам этих структур.

Например, структура 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» в правом верхнем углу этой страницы, чтобы поддержать меня. Это поможет мне продолжать поддерживать этот проект.

donate

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mysterywolf-RT-Thread-wrapper-of-uCOS-II.git
git@api.gitlife.ru:oschina-mirror/mysterywolf-RT-Thread-wrapper-of-uCOS-II.git
oschina-mirror
mysterywolf-RT-Thread-wrapper-of-uCOS-II
mysterywolf-RT-Thread-wrapper-of-uCOS-II
master