RTX-51实时系统(2)
&
/***************************************************
*作 者:温子祺
*联系方式:wenziqi@hotmail.com
*说 明 :RTX-51实时系统(2)
***************************************************/
【例子】调用Keil自带的RTX-51 Tiny实时系统来控制LED灯,不断重复4种不同的流水灯,每100ms对LED进行操作。
RTX-51实时系统代码如下:
1 #include "stc.h"
2 #include "rtx51tny.h"
3
4 #define TASKINIT 0 //任务ID
5 #define LEDCTRLTASK1 1
6 #define LEDCTRLTASK2 2
7 #define LEDCTRLTASK3 3
8 #define LEDCTRLTASK4 4
9
10 #define LED_PORT P2
11
12 /******************************************
13 *函数名称:Taskinit
14 *输 入:无
15 *输 出:无
16 *功 能:初始化任务
17 *******************************************/
18 void Taskinit(void) _task_ TASKINIT
19 {
20
21 os_create_task(TASKINIT); //创建Taskinit任务
22 os_create_task(LEDCTRLTASK1);//创建LEDCtrlTask1任务
23 os_create_task(LEDCTRLTASK2);//创建LEDCtrlTask2任务
24 os_create_task(LEDCTRLTASK3);//创建LEDCtrlTask3任务
25 os_create_task(LEDCTRLTASK4);//创建LEDCtrlTask4任务
26 os_send_signal(LEDCTRLTASK1);//向LEDCtrlTask1任务发送信号
27 os_delete_task(TASKINIT); //删除Taskinit任务
28
29 }
30 /******************************************
31 *函数名称:LEDCtrlTask1
32 *输 入:无
33 *输 出:无
34 *功 能:流水灯任务1
35 *******************************************/
36 void LEDCtrlTask1(void) _task_ LEDCTRLTASK1
37 {
38 unsigned char i=0;
39
40 while(1)
41 {
42 os_wait(K_SIG,LEDCTRLTASK1,0);//等待LEDCtrlTask1任务信号
43
44 for(i=0;i<=7;i++)
45 {
46 LED_PORT|=1<<i;
47 os_wait (K_TMO,10,0);//延时100ms
48 }
49
50 os_send_signal(LEDCTRLTASK2);//向LEDCtrlTask2任务发送信号
51
52 }
53
54 }
55 /******************************************
56 *函数名称:LEDCtrlTask2
57 *输 入:无
58 *输 出:无
59 *功 能:流水灯任务2
60 *******************************************/
61 void LEDCtrlTask2(void) _task_ LEDCTRLTASK2
62 {
63 unsigned char i=0;
64
65 while(1)
66 {
67
68 os_wait(K_SIG,LEDCTRLTASK2,0);//等待LEDCtrlTask2任务信号
69
70 for(i=0;i<=7;i++)
71 {
72 LED_PORT&=~(1<<i);
73 os_wait (K_TMO,10,0); //延时100ms
74 }
75
76 os_send_signal(LEDCTRLTASK3);//向LEDCtrlTask3任务发送信号
77 }
78 }
79 /******************************************
80 *函数名称:LEDCtrlTask3
81 *输 入:无
82 *输 出:无
83 *功 能:流水灯任务3
84 *******************************************/
85 void LEDCtrlTask3(void) _task_ LEDCTRLTASK3
86 gt;{
87 unsigned char i=0;
88
89 while(1)
90 {
91 os_wait(K_SIG,LEDCTRLTASK3,0);//等待LEDCtrlTask3任务信号
92
93 for(i=0;i<=7;i++)
94 {
95 LED_PORT|=1<<(7-i);
96 os_wait (K_TMO,10,0); //延时100ms
97 }
98
99 os_send_signal(LEDCTRLTASK4);//向LEDCtrlTask4任务发送信号
100
101 }
102
103
104 }
105 /******************************************
106 *函数名称:LEDCtrlTask4
107 *输 入:无
108 *输 出:无
109 *功 能:流水灯任务4
110 *******************************************/
111 void LEDCtrlTask4(void) _task_ LEDCTRLTASK4
112 {
113 unsigned char i=0;
114
115 while(1)
116 {
117
118 os_wait(K_SIG,LEDCTRLTASK4,0);//等待LEDCtrlTask4任务信号
119 for(i=0;i<=7;i++)
120 {
121 LED_PORT&=~(1<<(7-i));
122 os_wait (K_TMO,10,0); //延时100ms
123 }
124
125 os_send_signal(LEDCTRLTASK1);//向LEDCtrlTask1任务发送信号
126
127 }
128
129 }
130
代码分析
在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雷同,没有多大的区别。