?? arm_00_ostaskmanager.bak
字號(hào):
/**********************************************************************************************
ARM_00_OSTaskManager.c file
作者:Computer-lov
建立日期:2006-5-13
修改日期:2006-5-15
版本:V1.0
版權(quán)所有,盜版必究。
任何技術(shù)問題可到我的博客上留言: http://computer00.21ic.org
Copyright(C) Computer-lov 2006-2016
All rights reserved
**********************************************************************************************/
#include <ADuC7026.H>
#include "my_type.h"
#include "ARM_00_OS_TaskSwitch.H"
#include "ARM_00_OS_Core.H"
#include "UART.H"
#include "KEYS.H"
#include "Task.h"
#include "ADC.H"
/**********************************************************************************************
功能:顯示任務(wù)的PID號(hào)。
入口參數(shù)1:pcb。要顯示的任務(wù)的進(jìn)程控制塊地址。
返回:無。
**********************************************************************************************/
void DisplayPID(OSpcb * pcb)
{
print_uint32(pcb->PID); //顯示任務(wù)ID號(hào)(PID)
send_a_byte(' ');
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:顯示任務(wù)的CPU使用率。
入口參數(shù)1:pcb。要顯示的任務(wù)的進(jìn)程控制塊地址。
返回:無。
**********************************************************************************************/
void DisplayCPU(OSpcb * pcb)
{
uint32 CpuUsedRatio;
CpuUsedRatio=((pcb->RunTimeInThisRefreshPeriod)*100+TotalTime/2)/TotalTime; //計(jì)算CPU使用率。加TotalTime/2是為了四舍無入
pcb->TotalRunTime+=pcb->RunTimeInThisRefreshPeriod; //累加任務(wù)的CPU使用總時(shí)間
pcb->RunTimeInThisRefreshPeriod=0; //清本次統(tǒng)計(jì)的時(shí)間
if(CpuUsedRatio>=100) //如果統(tǒng)計(jì)的結(jié)果大于100
{
CpuUsedRatio=99; //結(jié)果為99
}
send_a_byte((CpuUsedRatio/10)+'0'); //顯示結(jié)果
send_a_byte((CpuUsedRatio%10)+'0');
send_a_byte('%');
send_a_byte(' ');
send_a_byte(' ');
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:顯示任務(wù)使用CPU的總時(shí)間。
入口參數(shù)1:pcb。要顯示的任務(wù)的進(jìn)程控制塊地址。
返回:無。
**********************************************************************************************/
void DisplayCPUTime(OSpcb * pcb)
{
uint32 Time; //用來保存時(shí)間
uint8 H,M,S; //用來保存時(shí),分,秒
Time=(uint32)((pcb->TotalRunTime)/((MaxOfTimer0+1)*100)); //計(jì)算總時(shí)間。結(jié)果為多少秒。
S=Time%60; //計(jì)算秒
Time/=60;
M=Time%(60); //計(jì)算分
Time/=60;
H=Time%(24); //計(jì)算時(shí)
send_a_byte((H/10)+'0'); //顯示時(shí)
send_a_byte((H%10)+'0');
send_a_byte(':');
send_a_byte((M/10)+'0'); //顯示分
send_a_byte((M%10)+'0');
send_a_byte(':');
send_a_byte((S/10)+'0'); //顯示秒
send_a_byte((S%10)+'0');
send_a_byte(' ');
send_a_byte(' ');
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:顯示內(nèi)存使用量
入口參數(shù)1:pcb。要顯示的任務(wù)的進(jìn)程控制塊地址。
返回:無。
**********************************************************************************************/
void DispalyMemroyUsed(OSpcb * pcb)
{
print_uint32(pcb->StackLength); //顯示內(nèi)存使用量
send_a_byte('B'); //顯示單位
send_a_byte(' ');
send_a_byte(' ');
}
//////////////////////////////////End of function//////////////////////////////////////////////
/**********************************************************************************************
功能:顯示任務(wù)所處的狀態(tài)。
入口參數(shù)1:pcb。要顯示的任務(wù)的進(jìn)程控制塊地址。
返回:無。
**********************************************************************************************/
void DispalyStatus(OSpcb * pcb)
{
switch(pcb->Status) //根據(jù)狀態(tài)來顯示
{
case OSInReadyStatus: prints("Ready ",0);break; //就緒態(tài)
case OSInDelayStatus: prints("Delay ",0);break; //延時(shí)態(tài)
case OSInSuspendStatus: prints("Suspend",0);break; //掛起態(tài)
default:break;
}
}
//////////////////////////////////End of function//////////////////////////////////////////////
#define REF_VOL 2.5
//////////////////////////////顯示內(nèi)核電壓////////////////////////////////////
void DisplayCoreVoltage(void)
{
uint16 value;
uint32 result;
uint8 s_result[10];
prints("Core voltage: ",0);
value=2*read_ADC(0x13); //通道號(hào)為0x13的電壓為1/2電源電壓
result=REF_VOL*10000; //換算成電壓,結(jié)果為多少mV的10倍
result=result*value/4096;
s_result[9]=0; //將結(jié)果轉(zhuǎn)換成字符串
s_result[8]=' ';
s_result[7]='V';
s_result[6]='m';
s_result[5]='0'+result%10;
result/=10;
s_result[4]='.';
s_result[3]='0'+result%10;
result/=10;
s_result[2]='0'+result%10;
result/=10;
s_result[1]='0'+result%10;
result/=10;
s_result[0]='0'+result%10;
prints(" ",0);
prints(s_result,0); //顯示電壓
prints(" ",0);
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////顯示內(nèi)核溫度////////////////////////////////
void DisplayCoreTemperature(void)
{
uint16 value;
sint32 result;
uint8 s_result[10];
prints("Core temperature: ",0);
value=read_ADC(0x10); //通道號(hào)為0x10的是溫度傳感器電壓
result=REF_VOL*10000; //換算成電壓,結(jié)果為多少mV的10倍
result=result*value/4096;
result=((7800-result)*10/13)+250; //溫度是25℃時(shí),輸出電壓為780mV,每升高1℃,輸出電壓降低1.3mV
//計(jì)算結(jié)果為多少度的10倍
if(result<0) //如果溫度小于0度
{
s_result[0]='-'; //顯示負(fù)號(hào)
result*=-1; //將結(jié)果換成正的
}
else
{
s_result[0]=' '; //不顯示負(fù)號(hào)
}
s_result[6]=0; //將溫度值轉(zhuǎn)換成字符串,供顯示用
s_result[5]='0'+result%10;
result/=10;
s_result[4]='.';
s_result[3]='0'+result%10;
result/=10;
s_result[2]='0'+result%10;
result/=10;
s_result[1]='0'+result%10;
prints(s_result,0); //顯示溫度結(jié)果
prints("℃",1);
}
//////////////////////////////////////////////////////////////////////////////
/**********************************************************************************************
功能:任務(wù)管理器。
入口參數(shù):無。
返回:無。
備注:優(yōu)先級(jí)被設(shè)置為1,處于高的優(yōu)先級(jí)。
**********************************************************************************************/
void OSTaskManager(void)
{
OSpcb * pcb; //
uint32 TempTime; //TempTime用來保存 在顯示任務(wù)管理器信息所花費(fèi)的時(shí)間
uint32 DelayCount=RefreshPeriod; //延時(shí)多少個(gè)時(shí)鐘節(jié)拍刷新一次任務(wù)管理器
uint32 * p; //
uint32 i; //
uint32 CpuUsedRatio; //保存CPU使用率
uint32 nBytes; //保存申請(qǐng)內(nèi)存的字節(jié)數(shù)
uint32 PrinterDeviceAddr; //打印機(jī)設(shè)備的入口地址
PrinterDeviceAddr=OSGetDeviceAddr(OS_PRINTER_DEVICE_ID); //獲取打印機(jī)設(shè)備的入口地址
OSRequestDevice(PrinterDeviceAddr,0); //申請(qǐng)使用打印機(jī)
prints("",1); //顯示任務(wù)啟動(dòng)
prints(OSCurrentPcb->Title,0);
prints(" Start.",1);
OSFreeDevice(PrinterDeviceAddr); //釋放打印機(jī)
ADC_init(); //ADC初始化。用來檢測(cè)內(nèi)核電壓以及溫度
while(1)
{
OSTaskDelay(DelayCount); //延時(shí)DelayCount個(gè)時(shí)鐘節(jié)拍
pcb=OSCurrentPcb; //當(dāng)前運(yùn)行的任務(wù)。即任務(wù)管理器本身
TempTime=pcb->RunTimeInThisRefreshPeriod; //保存這時(shí)的時(shí)間
OSRequestDevice(PrinterDeviceAddr,0); //申請(qǐng)使用打印機(jī)
prints("",1); //換行
prints("",1);
prints("TaskName PID CPU CPUTime MemoryUsed Status",1); //顯示表頭
prints("---------------------------------------------------------------",1);
nBytes=OSSizePerBlock*(((TaskAmount+1)*sizeof(p)+OSSizePerBlock-1)/OSSizePerBlock); //計(jì)算需要申請(qǐng)多少字節(jié)內(nèi)存
p=(uint32 *)OSMalloc(nBytes); //申請(qǐng)一塊內(nèi)存,用來保存所有任務(wù)的pcb指針。供下面顯示用
OSCurrentPcb->StackLength+=nBytes; //申請(qǐng)內(nèi)存后,調(diào)節(jié)任務(wù)管理器的內(nèi)存使用長(zhǎng)度
i=0;
prints(pcb->Title,0); //顯示任務(wù)名字
DisplayPID(pcb); //顯示任務(wù)的的PID
TempTime=pcb->RunTimeInThisRefreshPeriod-TempTime; //計(jì)算出前面顯示花費(fèi)的時(shí)間
DisplayCPU(pcb); //顯示任務(wù)管理器所使用的CPU使用率
DisplayCPUTime(pcb); //顯示任務(wù)管理器所使用的CPU總時(shí)間
DispalyMemroyUsed(pcb); //顯示任務(wù)管理器所使用的內(nèi)存
prints("Running",0); //顯示任務(wù)管理器的狀態(tài)為運(yùn)行狀態(tài)
prints("",1); //換行
OSEnterCritical(); //進(jìn)入臨界段
pcb=OSReadyList->Next; //pcb保存就緒表的下一個(gè)。就緒表的第一個(gè)為當(dāng)前運(yùn)行的任務(wù),即任務(wù)管理器
while((pcb->Next)!=(OSpcb *)0) //遍歷整個(gè)就緒表
{
p[i++]=(uint32)pcb; //保存就緒表的pcb
pcb=pcb->Next; //移向就緒表的下一個(gè)
}
p[i++]=(uint32)pcb; //最后一個(gè)為空閑任務(wù)的pcb。
//計(jì)算CPU使用率并保存至CpuUsedRatio。CPU使用率是100%減掉空閑任務(wù)的使用率
CpuUsedRatio=100-((pcb->RunTimeInThisRefreshPeriod)*100+TotalTime/2)/TotalTime;
pcb=OSDelayList; //延時(shí)態(tài)表
while((pcb->Next)!=(OSpcb *)0) //遍歷整個(gè)延時(shí)態(tài)表
{
p[i++]=(uint32)pcb; //保存延時(shí)態(tài)表的pcb
pcb=pcb->Next; // 移向下一個(gè)
}
pcb=OSSuspendList; //掛起態(tài)表
while((pcb->Next)!=(OSpcb *)0) //遍歷整個(gè)掛起態(tài)表
{
p[i++]=(uint32)pcb; //保存掛起態(tài)pcb
pcb=pcb->Next; //移向下一個(gè)
}
p[i]=0; //結(jié)束
OSExitCritical(); //退出臨界段
i=0; //準(zhǔn)備顯示任務(wù)信息
while(p[i]!=0) //直到結(jié)束為止
{
prints(((OSpcb *)(p[i]))->Title,0); //顯示任務(wù)名
DisplayPID((OSpcb *)(p[i])); //顯示任務(wù)ID
DisplayCPU((OSpcb *)(p[i])); //顯示任務(wù)CPU使用率
DisplayCPUTime((OSpcb *)(p[i])); //顯示任務(wù)使用CPU的總時(shí)間
DispalyMemroyUsed((OSpcb *)(p[i])); //顯示任務(wù)使用的內(nèi)存量
DispalyStatus((OSpcb *)(p[i])); //顯示任務(wù)當(dāng)前所處的狀態(tài)
prints("",1); //換行
i++; //移到下一個(gè)
}
prints("",1); //顯示CPU使用率
prints("CPU used ratio: ",0);
if(CpuUsedRatio>=100) //如果CPU使用率為100%,
{
prints("100%",1); //則顯示100%
}
else
{
send_a_byte(CpuUsedRatio/10+'0'); //顯示十位
send_a_byte(CpuUsedRatio%10+'0'); //顯示個(gè)位
prints("%",1);
}
prints("Total memory: ",0); //顯示總內(nèi)存量
print_uint32(OSGetMemoryPoolSize());
prints("B Memory used: ",0); //顯示內(nèi)存使用量
i=OSMemoryStatistic(); //獲取內(nèi)存使用量
print_uint32(i);
prints("B Memory used ratio: ",0); //顯示內(nèi)存使用率
i=i*100/OSGetMemoryPoolSize(); //計(jì)算內(nèi)存使用率
send_a_byte(i/10+'0');
send_a_byte(i%10+'0');
prints("%",1);
DisplayCoreVoltage(); //顯示內(nèi)核電壓
DisplayCoreTemperature(); //顯示內(nèi)核溫度
prints("",1);
OSFreeDevice(PrinterDeviceAddr); //釋放打印機(jī)使用權(quán)
OSFree((uint32)p,nBytes); //釋放p的內(nèi)存
OSCurrentPcb->StackLength-=nBytes; //調(diào)整任務(wù)管理器的內(nèi)存使用數(shù)量
TempTime+=OSCurrentPcb->RunTimeInThisRefreshPeriod; //計(jì)算上面顯示所花費(fèi)的時(shí)間
DelayCount=RefreshPeriod-(TempTime)/(MaxOfTimer0+1); //計(jì)算下一次統(tǒng)計(jì)資源,應(yīng)該需要多少個(gè)時(shí)鐘節(jié)拍 //因?yàn)轱@示信息時(shí)要花費(fèi)時(shí)間,應(yīng)該將其減去
}
}
//////////////////////////////////End of function//////////////////////////////////////////////
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -