μC/OS-II兼容层——让基于μC/OS-II开发的应用层无感地迁移到RT-Thread操作系统

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

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. 软件定时器参数的不同

  2. 任务堆栈的数据类型不同

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工具自动化配置到工程中章节

  1. 将uCOS-II文件夹内的所有文件都加入到你的工程中,最好保持原有文件夹的结构。相较于原版μCOS-II增加了os_rtwrap.c文件,负责对RT-Thread和μCOS-II的转换提供支持。

  2. 配置os_cfg.h  
    每个选项的配置说明和原版μCOS-II一致,若有不同,我已经在注释中有所解释。 
    原版μCOS-II配置说明可参见: 
    a)《嵌入式实时操作系统μC/OS-II(第二版)》北京航空航天大学出版社 邵贝贝等译  
    b) Micriμm公司μCOS-II在线文档

  3. μCOS-II原版定时器回调函数是在定时器线程中调用的,而非在中断中调用,因此要使用μCOS-II兼容层的软件定时器,需要将rtconfig.h中的宏定义RT_USING_TIMER_SOFT置1。

  4. 由于兼容层采用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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值