/***************************************************
*作者:温子祺
*联系方式:wenziqi@hotmail.com
*说明:RTX-51实时系统(2)
***************************************************/
【例子】调用Keil自带的RTX-51Tiny实时系统来控制LED灯,不断重复4种不同的流水灯,每100ms对LED进行操作。
RTX-51实时系统代码如下:
#include"stc.h"
#include"rtx51tny.h"
#defineTASKINIT0//任务ID
#defineLEDCTRLTASK11
#defineLEDCTRLTASK22
#defineLEDCTRLTASK33
#defineLEDCTRLTASK44
#defineLED_PORTP2
/******************************************
*函数名称:Taskinit
*输入:无
*输出:无
*功能:初始化任务
*******************************************/
voidTaskinit(void)_task_TASKINIT
{
os_create_task(TASKINIT);//创建Taskinit任务
os_create_task(LEDCTRLTASK1);//创建LEDCtrlTask1任务
os_create_task(LEDCTRLTASK2);//创建LEDCtrlTask2任务
os_create_task(LEDCTRLTASK3);//创建LEDCtrlTask3任务
os_create_task(LEDCTRLTASK4);//创建LEDCtrlTask4任务
os_send_signal(LEDCTRLTASK1);//向LEDCtrlTask1任务发送信号
os_delete_task(TASKINIT);//删除Taskinit任务
}
/******************************************
*函数名称:LEDCtrlTask1
*输入:无
*输出:无
*功能:流水灯任务1
*******************************************/
voidLEDCtrlTask1(void)_task_LEDCTRLTASK1
{
unsignedchari=0;
while(1)
{
os_wait(K_SIG,LEDCTRLTASK1,0);//等待LEDCtrlTask1任务信号
for(i=0;i<=7;i++)
{
LED_PORT|=1<<i;
os_wait(K_TMO,10,0);//延时100ms
}
os_send_signal(LEDCTRLTASK2);//向LEDCtrlTask2任务发送信号
}
}
/******************************************
*函数名称:LEDCtrlTask2
*输入:无
*输出:无
*功能:流水灯任务2
*******************************************/
voidLEDCtrlTask2(void)_task_LEDCTRLTASK2
{
unsignedchari=0;
while(1)
{
os_wait(K_SIG,LEDCTRLTASK2,0);//等待LEDCtrlTask2任务信号
for(i=0;i<=7;i++)
{
LED_PORT&=~(1<<i);
os_wait(K_TMO,10,0);//延时100ms
}
os_send_signal(LEDCTRLTASK3);//向LEDCtrlTask3任务发送信号
}
}
/******************************************
*函数名称:LEDCtrlTask3
*输入:无
*输出:无
*功能:流水灯任务3
*******************************************/
voidLEDCtrlTask3(void)_task_LEDCTRLTASK3
gt;{
unsignedchari=0;
while(1)
{
os_wait(K_SIG,LEDCTRLTASK3,0);//等待LEDCtrlTask3任务信号
for(i=0;i<=7;i++)
{
LED_PORT|=1<<(7-i);
os_wait(K_TMO,10,0);//延时100ms
}
os_send_signal(LEDCTRLTASK4);//向LEDCtrlTask4任务发送信号
}
}
/******************************************
*函数名称:LEDCtrlTask4
*输入:无
*输出:无
*功能:流水灯任务4
*******************************************/
voidLEDCtrlTask4(void)_task_LEDCTRLTASK4
{
unsignedchari=0;
while(1)
{
os_wait(K_SIG,LEDCTRLTASK4,0);//等待LEDCtrlTask4任务信号
for(i=0;i<=7;i++)
{
LED_PORT&=~(1<<(7-i));
os_wait(K_TMO,10,0);//延时100ms
}
os_send_signal(LEDCTRLTASK1);//向LEDCtrlTask1任务发送信号
}
}
代码分析
在RTX-LED实验代码中存在5个任务:分别是TaskInit、LEDCtrlTask1、LEDCtrlTask2、
LEDCtrlTask3、LEDCtrlTask4。
TaskInit任务负责任务的创建,创建LEDCtrlTask1、LEDCtrlTask2、LEDCtrlTask3、
LEDCtrlTask4这4个控制LED灯任务。当创建这4个任务成功后,在TaskInit任务中删除TaskInit任务。
LEDCtrlTask1任务中的while(1)死循环第一步等待LEDCtrlTask1任务消息,调用os_wait(K_SIG,LEDCTRLTASK1,0)来执行。当接收到LEDCtrlTask1任务消息时,则通过for循环进行LED灯操作,并通过调用os_wait(K_TMO,10,0)进行100ms延时。最后执行发送LEDCtrlTask2任务消息。
LEDCtrlTask2、LEDCtrlTask3、LEDCtrlTask4任务内部函数操作都与LEDCtrlTask1雷同,没有多大的区别。