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);
}