?? arm_00_ostaskmanager.lst
字號:
ARM COMPILER V2.50a, ARM_00_OSTaskManager 28/08/06 09:18:54 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE ARM_00_OSTaskManager
OBJECT MODULE PLACED IN ARM_00_OSTaskManager.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe ARM_00_OSTaskManager.c THUMB DEBUG TABS(4)
stmt level source
1 /**********************************************************************************************
2 ARM_00_OSTaskManager.c file
3
4 作者:Computer-lov
5 建立日期:2006-5-13
6 修改日期:2006-5-15
7 最后修改時間:2006-08-25
8 版本:V1.0
9 版權所有,盜版必究。
10 任何技術問題可到我的博客上留言: http://computer00.21ic.org
11 Copyright(C) Computer-lov 2006-2016
12 All rights reserved
13 **********************************************************************************************/
14
15
16 #include "CPU.H"
17
18 #include "my_type.h"
19
20 #include "ARM_00_OS_TaskSwitch.H"
21 #include "ARM_00_OS_Core.H"
22 #include "UART.H"
23 #include "KEYS.H"
24 #include "Task.h"
25 #include "ADC.H"
26
27 /**********************************************************************************************
28 功能:顯示任務的PID號。
29 入口參數1:pcb。要顯示的任務的進程控制塊地址。
30 返回:無。
31 **********************************************************************************************/
32 void DisplayPID(OSpcb * pcb)
33 {
34 1 print_uint32((pcb->PID)-0x40000000); //顯示任務ID號(PID)。
35 1 //由于LPC213X系列的RAM起始地址在0x40000000,減掉顯示時會比較短
36 1 //當然,不減也無所謂。
37 1 send_a_byte(' ');
38 1 }
39 //////////////////////////////////End of function//////////////////////////////////////////////
40
41
42 /**********************************************************************************************
43 功能:顯示任務的CPU使用率。
44 入口參數1:pcb。要顯示的任務的進程控制塊地址。
45 返回:無。
46 **********************************************************************************************/
47 void DisplayCPU(OSpcb * pcb)
48 {
49 1 uint32 CpuUsedRatio;
50 1
51 1 CpuUsedRatio=((pcb->RunTimeInThisRefreshPeriod)*100+TotalTime/2)/TotalTime; //計算CPU使用率。加TotalTim
-e/2是為了四舍無入
52 1 pcb->TotalRunTime+=pcb->RunTimeInThisRefreshPeriod; //累加任務的CPU使用總時間
53 1 pcb->RunTimeInThisRefreshPeriod=0; //清本次統計的時間
54 1 if(CpuUsedRatio>=100) //如果統計的結果大于100
55 1 {
56 2 CpuUsedRatio=99; //結果為99
57 2 }
58 1 send_a_byte((CpuUsedRatio/10)+'0'); //顯示結果
ARM COMPILER V2.50a, ARM_00_OSTaskManager 28/08/06 09:18:54 PAGE 2
59 1 send_a_byte((CpuUsedRatio%10)+'0');
60 1 send_a_byte('%');
61 1 send_a_byte(' ');
62 1 send_a_byte(' ');
63 1 }
64 //////////////////////////////////End of function//////////////////////////////////////////////
65
66
67 /**********************************************************************************************
68 功能:顯示任務使用CPU的總時間。
69 入口參數1:pcb。要顯示的任務的進程控制塊地址。
70 返回:無。
71 **********************************************************************************************/
72 void DisplayCPUTime(OSpcb * pcb)
73 {
74 1 uint32 Time; //用來保存時間
75 1 uint8 H,M,S; //用來保存時,分,秒
76 1
77 1 Time=(uint32)((pcb->TotalRunTime)/((MaxOfTimer0+1)*100)); //計算總時間。結果為多少秒。
78 1 S=Time%60; //計算秒
79 1 Time/=60;
80 1 M=Time%(60); //計算分
81 1 Time/=60;
82 1 H=Time%(24); //計算時
83 1
84 1 send_a_byte((H/10)+'0'); //顯示時
85 1 send_a_byte((H%10)+'0');
86 1 send_a_byte(':');
87 1 send_a_byte((M/10)+'0'); //顯示分
88 1 send_a_byte((M%10)+'0');
89 1 send_a_byte(':');
90 1 send_a_byte((S/10)+'0'); //顯示秒
91 1 send_a_byte((S%10)+'0');
92 1 send_a_byte(' ');
93 1 send_a_byte(' ');
94 1 }
95 //////////////////////////////////End of function//////////////////////////////////////////////
96
97
98 /**********************************************************************************************
99 功能:顯示內存使用量
100 入口參數1:pcb。要顯示的任務的進程控制塊地址。
101 返回:無。
102 **********************************************************************************************/
103 void DispalyMemroyUsed(OSpcb * pcb)
104 {
105 1 print_uint32(pcb->StackLength); //顯示內存使用量
106 1 send_a_byte('B'); //顯示單位
107 1 send_a_byte(' ');
108 1 send_a_byte(' ');
109 1 }
110 //////////////////////////////////End of function//////////////////////////////////////////////
111
112
113 /**********************************************************************************************
114 功能:顯示任務所處的狀態。
115 入口參數1:pcb。要顯示的任務的進程控制塊地址。
116 返回:無。
117 **********************************************************************************************/
118 void DispalyStatus(OSpcb * pcb)
119 {
120 1 switch(pcb->Status) //根據狀態來顯示
121 1 {
122 2 case OSInReadyStatus: prints("Ready ",0);break; //就緒態
123 2 case OSInDelayStatus: prints("Delay ",0);break; //延時態
124 2 case OSInSuspendStatus: prints("Suspend",0);break; //掛起態
ARM COMPILER V2.50a, ARM_00_OSTaskManager 28/08/06 09:18:54 PAGE 3
125 2 default:break;
126 2 }
127 1 }
128 //////////////////////////////////End of function//////////////////////////////////////////////
129
130
131
132 #define REF_VOL 2.475 /*LPC213X 開發板上參考電壓為1K電阻跟3K電阻分壓3.3V所得,為2.475V*/
133
134 //////////////////////////////顯示內核電壓////////////////////////////////////
135 void DisplayCoreVoltage(void)
136 {
137 1 uint16 value;
138 1 uint32 result;
139 1 uint8 s_result[10];
140 1
141 1 prints("ADC3 voltage: ",0);
142 1 value=read_ADC(3); //通道ADC3的電壓
143 1 result=REF_VOL*10000; //換算成電壓,結果為多少mV的10倍
144 1 result=result*value/1023;
145 1 s_result[9]=0; //將結果轉換成字符串
146 1 s_result[8]=' ';
147 1 s_result[7]='V';
148 1 s_result[6]='m';
149 1 s_result[5]='0'+result%10;
150 1 result/=10;
151 1 s_result[4]='.';
152 1 s_result[3]='0'+result%10;
153 1 result/=10;
154 1 s_result[2]='0'+result%10;
155 1 result/=10;
156 1 s_result[1]='0'+result%10;
157 1 result/=10;
158 1 s_result[0]='0'+result%10;
159 1 prints(" ",0);
160 1 prints(s_result,1); //顯示電壓
161 1 }
162 //////////////////////////////////////////////////////////////////////////////
163
164 //////////////////////////////////顯示內核溫度////////////////////////////////
165 void DisplayCoreTemperature(void)
166 {
167 1 prints("Core temperature: ",0);
168 1 prints("Sorry! LPC213x MCU have no Temperature Sensor!",1);
169 1 prints("",1);
170 1 }
171 //////////////////////////////////////////////////////////////////////////////
172
173
174 /**********************************************************************************************
175 功能:任務管理器。
176 入口參數:無。
177 返回:無。
178 備注:優先級被設置為1,處于高的優先級。
179 **********************************************************************************************/
180 void OSTaskManager(void)
181 {
182 1 OSpcb * pcb; //
183 1 uint32 TempTime; //TempTime用來保存 在顯示任務管理器信息所花費的時間
184 1 uint32 DelayCount=RefreshPeriod; //延時多少個時鐘節拍刷新一次任務管理器
185 1 uint32 * p; //
186 1 uint32 i; //
187 1 uint32 CpuUsedRatio; //保存CPU使用率
188 1 uint32 nBytes; //保存申請內存的字節數
189 1
190 1 uint32 PrinterDeviceAddr; //打印機設備的入口地址
ARM COMPILER V2.50a, ARM_00_OSTaskManager 28/08/06 09:18:54 PAGE 4
191 1
192 1 PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID); //獲取打印機設備的入口地址
193 1 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
194 1
195 1 prints("",1); //顯示任務啟動
196 1 prints(OSCurrentPcb->Title,0);
197 1 prints(" Start..........................",1);
198 1
199 1 OSFreeDevice(PrinterDeviceAddr); //釋放打印機
200 1
201 1 ADC_init(); //ADC初始化。用來檢測內核電壓以及溫度
202 1
203 1 while(1)
204 1 {
205 2 OSTaskDelay(DelayCount); //延時DelayCount個時鐘節拍
206 2
207 2 pcb=OSCurrentPcb; //當前運行的任務。即任務管理器本身
208 2 TempTime=pcb->RunTimeInThisRefreshPeriod; //保存這時的時間
209 2
210 2 OSRequestDevice(PrinterDeviceAddr,0); //申請使用打印機
211 2
212 2 prints("",1); //換行
213 2 prints("",1);
214 2 prints("TaskName PID CPU CPUTime MemoryUsed Status",1); //顯示表頭
215 2 prints("------------ ----------- --- --------- ---------- ------",1);
216 2
217 2 nBytes=OSSizePerBlock*(((TaskAmount+1)*sizeof(p)+OSSizePerBlock-1)/OSSizePerBlock); //計算需要申請多
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -