&
/***************************************************
*作 者:温子祺
*联系方式:[email protected]
*说 明 :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雷同,没有多大的区别。