原创 R8C/1B学习板之uC/OS-II移植详解

2011-3-7 09:42 2026 4 4 分类: MCU/ 嵌入式
来源:瑞萨单片机论坛

都说在8051上都可以跑UCOS,那么在瑞萨R8C这种小资源的MCU上能否跑RTOS呢?R8C/1B的ROM为16KB,RAM为1KB。下面我们来尝试一下吧。 

笔者曾经将uC/OS-II移植到M16C上。那么在本次移植开始之前,建议读者们先阅读笔者以前写的一篇相关文章。 
《 uC/OS-II在R8C/M16C上的移植详解 》 


硬件准备: 
瑞萨R8C/1B学习板一块。当然是本论坛推出的板子,在此感谢renesas! O(∩_∩)O~ 
E8仿真器。当然朋友们可以用串口调试,偶手上有E8,不用白不用哈! 
5V直流电源。R8C/1B学习板的电源为5~9V,要注意! 

软件准备: 
HEW (R8C/Tiny toolchain 5.43版) 
uC/OS-II 2.51源代码。如果你没有源码,在网上随便一搜一大堆,这就是开源的好处。 


OK!都准备好了。磨拳擦掌开始干活了! 


一。新建一个R8C/1B的汇编工程,并确保你的板子能连上电脑调试。 

至于怎么建工程,论坛里有相关教材,在此不废话了哈。 
顺便提下使用汇编工程的好处是,没有了编译的屏蔽,代码都是一目了然的。所以依赖C语言的朋友们,要好好学学汇编哦。 
调试时,使用E8/E8a, FoUSB均可。论坛里已经有相关教材啦。 


二。加入uC/OS-II源码到工程中,并设置路径。由于我的OS源码是直接放在HEW工程目录之下的,所以需要在HEW里设置OS的源码路径,确保在编译的时候,编译器能找到代码。 

设置路径如下: 
Build --> Renesas M16C Standard Toolchain 下,选择Add, 找到Workspace directory。 
在Sub-Directory里填上你的源码在当前HEW工程里的路径。比如我的源码放在当前工程的/OS目录下,那么我就填上OS即可。如图所示: 

R8C/1B学习板之uC/OS-II移植详解 - 瑞沙 - 瑞萨产品世界
 


三。配置R8C/1B上的BSP(板级支持包) 

所谓BSP,就是OS启动之前的一段代码。不同的OS,就有不同的BSP,类似于Bootloader功能。 

ucos将使用R8C/1B的如下资源: 
定时器Z(用于OS系统时钟) 
向量号为24的软中断(用于任务切换) 
定时器Z每隔20ms产生一个中断,那么UCOS的时钟频率为1000/20 = 50HZ 

UCOS的任务切换,笔者这里使用了向量号为24的软中断。因为根据R8C/1B的数据手册,向量号24被保留,我们可以放心的使用它,嘿嘿。 

关于UCOS在R8C/1B上的移植代码,本文开始提到的那篇文章写的很详细,或者可以下载本文最后提供的源码来参考。


四。UCOS裁剪。 

到此为止,我们开始编译了。在排除了一些编译器报错或者警告之后,代码就没有语法错误了。 
但是又出现一个令人头疼的问题,发现RAM占用了1600多字节,已经超过了R8C/1B的1KB的空间。 

怎么办? 

我们只能裁剪UCOS的一些功能,以减少RAM使用率。 
在os_cfg.h里面,定义了UCOS使用的资源,于是笔者在里面狂改: 
将占用RAM的事件控制块ECB,信号量,邮箱,消息队列,最大内存块,最大任务数和空闲栈大小,一一做了修改。如下所示。 

#define OS_MAX_EVENTS            10    /* Max. number of event control blocks in your application ... */ 
                                       /* ... MUST be > 0                                              */ 
#define OS_MAX_FLAGS              5    /* Max. number of Event Flag Groups    in your application ... */ 
                                       /* ... MUST be > 0                                              */ 
#define OS_MAX_MEM_PART           5    /* Max. number of memory partitions ...                         */ 
                                       /* ... MUST be > 0                                              */ 
#define OS_MAX_QS                5    /* Max. number of queue control blocks in your application ... */ 
                                       /* ... MUST be > 0                                              */ 
#define OS_MAX_TASKS             5    /* Max. number of tasks in your application ...                 */ 
                                       /* ... MUST be >= 2                                             */ 
#define OS_LOWEST_PRIO           63    /* Defines the lowest priority that can be assigned ...         */ 
                                       /* ... MUST NEVER be higher than 63!                            */ 
#define OS_TASK_IDLE_STK_SIZE   30    /* Idle task stack size (# of OS_STK wide entries)              */ 
再次编译后,RAM就减少到600多字节了。 


五。移植验证。 
笔者只跑了一个任务来验证本次移植是否成功。该任务功能是每隔一个时钟节拍让R8C/1B学习板上的P1_6对应的LED闪烁一次。 
经实践本次移植完全成功!! 



后记: 
对于瑞萨R8C/1B单片机来说,跑RTOS实际意义不大,它的资源太少了。但是作为没有接触过RTOS的人来说,这实在是性价比最高的入门级教材。呵呵。有兴趣的朋友可以实践一下。 
引用uC/OS作者Jean J. Labrosse的一句话,一旦读者用RTOS做过项目,将绝不再想返回到前后台系统。

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条