简介
RTX51 是keil公司开发的一款实时操作系统,其有两个版本:
1.Tiny 2.Full,区别如下:
- RTX51 Full :使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换 RTX51工作与中断功能相似的状态下 ,信号和信息可以通过邮箱系统在任务之间互相传递 ,你可以从一存储池中分配和释放内存 你可以强迫一个任务等待中断 超时或者是从另一个任务或中断发出的信号或信息。
- RTX51 Tiny:仅支持时间片轮转任务切换和使用信号进行任务切换 ,不支持抢先式的任务切换不包括消息历程, 没有存储器池分配程序。
总结来说,Tiny就是RTX51 Full的精简版,只有基本的任务切换功能。
使用方法
使用RTX51操作系统需要有以下要求:
1.keil C51 集成开发环境,其许可证版本必须为PK51,否则无法编译通过。
2. RTX51_Tiny需要占用 定时器0 、定时器0中断以及寄存器组0。用户程序不可再使用这些资源。
下面介绍STC15W系列单片机如何使用RTX51_Tiny操作系统:
1.首先将RTX51_Tiny的头文件和Lib库文件添加到工程,这两个文件在keil C51的安装目录下
把这两个文件拷贝到工程目录下,并在Keil中把这两个文件添加到工程。
2.keil配置选项里选择RTX51_Tiny操作系统
3.RTX51_Tiny 相关配置
由于RTX51_Tiny是基于时间片的操作系统,而且它没有优先级的概念,每个任务执行的时间是一定的,即当前任务的时间片达到时,会立即切换到其他就绪的任务,任务的时间片可以通过Conf_tny.A51文件的相关参数修改。
INT_CLOCK 是 RTX系统的1个滴答时钟的时间,此处定义为33177是指 1个系统滴答时钟=33177个单片机的机器周期,由于我的单片机时钟的33.1776Mhz,所以其一个机器周期为1/33.1776 ≈ 0.0301us,33177个机器周器就是 999.9us≈1ms。注意:此值最大为65536
TIMESHARING 是 一个时间片等于多少个RTX系统的滴答时钟,此处定义为10,即定义时间片为10ms。
实验例程:
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */
#include "reg51.h"
sbit LED=P2^7;
sbit a=P2^2;
sbit b=P2^3;
sbit c=P2^4;
sbit SET=P3^1;
sbit ADD=P3^0;
sbit SUB=P3^2;
bit key_mark,direction,sec;
char state,hour,minute,second,pos;
unsigned char buf[8]={0},zxm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void CS(unsigned char n)
{
c=n/4;
b=n%4/2;
a=n%2;
}
void Send(unsigned char n)
{
P0=n;
}
void key()
{
if(!SET)
{
if(++state>3)
state=0;
}
else if(!ADD)
{
if(state==1)
{
if(++hour>23)
hour=0;
}
else if(state==2)
{
if(++minute>59)
minute=0;
}
else if(state==3)
{
if(++second>59)
second=0;
}
}
else if(!SUB)
{
if(state==1)
{
if(--hour<0)
hour=23;
}
else if(state==2)
{
if(--minute<0)
minute=59;
}
else if(state==3)
{
if(--second<0)
second=59;
}
}
}
job0 () _task_ 0
{
os_create_task (1); /* start task 1 */
os_create_task (2); /* start task 2 */
os_create_task (3);
while(1)
{
if(++pos>5)
pos=0;
Send(0);
CS(pos);
if(pos==2||pos==4)
Send(zxm[buf[pos]] | 0x80);
else
Send(zxm[buf[pos]]);
os_wait(K_TMO,1,0);
}
}
job1 () _task_ 1
{
hour=12;
state=0;
while (1)
{
if(sec)
{
sec=0;
if(state==0)
{
if(++second>59)
{
second=0;
if(+++minute>59)
{
minute=0;
if(++hour>23)
hour=0;
}
}
}
buf[0]=second%10;
buf[1]=second/10;
buf[2]=minute%10;
buf[3]=minute/10;
buf[4]=hour%10;
buf[5]=hour/10;
}
}
}
job2 () _task_ 2
{
while (1)
{
if((!SET || !ADD || !SUB) && !key_mark)
{
os_wait(K_TMO,10,0);
if(!SET || !ADD || !SUB)
{
key_mark=1;
key();
}
}
else if(SET && ADD && SUB)
key_mark=0;
}
}
job3() _task_ 3
{
int n=0;
while(1)
{
if(++n==300)
{
n=0;
sec=1;
LED=~LED;
}
os_wait(K_TMO,1,0);
}
}