?? task.lst
字號:
ARM COMPILER V2.50a, Task 28/08/06 09:18:55 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE Task
OBJECT MODULE PLACED IN Task.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe Task.c THUMB DEBUG TABS(4)
stmt level source
1 /**********************************************************************************************
2 本程序只供學習使用,不得用于其它任何用途,否則后果自負。
3
4 Task.c file
5
6 作者:Computer-lov
7 建立日期:2006-5-8
8 修改日期:2006-5-15
9 最后修改時間:2006-08-25
10 版本:V1.0
11 版權所有,盜版必究。
12 任何技術問題可到我的博客上留言: http://computer00.21ic.org
13 Copyright(C) Computer-lov 2006-2016
14 All rights reserved
15 **********************************************************************************************/
16
17
18 #include "CPU.H"
19
20 #include "interrupt.h"
21 #include "LED.H"
22 #include "ARM_00_OS_TaskSwitch.H"
23 #include "my_type.h"
24 #include "ARM_00_OS_Core.H"
25 #include "UART.H"
26 #include "KEYS.H"
27 #include "Task.h"
28
29 /**********************************************************************************************
30 任務1。處于掛起狀態,等待一條消息。系統空閑任務會掃描按鍵,當按鍵按下后,系統空閑任務會將
31 鍵值通過消息發送給任務1。任務1接到消息后,顯示消息的發送者以及消息的信息等。然后控制LED4的亮滅。
32 **********************************************************************************************/
33 void Task1(void)
34 {
35 1 uint32 PrinterDeviceAddr; //保存打印機設備的地址
36 1
37 1 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID); //獲取打印機設備地址
38 1 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
39 1
40 1 prints("",1);
41 1 prints(OSCurrentPcb->Title,0); //顯示任務啟動
42 1 prints(" Start..........................",1);
43 1
44 1 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
45 1
46 1 EN_LED1(); //使能LED1
47 1
48 1 while(1)
49 1 {
50 2 OSTaskSuspend(OSCurrentPcb); //任務掛起
51 2 if(OSCurrentPcb->Msg) //如果收到消息
52 2 {
53 3 OSRequestDevice(PrinterDeviceAddr,0); //申請打印機
54 3
55 3 prints("",1);
56 3 prints("",1);
57 3 prints(OSCurrentPcb->Title,0); //顯示任務標題
58 3 prints(":",1);
59 3 prints("Haha,I have got a message from: ",0); //顯示相關信息
ARM COMPILER V2.50a, Task 28/08/06 09:18:55 PAGE 2
60 3 prints(OSCurrentPcb->Msg->Sender->Title,1); //顯示發送者的標題
61 3 prints("The sender's PID is: ",0);
62 3 print_uint32(OSCurrentPcb->Msg->Sender->PID-0x40000000); //顯示發送者的PID
63 3 prints("",1);
64 3 prints("The message type is:",0); //消息類型
65 3 print_uint32(OSCurrentPcb->Msg->MsgType);
66 3 prints("",1);
67 3 prints("The message value is",0); //消息的值
68 3 print_uint32(*(OSCurrentPcb->Msg->pMsg));
69 3 prints("",1);
70 3 prints("",1);
71 3
72 3 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
73 3
74 3 switch(*(OSCurrentPcb->Msg->pMsg)) //鍵值散轉
75 3 {
76 4 case KEY1: ON_LED1();break; //如果是按鍵1按下,則點亮LED1
77 4 case KEY2: OFF_LED1();break; //如果是按鍵2按下,則熄滅LED1
78 4 default: break;
79 4 }
80 3 OSCurrentPcb->Msg=0; //消息處理完畢
81 3 }
82 2 }
83 1 }
84 //////////////////////////////////End of function//////////////////////////////////////////////
85
86
87 /**********************************************************************************************
88 任務2。延遲1S,等待一條消息。系統空閑任務會掃描按鍵,當按鍵按下后,系統空閑任務會將
89 鍵值通過消息發送給任務1。任務1接到消息后,顯示消息的發送者以及消息的信息等。然后控制LED4的亮滅。
90 如果1S過后,還未收到消息,則顯示接收超時。
91 /*********************************************************************************************/
92 void Task2(void)
93 {
94 1 uint32 PrinterDeviceAddr; //保存打印機設備的地址
95 1
96 1 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID); //獲取打印機設備地址
97 1 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
98 1
99 1 prints("",1);
100 1 prints(OSCurrentPcb->Title,0); //顯示任務啟動
101 1 prints(" Start..........................",1);
102 1 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
103 1
104 1 EN_LED2();
105 1 while(1)
106 1 {
107 2 OSTaskDelay(100); //延時等待消息的到來
108 2 if(OSCurrentPcb->Msg) //如果收到了消息
109 2 {
110 3 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
111 3 prints("",1);
112 3 prints("",1);
113 3 prints(OSCurrentPcb->Title,0); //顯示任務的標題
114 3 prints(":",1);
115 3 prints("Haha,I have got a message from: ",0);
116 3 prints(OSCurrentPcb->Msg->Sender->Title,1); //顯示消息發送者的標題
117 3 prints("The sender's PID is: ",0);
118 3 print_uint32(OSCurrentPcb->Msg->Sender->PID-0x40000000); //顯示消息發送者的PID
119 3 prints("",1);
120 3 prints("The message type is:",0);
121 3 print_uint32(OSCurrentPcb->Msg->MsgType); //顯示消息的類型
122 3 prints("",1);
123 3 prints("The message value is",0);
124 3 print_uint32(*(OSCurrentPcb->Msg->pMsg)); //顯示消息
125 3 prints("",1);
ARM COMPILER V2.50a, Task 28/08/06 09:18:55 PAGE 3
126 3 prints("",1);
127 3 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
128 3 switch(*(OSCurrentPcb->Msg->pMsg)) //鍵值散轉
129 3 {
130 4 case KEY3: ON_LED2();break; //如果是按鍵3按下,則點亮LED2
131 4 case KEY4: OFF_LED2();break; //如果是按鍵4按下,則熄滅LED2
132 4 default: break;
133 4 }
134 3 OSCurrentPcb->Msg=0; //消息處理完畢
135 3 }
136 2 else //如果1秒后還未收到消息,則
137 2 {
138 3 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
139 3 prints("",1);
140 3 prints("",1);
141 3 prints(OSCurrentPcb->Title,0); //顯示任務的標題
142 3 prints(":",1);
143 3 prints("I have not got a message in 1 second!",1); //顯示未收到消息
144 3 prints("Time out!",1); //超時
145 3 prints("",1);
146 3 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
147 3 }
148 2 }
149 1 }
150 //////////////////////////////////End of function//////////////////////////////////////////////
151
152
153 /**********************************************************************************************
154 任務3。每隔500mS點亮、熄滅一次LED6,并顯示一些信息。
155 **********************************************************************************************/
156 void Task3(void)
157 {
158 1 uint32 PrinterDeviceAddr; //保存打印機設備的地址
159 1
160 1 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID); //獲取打印機設備地址
161 1 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
162 1
163 1 prints("",1);
164 1 prints(OSCurrentPcb->Title,0); //顯示任務啟動
165 1 prints(" Start..........................",1);
166 1 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
167 1
168 1 EN_LED3();
169 1 while(1)
170 1 {
171 2 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
172 2 prints("HaHa,Running in Task3! ",1); //顯示信息
173 2 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
174 2 OSTaskDelay(50); //延時50個時鐘節拍
175 2 ON_LED3(); //開LED3
176 2 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
177 2 prints("HaHa,Running in Task3! ",1); //顯示信息
178 2 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
179 2 OSTaskDelay(50); //延時50個時鐘節拍
180 2 OFF_LED3(); //關LED3
181 2 }
182 1 }
183 //////////////////////////////////End of function//////////////////////////////////////////////
184
185
186 /**********************************************************************************************
187 任務4。每隔1000mS點亮、熄滅一次LED6,并顯示一些信息。
188 **********************************************************************************************/
189 void Task4(void)
190 {
191 1 uint32 PrinterDeviceAddr; //保存打印機設備的地址
ARM COMPILER V2.50a, Task 28/08/06 09:18:55 PAGE 4
192 1
193 1 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID); //獲取打印機設備地址
194 1 OSRequestDevice(PrinterDeviceAddr,0); // //申請使用打印機
195 1
196 1 prints("",1);
197 1 prints(OSCurrentPcb->Title,0); //顯示任務啟動
198 1 prints(" Start..........................",1);
199 1 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
200 1 EN_LED4();
201 1 while(1)
202 1 {
203 2 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
204 2 prints("HaHa,Running in Task4! ",1); //顯示信息
205 2 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
206 2 OSTaskDelay(100); //延時100個時鐘節拍
207 2 ON_LED4(); //開LED4
208 2 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
209 2 prints("HaHa,Running in Task4! ",1); //顯示信息
210 2 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
211 2 OSTaskDelay(100); //延時100個時鐘節拍
212 2 OFF_LED4(); //關LED4
213 2 }
214 1 }
215 //////////////////////////////////End of function//////////////////////////////////////////////
216
217
218 /**********************************************************************************************
219 任務5。鍵盤掃描并發送消息。
220 **********************************************************************************************/
221 void Task5(void)
222 {
223 1 uint32 PrinterDeviceAddr; //保存打印機設備的地址
224 1 OSpcb * Task1Pcb,* Task2Pcb; //用來保存任務pcb
225 1 OSMsg Msg; //消息
226 1 uint32 MsgValue; //保存消息值
227 1
228 1 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID); //獲取打印機設備地址
229 1 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
230 1
231 1 prints("",1);
232 1 prints(OSCurrentPcb->Title,0); //顯示任務啟動
233 1 prints(" Start..........................",1);
234 1 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
235 1
236 1 Task1Pcb=(OSpcb *)(uint32)OSTaskCreat((uint32)Task1,256,4,OS_THUMB_MODE,"Task1"); //創建任務1
237 1 Task2Pcb=(OSpcb *)(uint32)OSTaskCreat((uint32)Task2,256,5,OS_THUMB_MODE,"Task2"); //創建任務2
238 1
239 1 while(1)
240 1 {
241 2 OSTaskDelay(1); //延遲10ms
242 2 ScanKey(); //鍵盤掃描
243 2 if(Key.Value) //如果有鍵按下
244 2 {
245 3 MsgValue=Key.Value; //保存按鍵值
246 3
247 3 (&Msg)->MsgType=KEYBOARD_MSG; //設置要發送的消息類型
248 3 (&Msg)->pMsg=&MsgValue; //設置要發送的消息的值
249 3 (&Msg)->Length=1; //設置消息的長度
250 3
251 3 OSSendMsg(Task1Pcb,&Msg); //將消息發送給任務1
252 3 OSSendMsg(Task2Pcb,&Msg); //將消息發送給任務2
253 3 Key.Value=0; //清除鍵值,表示該次按鍵已經處理
254 3 }
255 2 }
256 1 }
257 //////////////////////////////////End of function//////////////////////////////////////////////
ARM COMPILER V2.50a, Task 28/08/06 09:18:55 PAGE 5
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN DATA (OSCurrentPcb)
EXTERN CODE16 (OSTaskDelay?T)
EXTERN CODE16 (OSTaskSuspend?T)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -