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

📄 bspmcpu.c

📁 一个在vxWorks环境下精确测试各任务CPU占用率的代码. 模块独立性好
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
 * 版权所有(C) 2006, ZTE Corp. WiMAX
 *----------------------------------------------------------------------------
 * 模 块 名 : BSP
 * 文件名称 : bspMCpu.c
 * 文件标识 : {[N/A]}
 * 内容摘要 : WTRX单板CPU使用率监控
 * 注意事项 : 无
 * 作    者 : 田瑞忠
 * 创建日期 : 2006-11-2 09:24
 * 当前版本 : Ver1.0
 *----------------------------------------------------------------------------
 * 变更记录 :
 *
 * $记录1
 * 变 更 单: $0000000(N/A)
 * 责 任 人: 田瑞忠
 * 修改日戳: 2006-11-2 09:24
 * 变更说明: 创建文件
 *
 *----------------------------------------------------------------------------
 */
 
#include "vxWorks.h"
#include "taskLib.h"

#define MAX_MONI_TASK_NUM 100

int     iBspCpuMoniStart= 0;
int     iRunningTaskNum = 0;
ULONG   iCpuRunCounts   = 0;
ULONG   iCpuIdleCounts  = 0;
int     *aiTaskIdList = NULL;

struct cpuRateMoni {
    char    *taskName;
    UINT    priority;
    int     runCount;
} *t_MoniTask = NULL;

struct cpuRateRecord {
    int     timeStamp;
    int     timeCount;
} *t_RecordTask = NULL;

ULONG g_dwIdle1MsCount   = 0;
ULONG g_dwSecondCount    = 0;
ULONG g_dwIdleDeadLoops  = 10000;
ULONG g_dwCpuUseRate     = 0;
ULONG g_dwCpuRatePeriod  = 10;  /* CPU占用率统计时间间隔 */

/* extern void	vxTimeBaseGet (ULONG * pTbu, ULONG *pTbl); */
extern ULONG getTblVal(void);

/*****************************************************************************
 *  函数名称   : bspTaskSwitchHook(*)
 *  功能描述   : 任务切换钩子函数
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : pOldTcb    - 切出任务
               : pNewTcb    - 切入任务
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   :
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-11-1 8:28, 创建函数
 *----------------------------------------------------------------------------
 */
VOID bspTaskSwitchHook(WIND_TCB *pOldTcb,  WIND_TCB *pNewTcb)
{
    ULONG   ulTimeBaseLower = getTblVal();
    UCHAR   ucTaskIdx;

    if (NULL == t_RecordTask)     return;

    if ((ucTaskIdx = (pNewTcb->reserved1 >> 25)) <= MAX_MONI_TASK_NUM - 1)
    {
        t_RecordTask[ucTaskIdx].timeStamp = (int)ulTimeBaseLower;
    }
        
    if ((ucTaskIdx = (pOldTcb->reserved1 >> 25)) <= MAX_MONI_TASK_NUM - 1)
    {
        t_RecordTask[ucTaskIdx].timeCount += 
            (int)ulTimeBaseLower - t_RecordTask[ucTaskIdx].timeStamp;
    }
}

/*****************************************************************************
 *  函数名称   : cpuRateP1sTask(*)
 *  功能描述   : CPU使用率计算, 每秒更新一次
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   : 将数据统计到全局变量中, 否则不统计
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-11-1 20:28, 创建函数
 *----------------------------------------------------------------------------
 */
void cpuRateP1sTask(void)
{
    ULONG   dwLoop, dwIndex;
    ULONG   dwTaskRunCounts, dwIdleRunCounts, dwTempCounts;

    ULONG   dwTimeNow, dwIdleDuration, dwCycleDuration;
    ULONG   dwTickNow = tickGet();

    WIND_TCB   *ptTcb;

    while (1)
    {
        taskDelay(sysClkRateGet());

        iRunningTaskNum = taskIdListGet(aiTaskIdList, MAX_MONI_TASK_NUM);

        /* 记录历史累记 */
        dwTaskRunCounts = dwIdleRunCounts = 0;
        for (dwLoop = 0; dwLoop < iRunningTaskNum; dwLoop++)
        {
            if (NULL == (ptTcb = taskTcb(aiTaskIdList[dwLoop])))    continue;

            dwTempCounts = 0;
            if ((dwIndex = (ptTcb->reserved1 >> 25)) <= MAX_MONI_TASK_NUM - 1)
            {
                dwTempCounts = t_RecordTask[dwIndex].timeCount;
            }
            t_MoniTask[dwLoop].runCount = dwTempCounts;
            t_MoniTask[dwLoop].taskName = ptTcb->name;
            t_MoniTask[dwLoop].priority = ptTcb->priNormal;

            /* 当任务的优先级大于253时, 即被认为是用来耗CPU的空闲任务 */
            if (ptTcb->priNormal <= 253)
                dwTaskRunCounts += dwTempCounts;
            else
                dwIdleRunCounts += dwTempCounts;
        }

        /* 清空历史累记 */
        for (dwLoop = 0; dwLoop < iRunningTaskNum; dwLoop++)
        {
            if (NULL == (ptTcb = taskTcb(aiTaskIdList[dwLoop])))    continue;

            ptTcb->reserved1 &= 0x1ffffff;
            ptTcb->reserved1 += (dwLoop & 0x7f) << 25;
            t_RecordTask[dwLoop].timeCount = 0;
        }

        iCpuRunCounts = dwTaskRunCounts;
        iCpuIdleCounts = dwIdleRunCounts;

        /*--------------------------------------------------------------------
         * 以下程序段为总的CPU使用率计算方法, 不涉及任务 */
        dwTimeNow = time(NULL);
        if ((dwTimeNow - g_dwSecondCount) < g_dwCpuRatePeriod)
        {
            continue;
        }

        dwCycleDuration = (tickGet() - dwTickNow) * 1000 / sysClkRateGet();
        dwIdleDuration  = g_dwIdle1MsCount;
        dwTickNow = tickGet(), g_dwIdle1MsCount = 0;
    
        if (!dwCycleDuration || dwIdleDuration > dwCycleDuration)
        {
            g_dwCpuUseRate = 0;
        }
        else
        {
            g_dwCpuUseRate = 1000 - dwIdleDuration * 1000 / dwCycleDuration;
        }
    
        g_dwSecondCount = dwTimeNow;
        printf("[BSP] CPU Use Rate = %3d%%\n", g_dwCpuUseRate / 10);

    } /* while (1) */

} /* cpuRateP1sTask() */

/*****************************************************************************
 *  函数名称   : bspKillTime1ms(*)
 *  功能描述   : 占用CPU运行时间1毫秒
 *  读全局变量 : g_dwIdleDeadLoops
 *  写全局变量 : 无
 *  输入参数   : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   : 需要核准g_dwIdleDeadLoops全局变量
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2007-12-07, 
 *----------------------------------------------------------------------------
 */
void bspKillTime1ms(void)
{
    ULONG   dwLoop1, dwLoop2 = g_dwIdleDeadLoops;

    for (dwLoop1 = 0; dwLoop1 < g_dwIdleDeadLoops; dwLoop1++)
    {
        dwLoop2 = dwLoop1 ^ 0xFFFFFFFF;
    }
}

/*****************************************************************************
 *  函数名称   : cpuIdle(*)
 *  功能描述   : 空闲任务, 设置最低的优先级, 并使之一直占用CPU
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   : 该任务占用CPU的时间就表示了CPU处于空闲的时间
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-11-2 8:38, 创建函数
 *----------------------------------------------------------------------------
 */
void cpuIdle(void)
{
    while (1)
    {
        bspKillTime1ms();
        g_dwIdle1MsCount++;
    }
}

/*****************************************************************************
 *  函数名称   : bspCorrect1msRun(*)
 *  功能描述   : 核准bspKillTime1ms()延时函数, 误差不得大于1%
 *  读全局变量 : g_dwIdleDeadLoops
 *  写全局变量 : g_dwIdleDeadLoops
 *  输入参数   : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   : 
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2007-12-07, 
 *----------------------------------------------------------------------------
 */

⌨️ 快捷键说明

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