RTX51实时系统(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个任务:分别是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雷同,没有多大的区别。

原文地址:https://www.cnblogs.com/wenziqi/p/1769341.html