⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bspmcpu.c

📁 一个在vxWorks环境下精确测试各任务CPU占用率的代码. 模块独立性好
💻 C
📖 第 1 页 / 共 2 页
字号:
void bspCorrect1msRun(void)
{
    ULONG   dwLoop, dwCount = 0;
    ULONG   dwTickStamp, dwSysClkSave;

    dwSysClkSave = sysClkRateGet();
    sysClkRateSet(100);
    taskDelay(1);   /* 使新的设定有效 */

    (!g_dwIdleDeadLoops) ? (g_dwIdleDeadLoops = 10) : g_dwIdleDeadLoops;

    /* 快速确定延时变量的取值范围 */
    for (dwCount = 0; dwCount != 10; )
    {
        taskLock();     /* 防止任务切换, 但不能禁止中断, 否则tick值保持不变 */
        
        /* 废弃当前TICK, 使其完整地占用一个TICK */
        for (dwTickStamp = tickGet(); tickGet() == dwTickStamp; );
        
        /* 计算1个TICK(10毫秒)左右运行1毫秒延时函数所需的次数 */
        for (dwCount = 0, dwTickStamp = tickGet(); tickGet() == dwTickStamp;)
        {
            bspKillTime1ms();
            dwCount++;
        }

        taskUnlock();   /* 允许其它任务运行 */
        
        g_dwIdleDeadLoops = g_dwIdleDeadLoops * dwCount / 10;
    }

    /* 精确调整延时变量的取值范围, 200个计数, 则误差只有千分之五 */
    for (dwCount = 0; dwCount != 200; )
    {
        taskLock();     /* 防止任务切换, 但不能禁止中断, 否则tick值保持不变 */

        /* 废弃当前TICK, 使其完整地占用一个TICK */
        for (dwTickStamp = tickGet(); tickGet() == dwTickStamp; );
        
        /* 计算100毫秒时间内运行1毫秒延时函数所需的次数 */
        for (dwCount = 0, dwTickStamp = tickGet(); tickGet() < dwTickStamp + 20;)
        {
            bspKillTime1ms();
            dwCount++;
        }

        taskUnlock();   /* 允许其它任务运行 */
        
        g_dwIdleDeadLoops = g_dwIdleDeadLoops * dwCount / 200;
    }

    sysClkRateSet(dwSysClkSave);

} /* bspCorrect1msRun() */

/*****************************************************************************
 *  函数名称   : bspStartCpuMoni(*)
 *  功能描述   : 启动CPU使用率监控
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   :
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-11-2 09:55, 创建函数
 *----------------------------------------------------------------------------
 */
