RTX-51实时系统(2)

&

/***************************************************
 *作     者:温子祺
 *联系方式:[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个任务:分别是TaskInitLEDCtrlTask1LEDCtrlTask2

LEDCtrlTask3LEDCtrlTask4

TaskInit任务负责任务的创建,创建LEDCtrlTask1LEDCtrlTask2LEDCtrlTask3

LEDCtrlTask44个控制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任务消息。

LEDCtrlTask2LEDCtrlTask3LEDCtrlTask4任务内部函数操作都与LEDCtrlTask1雷同,没有多大的区别。

你可能感兴趣的:(系统)