📄 arm_00_ostaskmanager.lst
字号:
ARM COMPILER V2.50a, ARM_00_OSTaskManager 25/08/06 23:22:56 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 25/08/06 23:22:56 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 25/08/06 23:22:56 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 25/08/06 23:22:56 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 + -