1 概述

这是一个针对RT-Thread国产操作系统的μCOS-II操作系统兼容层,可以让基于美国Micriμm公司的μCOS-II操作系统的项目快速、无感地迁移到RT-Thread操作系统上。在兼容层的设计、编写上尊重原版μC/OS-II,保证原版μC/OS-II的原汁原味。
uCOS-II兼容层的设计和编写融合了uCOS-III兼容层的编写经验,同时与uCOS-III兼容层进行交叉检查,确保两个兼容层的可靠性。
支持版本:μC/OS-II 2.00-2.93全部版本
代码仓库地址:
https://github.com/mysterywolf/RT-Thread-wrapper-of-uCOS-II
欢迎star!
1.1 RT-Thread的其他RTOS兼容层
RT-Thread操作系统的μCOS-III兼容层:https://github.com/mysterywolf/RT-Thread-wrapper-of-uCOS-III
1.2 本兼容层适合于
之前学习过μCOS-II操作系统,意图转向学习RT-Thread国产操作系统。本兼容层可以帮您用已有的μCOS-II编程经验和习惯快速将项目跑起来,日后在应用过程中深入熟悉RT-Thread的API函数,逐步向RT-Thread过度,降低您的学习门槛和时间成本。有了本兼容层,对RT-Thread API以及编程风格的不熟悉再也不是您学习RT-Thread的阻力!
现有任务(线程)模块采用μCOS-II编写,想要用在基于RT-Thread的工程上
老项目需要从μCOS-II操作系统向RT-Thread操作系统迁移
当需要快速基于RT-Thread开发产品,但是工程师之前均采用μC/OS开发,从未用过RT-Thread的开发经验。本兼容层可以帮助让工程师快速基于μC/OS-II开发经验开发产品,简化软件的重用、缩短微控制器新开发人员的学习过程,并缩短新设备的上市时间。
避免在从μCOS-II迁移到RT-Thread时,由于μCOS-II的编程经验导致的思维定式引发的错误,这种错误一般很难被发现
例如:
软件定时器参数的不同
任务堆栈的数据类型不同
1.3 版本详细信息

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支持包.
注意:调试串口使用的是USART2,不是USART1

2.2 迁移步骤
(如果使用的是RT-Thread Nano版请参见以下步骤;若使用RT-Thread完整版可以直接跳转至Env工具自动化配置到工程中章节)
将uCOS-II文件夹内的所有文件都加入到你的工程中,最好保持原有文件夹的结构。相较于原版μCOS-II增加了
os_rtwrap.c文件,负责对RT-Thread和μCOS-II的转换提供支持。配置
os_cfg.h
每个选项的配置说明和原版μCOS-II一致,若有不同,我已经在注释中有所解释。
原版μCOS-II配置说明可参见:
a)《嵌入式实时操作系统μC/OS-II(第二版)》北京航空航天大学出版社 邵贝贝等译
b) Micriμm公司μCOS-II在线文档μCOS-II原版定时器回调函数是在定时器线程中调用的,而非在中断中调用,因此要使用μCOS-II兼容层的软件定时器,需要将rtconfig.h中的宏定义
RT_USING_TIMER_SOFT置1。由于兼容层采用rt-thread内核自带的堆内存分配方式,因此免去了原版uCOS-II中配置任务以及各内核对象内存池大小的步骤,遂需要在rtconfig.h中定义
RT_USING_MEMHEAP
2.3 os_cfg.h配置文件
1#define OS_TMR_CFG_TICKS_PER_SEC 10u /* Rate at which timer management task runs (Hz) */
在原版μCOS-II中,该宏定义定义了软件定时器的时基信号,这与RT-Thread的软件定时器有本质的不同,在RT-Thread中,软件定时器的时基信号就等于OS Ticks。因此为了能够将μCOS-II软件定时器时间参数转为RT-Thread软件定时器的时间参数,需要用到该宏定义。请使该宏定义与原工程使用μCOS-II时的该宏定义参数一致。需要注意的是,虽然在兼容层中定义了软件定时器的时基频率,但是在兼容层内部使用的RT-Thread软件定时器的时基频率等同于OS Ticks,因此OS_TMR结构体的.OSTmrMatch成员变量其保存的数值是以OS Ticks频率来计算的。
由于兼容层采用rt-thread内核自带的堆内存分配方式,因此免去了原版uCOS-II中配置任务以及各内核对象内存池大小的步骤,遂相关宏定义在兼容层中均被删除。
2.4 运行
2.4.1 手动初始化流程
本兼容层完全兼容官方给出的标准初始化流程,如果您兼容老项目,μCOS-II初始化部分无需做任何修改。
2.4.2 自动初始化流程
如果您在应用层中不想手动初始化本兼容层,可以在rtconfig.h文件中定义PKG_USING_UCOSII_WRAPPER_AUTOINIT宏定义。请参见 [4.2.1章节](#4.2.1 Enable uCOS-II wrapper automatically init)(如无特殊要求,建议采用该种方式)。
2.5 注意
1、μCOS-II的任务堆栈大小单位是sizeof(CPU_STK),而RT-Thread的线程堆栈大小单位是sizeof(rt_uint8_t),虽然在兼容层已经做了转换,但是在填写时一定要注意,所有涉及到μCOS-II的API、宏定义全部是按照μCOS-II的标准,即堆栈大小为sizeof(CPU_STK),切勿混搭!这种错误极其隐晦,一定要注意!下面是混搭的错误示例:
1ALIGN(RT_ALIGN_SIZE)
2static rt_uint8_t thread2_stack[1024];//错误:混搭RT-Thread的数据类型定义线程堆栈
3
4OSTaskCreateExt(task,
5 0,
6 &task_stack[TASK_SIZE-1],
7 TASK_PRIO,
8 0,
9 &task_stack[0],
10 sizeof(thread2_stack),//任务堆栈大小(错误:这个参数的单位是sizeof(CPU_STK))
11 0,
12 OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
下面是正确写法:
1#define THREAD_STACK_SIZE 256 //正确,要通过宏定义单独定义堆栈大小,单位为sizeof(CPU_STK)
2ALIGN(RT_ALIGN_SIZE)
3 static CPU_STK thread2_stack[THREAD_STACK_SIZE];//正确,使用uCOS-II自己的数据类型定义任务堆栈
4
5OSTaskCreateExt(task,
6 0,
7 &task_stack[TASK_SIZE

这篇博客介绍了如何使用μC/OS-II兼容层无缝迁移到RT-Thread操作系统,让基于μC/OS-II的项目在RT-Thread上快速运行。该兼容层支持μC/OS-II 2.00-2.93版本,允许开发者利用原有的μC/OS-II经验进行RT-Thread开发。文章详细阐述了兼容层的使用、迁移步骤、接口说明和自动化配置,旨在帮助开发者降低学习和迁移成本。
最低0.47元/天 解锁文章
3269

被折叠的 条评论
为什么被折叠?



