RTX51是KEILC公司专为51系列单片机而出的嵌入式系统,目前有两个版本可供选择:
RTX51 tiny和RTX51两个版本。由于使用的人不是很多,相关的资料也十分的少。因此本人在调试时走了一点点弯路,由于之前自学了点UC/OS II嵌入式操作系统。学习
RTX51时感到十分的轻松。
此次上传一点关于
RTX51软件安装包和一点中文使用手册(想学好的话必须得看英文手册,安装好软件包后,英文手册在HLP目前下可找到)。
本此讲解的为
RTX51 TINY版,因为它适合于没有外展存储器的51芯片,其本身也就900个字节左右,非常的小巧,当然了功能方面也就相应缩水了!。但是,使用
RTX51 Tiny 的程序可以访问外部存储器。
RTX51 Tiny允许循环任务切换,并且支持信号传递,还能并行的利用中断功能。
RTX51 Tiny 的os_wait函数可以等待以下事件:时间到、时间间隔、来自任务或者中断的信号。压缩包中的中文手册讲解的非常的详细,也此就不再赘说了。下面举两个小例子:
事前准备:下载附件,解压。安装RTX 51软件包,(注KEIL C 版本必须是7.02版本以上)
实例1:(最好的例子是安装后程序处带的examples,我就是认真看了交通灯那个例子后才调通了下面的LED流水灯程序的)
#include <rtx51tny.H>
#include <REG51.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++)
{
P2 = 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++)
{
P2 = table[15]; //全亮
os_wait(K_TMO,30,0);
P2 = 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++)
{
P2 = table[i] | table[i+7]; //由于table长度多一倍,省去了一个循环,而且算法也简化了。
os_wait(K_TMO,30,0);
}
os_send_signal(0);//发送Signal信号,激活进程0
}
}
注:RTX 51 是从 _task_ 0开始运行程序的(程序中不能出现 main()函 数)。上述例子是使用RTX 51 的TINY版 编写的一个流水灯的程序。有详 细的注解,应该很容易看明白的。调入KEIL C中进行编译时千万不能忘了 选择相应的操作系统。如下图所示:
实例二:
#include "reg51.h"
#include "rtx51tny.h"
sbit led0 = P1^0;//定义一个LED测试灯0
sbit led1 = P1^1;//
定义一个LED测试灯1
/************************************************
//功能:任务0 创建任务1 和任务2,运行后便将自身删除。
************************************************/
void main_job() _task_ 0
{
os_create_task(1);//创建进程1
os_create_task(2);//创建进程2
os_delete_task(0);//将自身删除
}
/************************************************
//功能:控制LED0闪烁
************************************************/
void led0_job() _task_ 1
{
led0 = 1;//LED初始为不亮(对于共阳接法)
for (;;)
{
led0 = !led0;//LED0闪烁
os_wait(K_TMO,100,0);//延时0.3S
}
}
/************************************************
//功能:控制LED1闪烁
************************************************/
void led1_job() _task_ 2
{
led1 = 1;
//LED初始为不亮(对于共阳接法)
for (;;)
{
led1 = !led1;
//LED1闪烁
os_wait(K_TMO,150,0);
//延时0.3S
}
}
注:可能注意到了上面所有的任务中都是一个死循环。刚接触 的朋友可能不能理解,看一点操作系统相关知识很快就明白了。不 就是时间片轮转法吗!
对于RTX51就讲这么多了,希望用到的朋友好好学习,真的 很实用。特别是FULL版本,自带了CAN软件包,太方便 了……共享万岁!!