记得使用51还是大学时候的事了,当时只知道能在51上移植uc-os,主要原因也是不知道51上能使用什么RTOS,后来看到有人开始在51上移植uc-os,自己也就搞了本书开始研究uc-os,不过可惜,移植了将近一星期,也没移植成功,后来就放弃了!
最近由于项目需要,要使用51内核的MCU,不过这次需要给51加入RTOS,以增加系统稳定性。通过我们公司的老工程师才知道原来KEIL上早就已经集成了专用于51内核的RTOS,也就是这次的主题RTX51 Tiny。
首先说说关于RTX51 Tiny。RTX51分为Tiny版和Full版,两者都是不开源的。Tiny是免费版,Full是收费的。在功能上Full的功能比Tiny要强大很多。而KEIL中提供的就是Tiny版。不过对于51来说,Tiny版就应该够用了。其实之前在51上移植uc-os应该来说是一个不好的选择,51内核的资源有限,对于大型的RTOS可能运行起来还存在问题,不过自己也没试过。RTX51 Tiny是非常简化的RTOS,它没有什么信号量,也没有什么消息信箱等等,只具有几个简单的系统调度功能函数。它对任务的调度方式,也可由用户在其配置文件中进行设置,它的调度方式分为:1,时间片轮叫调度,即将每个任务分给CPU,CPU在这一规定时间片内对任务进行操作,以任务的ID号对任务进行轮叫运行。2.合作式调度,这种方式就是用户通过自定义的方式将时间片轮叫调度关闭了,RTOS调度任务的方式,只能通过用户进行手工的调度。RTX51最大支持16个任务,任务之间没有优先级。由于没有优先级,在轮叫调度方式下,如果当前任务发送了一个信号给它非相邻的任务,当这一任务执行完成后,它仍然会执行它的下一个相邻任务,而不会去执行发给其信号的任务,具体执行的情况,可以看我的例子。RTX51是使用Timer0作为RTOS的时间调度,所以用户在应用程序中就不要使用Timer0了,不然程序肯定无法运行。对于时间片的时间设定,RTX51使用了INT_CLOCK,TIMESHARING这两个宏,在使用过程中,我发现对于TIMESHARING好像不能设置的太大,不然对于任务的调度就混乱了,不过在KEIL相关的文档中也没有找到关于这个宏所能定义的最大值。还有由于RTX51-Tiny使用的是Timer0,在使用Timer0之前一定要设置好Timer0的时钟源和工作模式,默认情况下Timer0使用的是16-bit模式,所以如果用户在程序中还使用其它的定时器会涉及修改TMOD寄存器时不要采用直接赋值的方式,而应该采用Read-Modify-Write的方式,这样就不会改变默认TMOD位!!还有每个任务必须是while(1)结构,否则此任务就只会执行一次,并造成整个任务调度出错!!RTX51中时钟节拍不要设置的太小,因为时间中断会占用几百个指令周期。RTX51中只具有如下的系统服务:
isr_send_signal
isr_set_ready
os_clear_signal
os_create_task
os_delete_task
os_reset_interval
os_running_task_id
os_send_signal
os_set_ready
os_switch_task
os_wait
os_wait1
os_wait2
对于RTX51的相关资料文档,在KEIL中已经阐述的非常详细了,以后在使用过程中,在出现什么问题,再和大家分享,下面是我用KEIL和Protues仿真的一个实例。
用户1510498 2013-6-16 10:45