www.pudn.com > Demo C.rar > cpuLoad.c
typedef struct cpuUsage {
SEM_ID startSem;
int didNotComplete;
unsigned long ticksNoContention;
int nBurnNoContention;
unsigned long ticksNow;
int nBurnNow;
double usage;
} cpuUsage;
static cpuUsage *pcpuUsage=0;
static double cpuBurn()
{
int i;
double result = 0.0;
for(i=0;i<5; i++) result += sqrt((double)i);
return(result);
}
static void cpuUsageTask()
{
while(TRUE) {
int i;
unsigned long tickStart,tickEnd;
semTake(pcpuUsage->startSem,WAIT_FOREVER);
pcpuUsage->ticksNow=0;
pcpuUsage->nBurnNow=0;
tickStart = tickGet();
for(i=0; i< pcpuUsage->nBurnNoContention; i++) {
cpuBurn();
pcpuUsage->ticksNow = tickGet() - tickStart;
++pcpuUsage->nBurnNow;
}
tickEnd = tickGet();
pcpuUsage->didNotComplete = FALSE;
pcpuUsage->ticksNow = tickEnd - tickStart;
}
}
static double getCpu()
{
if(pcpuUsage->didNotComplete && pcpuUsage->nBurnNow==0) {
pcpuUsage->usage = 0.0;
} else {
double temp;
double ticksNow,nBurnNow;
ticksNow = (double)pcpuUsage->ticksNow;
nBurnNow = (double)pcpuUsage->nBurnNow;
ticksNow *= (double)pcpuUsage->nBurnNoContention/nBurnNow;
temp = ticksNow - (double)pcpuUsage->ticksNoContention;
temp = 100.0 * temp/ticksNow;
if(temp<0.0 || temp>100.0) temp=0.0; /*handle tick overflow*/
pcpuUsage->usage = temp;
}
pcpuUsage->didNotComplete = TRUE;
semGive(pcpuUsage->startSem);
return(pcpuUsage->usage);
}
static void cpuUsageInit(void)
{
unsigned long tickStart,tickNow;
int nBurnNoContention=0;
int ticksToWait;
ticksToWait = SECONDS_TO_BURN*sysClkRateGet();
pcpuUsage = calloc(1,sizeof(cpuUsage));
tickStart = tickGet();
/*wait for a tick*/
while(tickStart==(tickNow = tickGet())) {;}
tickStart = tickNow;
while(TRUE) {
if((tickGet() - tickStart)>=ticksToWait) break;
cpuBurn();
nBurnNoContention++;
}
pcpuUsage->nBurnNoContention = nBurnNoContention;
pcpuUsage->startSem = semBCreate (SEM_Q_FIFO,SEM_EMPTY);
pcpuUsage->ticksNoContention = ticksToWait;
pcpuUsage->didNotComplete = TRUE;
taskSpawn("cpuUsageTask",255,VX_FP_TASK,1000,(FUNCPTR)cpuUsageTask,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}