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