单片机操作系统RTX51原理分析与移植
等于是程序和操作系统编译在一起了。该配置文件能在安装目的rtxtiny2底下找到。文件名称为Conf_tny.A51,例如,在我的电脑中,路径为:D:\Keil\单片机c语言\RtxTiny2\SourceCode\ Conf_tny.A51。如下图所示:
由于试验箱里面的芯片是AT
四.源程序代码:
源程序代码如下,说明请看代码里面的注释。
/*
** RTX-51的移植
** 移植到AT89S52
** 此程序是循环花样显示LED灯
** 有三个显示样式,分别对应下面的三个进程
** 下面的算法中用到了“时间到空间”的转换,使得算法简化不少
** 此程序我已在最小系统板上试验通过。
*/
#include reg51.h>
#include rtx51tny.h>
const unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0xFF,0x00};
/*时间到空间的转换,如果table是:
const unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
则算法和代码会多出一倍来。table数组虽然增加了一倍,算法也随之减少了一半,
好处当然不止在这里体现,下面的进程2也减少了一半*/
//进程0 左->右->左
void LED0 (void) _task_ 0
{
int i;
os_create_task(1);//创建进程1
os_create_task(2);//创建进程2
while(1)
{
for (i = 0; i 15; i++)
{
P1 = table[i];
os_wait(K_TMO,30,0);//等待30*10000微妙 = 0.3秒
}
os_send_signal(1); //发送Signal信号,激活进程1
os_wait(K_SIG,0,0); //等待信号
}
}
//进程1 全亮->全灭->全亮
void LED1 (void) _task_ 1
{
int i;
while(1)
{
os_wait(K_SIG,0,0);
for (i = 0; i 3; i++)
{
P1 = table[15]; //全亮
os_wait(K_TMO,30,0);
P1 = table[16]; //全灭
os_wait(K_TMO,30,0);
}
os_send_signal(2);
}
}
//进程2 两边->中间中间->两边
void LED2 (void) _task_ 2
{
int i;
while(1)
{
os_wait(K_SIG,0,0);
for (i = 0; i 8; i++)
{
P1 = table[i] | table[i+7]; //由于table长度多一倍,省去了一个循环,而且算法也简化了。
os_wait(K_TMO,30,0);
}
os_send_signal(0);
}
}
五.总结:
本试验用的RTX 的Tiny 版本。许多比较高级的功能没有去实现。目的主要是理解RTX的原理,然后移植它到某个单片机上面,编写个小程序来测试一下。通过阅读RTX附带的英文文档,我对此操作系统有了深刻的认识,感到此操作系统有很多优点,也有很多不足的地方。比如支持的任务较少,不过由于是单片机,“承受”能力也有限,也能理解。总的来说,对于单片机来说是个不错的操作系统。
六.参考文档:
[1]《RTX-51 官方英文文档》(包括FULL版,和Tiny版)
[2]《Keil Software –Cx51 编译器用户手册》中文版
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)