rtx51tiny操作系统随记
博主昨天才注册,特此写上一篇介绍rtx51tiny操作系统的基本知识,希望广大的电子爱好者指正!
一直以来听人家说,在51系列单片机上移植一个操作系统,可以使复杂的任务简单化!于是这几天就恶补了下rtx51tiny(对于rtx51full就不做研究,毕竟51内存太小)的知识。
特点:它是一个实时多任务操作系统。何谓同时实施多任务操作,其实在该系统中,它会为每个任务分配一个时间片,某个任务就在特定的时间片内执行,切换到另外的任务也需要在规定的时间片内完成,由于时间片是很短的,所以看起来就像是多任务同时进行。
下面我们就可以从一个简单的程序来分析:
#include<rtx51tny.h>
int counter0;
void jobo(void) _task_ 0
{
os_create_task(1);
while(1)
counter0++;
}
在上面的程序中,os_create_task()这个函数就属于rtx51tiny系统的库函数,它是用来启动任务的,在该系统的有很多类似于这样的函数,下面来简单的介绍一下:
os_create_task(); //任务启动函数
os_delete_task(); //任务终止函数
os_wait (K_TM0,n); //延时函数,n表示延时的时钟节拍
os_send_signal(n); //发送信号函数,可以用于启动其他的任务
上面几个函数就是我们常用库函数,通过上面的几个函数我们可以完成任务的启动,终止与下个一任务的启动。
使用该系统需要注意的地方:
1.默认情况下,系统的任务都是从0开始执行,没有所谓的优先级,但是我们可以通过关键字来设置优先级,如:job1(void) _task_ 1 _priority_ 1,这样可以设置任务1为1的优先级,比0高,所以先执行,在该系统中分0-3这4个优先级;
2.软件要求:我们平常用的keil c51就符合,它的编译环境里集成了我们需要的软件;
3.无需再在程序编写主函数,在操作系统中已经存在main()函数了;
4.定时器0已经被使用,故不允许在程序中禁止定时器0中断;
5.rtx51tiny是并行地执行多任务操作,这些任务都是无穷循环。
下面就简单的贴一段交通信号灯程序:
#include<rtx51tny.h>
#include<reg52.h>
#define init 0 //任务0为初始化
#define state 1 //任务1进行按键检测
#define sn_normal 2 //正常模式下南北向灯的状况
#define ew_normal 3 //正常情况下东西向灯的状况
#define blinking 4 //夜间模式
#define throu 5 //意外情况
void init()_task_ init
{
//关闭所有的灯
os_create_task (state); //启动任务一
os_delete_task (init); //关闭任务0
}
void state()_task_ state //进行按键检测,得出交通状况
{
while(!button1)
{
os_create_task (sn_normal);
os_create_task (ew_normal);
os_delete_task (blinking);
os_delete_task (throu);
}
while(!button2)
{
os_create_task (blinking);
os_delete_task (sn_normal);
os_delete_task (ew_normal);
os_delete_task (throu);
}
while(!button3)
{
os_create_task(throu);
os_delete_task(sn_normal);
os_delete_task(ew_normal);
os_delete_task(blinking);
}
}
void sn()_task_sn_normal //南北方向交通灯控制
{
while(1)
{
sn_blue=1;sn_yellow=0;sn_red=0; //先是绿灯亮,其余灯灭
DelayX10ms(500); //延时5s,查看
for(i=0;i<5;i++) //黄灯闪烁5次
{
sn_yellow=1;sn_red=0;sn_blue=0;
DelayX10ms(10); //亮1s
sn_yellow=0;sn_red=0;sn_blue=0;
DelayX10ms(10); //灭1s
}
if(i>=5)
{
i=0;
}
sn_blue=0;sn_yellow=0;sn_red=1;//红灯亮
DelayX10ms(1000); //延时10秒
}
}
void ew()_task_ew_normal //东西方向交通灯控制
{
while(1)
{
ew_blue=1;ew_yellow=0;ew_red=0; //先是绿灯亮,其余灯灭
DelayX10ms(500); //延时5s,查看
for(i=0;i<5;i++) //黄灯闪烁5次
{
ew_yellow=1;ew_red=0;ew_blue=0;
DelayX10ms(10); //亮1s
ew_yellow=0;ew_red=0;ew_blue=0;
DelayX10ms(10); //灭1s
}
if(i>=5)
{
i=0;
}
ew_blue=0;ew_yellow=0;ew_red=1;//红灯亮
DelayX10ms(1000); //延时10秒
}
}
void bl()_task_blinking //夜间黄灯无限的闪烁
{
while(1)
{
sn_yellow=1;sn_blue=0;sn_red=0;
ew_yellow=1;ew_blue=0;ew_red=0;
DelayX10ms(10); //黄灯闪一秒
sn_yellow=0;sn_blue=0;sn_red=0;
ew_yellow=0;ew_blue=0;ew_red=0;
DelayX10ms(10); //黄灯灭一秒
}
}
void th()_task_throu //意外情况
{
while(1)
{
sn_red=1;sn_yellow=0;sn_blue=0;
ew_red=1;ew_yellow=0;ew_blue=0;
}
}
浙公网安备 33010602011771号