cpuload.c

来自「Vxworks下的C例子程序」· C语言 代码 · 共 90 行

C
90
字号
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);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?