RT-Thread операционная система: μC/OS-III совместимый слой
μC/OS-III RTOS Application Compatibility Layer (ACL) для RT-Thread позволяет без проблем переносить приложения, разработанные на основе μC/OS-III, на операционную систему RT-Thread.
Если вам нравится проект, пожалуйста, поставьте ему звезду. Это будет лучшей поддержкой для проекта. Если вы хотите внести свой вклад в проект, пожалуйста, fork.
Этот документ содержит изображения, которые могут не загрузиться при доступе к GitHub из-за ограничений китайского сегмента интернета. В этом случае рекомендуется скачать или клонировать проект и прочитать файл «docs/中文说明文档.pdf».
Это совместимый слой для операционной системы RT-Thread, который позволяет легко переносить проекты, основанные на μC/OS-III от американской компании Micrium, на RT-Thread. При разработке и написании слоя учитывались особенности оригинальной версии μC/OS-III. Проект полностью написан на языке C.
Поддержка версий: μC/OS-III 3.00–3.08.
Видеообзор и обучающий курс: https://www.bilibili.com/video/BV1b54y1U7AG.
Он подойдёт тем, кто хочет перейти с μC/OS-III на RT-Thread и имеет опыт работы с μC/OS-III: слой поможет быстро перенести проект на RT-Thread с минимальными затратами времени и усилий. Также он может быть полезен для переноса старых проектов на RT-Thread или для разработки новых продуктов на этой платформе, если у разработчиков есть опыт работы с μC/OS. Слой помогает избежать ошибок, связанных с переходом с одной операционной системы на другую.
Например, он учитывает следующие различия между μC/OS-III и RT-Thread:
Слой также обеспечивает совместимость с программным обеспечением μC/Probe от Micrium, которое позволяет просматривать и отлаживать информацию о RT-Thread и μC/OS-III через графический интерфейс.
Компонент | Версия | Конфигурационный файл | Описание |
---|---|---|---|
RT-Thread nano | 3.1.3 | rtconfig.h | |
μC/OS-III | 3.03.00 | os_cfg_app.h, os_cfg.h, os_app_hooks.c | Совместимый слой совместим со всеми версиями μC/OS-III 3.00.00-3.08.00 |
μC/CPU | 1.30.00 | cpu_cfg.h | Частично обновлён до последней версии, совместим со всем программным обеспечением Micrium |
μC/LIB | 1.39.00 | lib_cfg.h | Последняя версия |
RT-Thread: https://www.rt-thread.org/.
Документация: https://www.rt-thread.org/document/site/tutorial/nano/an0038-nano-introduction/.
μCOS-III: https://www.micrium.com/.
Документация: https://doc.micrium.com/display/kernel304/uC-OS-III+Documentation+Home.
Проект основан на платформе 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, вы можете сразу перейти к разделу «6 Env инструмент автоматизации конфигурации в проекте»).
μCOS-III предоставляет только хуки для μCOS-III-совместимого слоя. Например, если вы зарегистрировали функцию OSTaskDelHook, она будет вызываться только при вызове функции OSTaskDel, но не при вызове rtt_thread_detach (этот хук обрабатывается хуками RTT). Это сделано для того, чтобы слои μCOS-III и RTT были чётко разделены и μCOS-III не вмешивался во внутренние транзакции RTT.
Хуки μCOS-III реализованы в двух файлах: os_cpu_c.c и os_app_hooks.c. В соответствии с концепцией μCOS-III, файл os_cpu_c.c предоставляет исходные хуки функций (то есть эти хуки вызываются соответствующими функциями напрямую), этот файл и его внутренние хуки написаны инженерами по миграции и не должны изменяться прикладными инженерами. Файл os_cpu_c.c также предоставляет соответствующие указатели функций для регистрации и использования хуков в файле os_app_hooks.c, который может быть изменён прикладными инженерами. Другими словами, мы можем размещать в файле os_app_hooks.c только те функции, которые необходимо вызывать из хуков.
Следующие оригинальные хуки μCOS-III будут отменены и переданы RT-Thread:
void OSTaskReturnHook (OS_TCB *p_tcb);
void OSTaskSwHook (void);
void OSTimeTickHook (void);
Соответствующие прикладные хуки также будут отменены:
void App_OS_TaskReturnHook (OS_TCB *p_tcb);
void App_OS_TaskSwHook (void);
void App_OS_TimeTickHook (void);
3.3 Статистика задач (OS_StatTask(), os_stat.c)
В μCOS-III статистика задач является системной задачей, которая может выполнять некоторые статистические операции во время работы системы, такие как подсчёт общего использования ЦП (0,00% - 100,00%), использование ЦП каждой задачи (0,00% - 100,00%) и использование стека каждой задачи. Использование ЦП представлено целым числом от 0 до 10 000 (соответствует 0,00–100,00%).
RT-Thread не имеет статистики задач, поэтому необходимо создать задачу для совместимости со статистикой задач оригинальной версии μCOS-III. Эта задача будет автоматически создана при инициализации совместимого слоя, и пользователю не нужно вмешиваться. Пользователю нужно только вызвать глобальную переменную OSStatTaskCPUUsage, чтобы получить текущее использование ЦП, а стратегия расчёта использования ЦП такая же, как и в оригинальной версии μCOS-III.
Текущие функции реализации статистики задач:
OS_CFG_DBG_EN
и OS_CFG_STAT_TASK_STK_CHK_EN
равны 1).Обратите внимание, что после включения статистики задач настоятельно рекомендуется не использовать её другими задачами, и приоритет статистики задач всегда равен OS_CFG_PRIO_MAX-2u
.
3.4 Блоки управления задачами и блоки управления внутренними объектами (структуры)
Этот совместимый слой максимально совместим с блоками управления задачами и внутренними объектами (структурами), чтобы обеспечить прямую работу перенесённых старых программ без изменений (хотя прямое обращение к членам структуры не рекомендуется μCOS-III).
Например, члены структуры OS_TCB включают большинство членов оригинальной версии. Если вам не нужны совместимые члены оригинальной версии, вы можете определить макрос PKG_USING_UCOSIII_WRAPPER_TINY, и структура OS_TCB будет значительно сокращена. Вы также можете отключить OS_CFG_TASK_SEM_EN
, OS_CFG_TASK_Q_EN
и OS_CFG_TASK_REG_TBL_SIZE
, чтобы дополнительно сократить объём кода. 3.5 Глобальные переменные
В настоящее время этот уровень совместимости может использовать следующие глобальные переменные μCOS-III (расположены в файле os.h
). Для получения конкретной информации о значении этих глобальных переменных, пожалуйста, обратитесь к разделу 2.2 «Шаги миграции», где перечислены справочные материалы.
#define OSSchedLockNestingCtr rt_critical_level() /* Уровень вложенности блокировки */
#define OSIntNestingCtr rt_interrupt_get_nest() /* Уровень вложенности прерывания */
#define OSTCBCurPtr ((OS_TCB*)rt_thread_self()) /* Указатель на текущий запущенный TCB */
/* ПРИОРИТЕТЫ ------------------------------- */
#define OSPrioCur rt_current_priority /* Приоритет текущей задачи */
#define OSPrioTbl rt_thread_priority_table
#if OS_CFG_APP_HOOKS_EN > 0u
OS_EXT OS_APP_HOOK_TCB OS_AppTaskCreateHookPtr; /* Перехватчики приложений */
OS_EXT OS_APP_HOOK_TCB OS_AppTaskDelHookPtr;
OS_EXT OS_APP_HOOK_VOID OS_AppIdleTaskHookPtr;
OS_EXT OS_APP_HOCK_VOID OS_AppStatTaskHookPtr;
#endif
OS_EXT OS_STATE OSRunning; /* Флаг, указывающий, что ядро работает */
OS_EXT OS_STATE OSInitialized; /* Флаг, указывающий на инициализацию ядра */
#ifdef OS_SAFETY_CRITICAL_IEC61508
OS_EXT CPU_BOOLEAN OSSafetyCriticalStartFlag; /* Флаг, указывающий, что все инициализировано */
#endif
/* СЕМАФОРЫ ------------------------------- */
#if OS_CFG_SEM_EN > 0u
#ifndef PKG_USING_UCOSIII_WRAPPER_TINY
#if OS_CFG_DBG_EN > 0u
OS_EXT OS_SEM *OSSemDbgListPtr;
#endif
OS_EXT OS_OBJ_QTY OSSemQty; /* Количество созданных семафоров */
#endif
#endif
/* ОЧЕРЕДИ ----------------------------------- */
#if OS_CFG_Q_EN > 0u
#ifndef PKG_USING_UCOSIII_WRAPPER_TINY
#if OS_CFG_DBG_EN > 0u
OS_EXT OS_Q *OSQDbgListPtr;
#endif
OS_EXT OS_OBJ_QTY OSQQty; /* Количество созданных очередей сообщений */
#endif
#endif
``` **Управление мьютексами**
/* MUTEX MANAGEMENT ------------------------- */
#if OS_CFG_MUTEX_EN > 0u
#ifndef PKG_USING_UCOSIII_WRAPPER_TINY
#if OS_CFG_DBG_EN > 0u
OS_EXT OS_MUTEX *OSMutexDbgListPtr;
#endif
OS_EXT OS_OBJ_QTY OSMutexQty; /* Number of mutexes created */
#endif
#endif
**Флаги**
/* FLAGS ------------------------------------ */
#if OS_CFG_FLAG_EN > 0u
#ifndef PKG_USING_UCOSIII_WRAPPER_TINY
#if OS_CFG_DBG_EN > 0u
OS_EXT OS_FLAG_GRP *OSFlagDbgListPtr;
#endif
OS_EXT OS_OBJ_QTY OSFlagQty;
#endif
#endif
**Управление памятью**
/* MEMORY MANAGEMENT ------------------------ */
#if OS_CFG_MEM_EN > 0u
#if OS_CFG_DBG_EN > 0u
OS_EXT OS_MEM *OSMemDbgListPtr;
#endif
OS_EXT OS_OBJ_QTY OSMemQty; /* Number of memory partitions created */
#endif
**Задачи**
/* TASKS ------------------------------------ */
#ifndef PKG_USING_UCOSIII_WRAPPER_TINY
#if OS_CFG_DBG_EN > 0u
OS_EXT OS_TCB *OSTaskDbgListPtr;
#endif
OS_EXT OS_OBJ_QTY OSTaskQty; /* Number of tasks created */
#endif
#if OS_CFG_TASK_REG_TBL_SIZE > 0u
OS_EXT OS_REG_ID OSTaskRegNextAvailID; /* Next available Task Register ID */
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
OS_EXT OS_TICK OSSchedRoundRobinDfltTimeQuanta;
OS_EXT CPU_BOOLEAN OSSchedRoundRobinEn; /* Enable/Disable round-robin scheduling */
#endif
#if OS_CFG_STAT_TASK_EN > 0u
/* IDLE TASK -------------------------------- */
OS_EXT OS_IDLE_CTR OSIdleTaskCtr;
/* STATISTICS ------------------------------- */
OS_EXT CPU_BOOLEAN OSStatResetFlag; /* Force the reset of the computed statistics */
OS_EXT OS_CPU_USAGE OSStatTaskCPUUsage; /* CPU Usage in % */
OS_EXT OS_CPU_USAGE OSStatTaskCPUUsageMax; /* CPU Usage in % (Peak) */
OS_EXT OS_TICK OSStatTaskCtr;
OS_EXT OS_TICK OSStatTaskCtrMax;
OS_EXT OS_TICK OSStatTaskCtrRun;
OS_EXT CPU_BOOLEAN OSStatTaskRdy;
OS_EXT OS_TCB OSStatTaskTCB;
#endif
#if OS_CFG_TMR_EN > 0u /* TIMERS ----------------------------------- */
#ifndef PKG_USING_UCOSIII_WRAPPER_TINY
#if OS_CFG_DBG_EN > 0u
OS_EXT OS_TMR *OSTmrDbgListPtr;
#endif
OS_EXT OS_OBJ_QTY OSTmrQty; /* Number of timers created */
#endif
#endif
*Примечание: в запросе представлен текст, не относящийся к сфере IT.* ## 4.2 Загрузка
Поскольку официальный сервер развёрнут в США, доступ к нему из материкового Китая очень медленный, для скачивания необходимо зарегистрироваться, и программное обеспечение размещено на зарубежном Dropbox, в Китае оно недоступно. Поэтому я уже помог вам скачать и упорядочить его, чтобы оно соответствовало последней версии официального сайта.
### 4.2.1 Baidu Cloud
Обновление может привести к тому, что текущий Baidu Cloud Link станет недействительным, этот Baidu Cloud Link будет обновляться постоянно (если вы обнаружите, что ссылка недействительна, пожалуйста, сообщите мне через issue):
> Ссылка: https://pan.baidu.com/s/1WarXJcl0cf0sXfougtJ5bg
> Код извлечения: 0000
### 4.2.2 Tencent Weiyun
Обновление может привести к тому, что текущая микрооблачная ссылка станет недействительной, эта микрооблачная ссылка будет постоянно обновляться (если вы обнаружите, что ссылка недействительна, пожалуйста, сообщите мне через issue):
> Ссылка: https://share.weiyun.com/BSBqVvO5
## 4.3 Использование
Этот совместимый слой уже реализовал стыковку с μC/Probe, хотя он не может отображать всю информацию о ядре так же, как оригинальная версия μCOS-III, но большинство информации и вся ключевая информация ядра уже реализованы для стыковки с μC/Probe. В то же время пользователи могут использовать этот совместимый слой для прямого отображения и отладки информации о RT-Thread и данных через μC/Probe.**Если возникнут какие-либо странные проблемы, пожалуйста, запустите это программное обеспечение с правами администратора!**
**В настоящее время можно просматривать следующие задачи и информацию об объектах ядра.**
### 4.3.1 Доступные элементы вкладки «Task(s)»
| Доступные элементы | Описание |
| :---------------------: | :----------------------------------------------------------: |
| Item | Индекс списка |
| Name | Имя задачи |
| Prio | Задача приоритета |
| State | Задача состояния<br /> Ready задача готова<br /> Pend задача ожидает объект ядра <br /> Suspend задача приостановлена <br /> Delay задача задерживается |
| Pending On Object | Если задача находится в состоянии Pend ожидания объекта ядра, отображается тип ожидающего объекта ядра |
| Pending On | Если задача находится в состоянии Pend ожидания объекта ядра, отображается имя ожидающего объекта ядра |
| #Used | Максимальное использование стека задач |
| #Free | Минимальное оставшееся пространство стека задач |
| Size | Начальный размер распределения стека задач |
| Stack Usage | Использование стека |
| Name | Имя статического массива стека |
| SP | Указатель стека / базовый адрес стека |
### 4.3.2 Доступные элементы вкладки Semaphore(s)
| Доступные элементы | Описание |
| :-------------------------: | :--------------------------------------: |
| Item | Индекс списка |
| Name | Имя семафора |
| Counter | Количество семафоров |
| High Priority Task Waiting | В списке задач с наивысшим приоритетом, ожидающих этот семафор, указано имя задачи |
### 4.3.3 Доступные элементы вкладки Mutex(s)
| Доступные элементы | Описание |
| :-------------------------: | :--------------------------------------: |
| Item | Индекс списка |
| Name | Название мьютекса |
| Nesting Counter | Глубина рекурсивного вызова мьютекса |
| Owner Original Prio | Приоритет задачи, владеющей этим мьютексом |
| High Priority Task Waiting | В списке задач с наивысшим приоритетом, ожидающих этот мьютекс, указано имя задачи |
### 4.3.4 Доступные элементы вкладки Event Flag(s)
| Доступные элементы | Описание |
| :-------------------------: | :------------------------------------------: |
| Item | Индекс списка |
| Name | Название группы флагов событий |
| Flags | События |
| High Priority Task Waiting | В списке задач с наивысшим приоритетом, ожидающих эту группу флагов событий, указано имя задачи |
### 4.3.5 Доступные элементы вкладки Queue(s)
| Доступные элементы | Описание |
| :-------------------------: | :------------------------------------------: |
| Item | Индекс списка |
| Name | Имя очереди сообщений |
| High Priority Task Waiting | В списке задач с наивысшим приоритетом, ожидающих эту очередь сообщений, указано имя задачи |
### 4.3.6 Доступные элементы вкладки Timers
| Доступные элементы | Описание |
| :-------------------------: | :--------------------: |
| Item | Индекс списка |
| Name | Название таймера |
| Mode | Режим таймера |
| State | Состояние таймера |
| Time Remain | Оставшееся время таймера |
| Start Delay | Начальная задержка |
| Period | Период задержки таймера |
| Callback Function Pointer | Адрес функции обратного вызова таймера |
| Callback Function Argument | Адрес параметра функции обратного вызова таймера |
### 4.3.7 Доступные элементы вкладки Tick Lists
Нет доступных элементов.
### 4.3.8 Memory
*Перевод выполнен автоматически. Если у вас есть вопросы или уточнения, пожалуйста, задайте их.* Открытое программное обеспечение. Подробности см. в содержании файла LICENSE в проекте.
## 8.5 Поддержка
Если вам нравится этот проект, **можете поставить «звёздочку» в правом верхнем углу этой страницы**. Это будет стоить вам 50 копеек. Я буду польщён и вдохновлён продолжать поддерживать этот проект.
<img src="docs/pic/donate.png" style="zoom: 67%;" />
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.