都说在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上的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条评论)
登录后参与讨论