void bspStartCpuMoni(void)
{
    char    *pBuf;
    ULONG   dwLoop;
    WIND_TCB   *ptTcb;

    if (iBspCpuMoniStart)   return;

    bspCorrect1msRun();

    pBuf = malloc(MAX_MONI_TASK_NUM * (sizeof(int) + 
        sizeof(struct cpuRateMoni) + sizeof(struct cpuRateRecord)));
    if (NULL == pBuf)
    {
        printf("Request memory failed!\n");
        return;
    }
    
    aiTaskIdList = (int *)pBuf;
    pBuf += sizeof(int) * MAX_MONI_TASK_NUM;
    t_MoniTask   = (struct cpuRateMoni *)pBuf;
    pBuf += sizeof(struct cpuRateMoni) * MAX_MONI_TASK_NUM;
    t_RecordTask = (struct cpuRateRecord *)pBuf;

    if (ERROR == taskNameToId("bspIdle"))
        taskSpawn("bspIdle", 255, 0, 2048, (FUNCPTR)cpuIdle,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    if (ERROR == taskNameToId("CpuMoni"))
        taskSpawn("CpuMoni", 10, 0, 4096, (FUNCPTR)cpuRateP1sTask,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    iRunningTaskNum = taskIdListGet(aiTaskIdList, MAX_MONI_TASK_NUM);
    for (dwLoop = 0; dwLoop < iRunningTaskNum; dwLoop++)
    {
        if (NULL == (ptTcb = taskTcb(aiTaskIdList[dwLoop])))    continue;
    
        ptTcb->reserved1 &= 0x1ffffff;
        ptTcb->reserved1 += (dwLoop & 0x7f) << 25;
        t_RecordTask[dwLoop].timeStamp = getTblVal();
        t_RecordTask[dwLoop].timeCount = 0;
    }

    if (OK != taskSwitchHookAdd((FUNCPTR)bspTaskSwitchHook))
    {
        printf("\ntaskSwitchHookAdd failed!\n");
        free(pBuf);
        return;
    }

    iBspCpuMoniStart = 1;

} /* bspStartCpuMoni() */

/*****************************************************************************
 *  函数名称   : bspStopCpuMoni(*)
 *  功能描述   : 停止CPU使用率监控
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   :
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-11-2 10:02, 创建函数
 *----------------------------------------------------------------------------
 */
void bspStopCpuMoni(void)
{
    if (!iBspCpuMoniStart)   return;

    if (ERROR != taskNameToId("CpuMoni"))
        taskDelete(taskNameToId("CpuMoni"));

    if (ERROR != taskNameToId("bspIdle"));
        taskDelete(taskNameToId("bspIdle"));

    if (OK != taskSwitchHookDelete((FUNCPTR)bspTaskSwitchHook))
    {
        printf("\n taskSwitchHookDelete failed! \n");
    }

    if (aiTaskIdList != NULL)
        free(aiTaskIdList);
    aiTaskIdList = NULL;
    
    iBspCpuMoniStart = 0;

} /* bspStopCpuMoni() */

/*****************************************************************************
 *  函数名称   : cpuRate(*)
 *  功能描述   : 打印CPU使用效率
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   : 50M总频率, 16scale, 故每毫秒3125次计数
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-11-2 10:05, 创建函数
 *----------------------------------------------------------------------------
 */
void cpuRate(void)
{
    int dwLoop;
    int iCpuRate, iIdle;

    struct cpuRateMoni *pTask;

    if (!iBspCpuMoniStart)
    {
        printf("CPU monit not started.\n");
        printf("please call \"bspStartCpuMoni()\" first\n");
        return;
    }
    
    iCpuRate = (iCpuRunCounts + 1562) / 3125;    /* 运行的毫秒数 */
    iIdle = (iCpuIdleCounts + 1562) / 3125; /* 空闲任务占用的毫秒数 */
    printf("CPU use rate %d.%d%%, IDLE %d.%d%%.\n", 
        iCpuRate / 10, iCpuRate % 10, iIdle / 10, iIdle % 10);

    if (iCpuRunCounts == 0)
    {
        return;
    }

    /* 显示所有任务CPU利用率信息 */
    printf("\nTask Cpu Usage Info in deatail:\n");
    printf("%-20s%-20s%-20s\n", "TaskName", "RunTime(us)", "CpuRate/AllTask");
                       
    pTask = &t_MoniTask[0];
    for (dwLoop = 0; dwLoop < iRunningTaskNum; dwLoop++, pTask++)
    {
        if (pTask->priority <= 253)
        {
            iCpuRate = pTask->runCount * 1000 / iCpuRunCounts,
            printf("%-20s%6d%14s%2d.%1d%%\n", pTask->taskName, 
                pTask->runCount * 1000 / 3125, " ", iCpuRate / 10, iCpuRate % 10);
        }
    }

} /* cpuRate() */

/*****************************************************************************
 *  函数名称   : bspGetCpu(*)
 *  功能描述   : 获取简洁的CPU总使用率
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   : 计算空闲任务运行的10毫秒数(4舍5入)
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-11-2 13:05, 创建函数
 *----------------------------------------------------------------------------
 */
int bspGetCpu(void)
{
    if (!iBspCpuMoniStart)
    {    
        printf("CPU monit not started.\n");
        return 100;
    }

    return (g_dwCpuUseRate + 5) / 10;

    return 100 - (iCpuIdleCounts + 15625) / 31250;
}

⌨️ 快捷键说明

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