📄 bspmcpu.c
字号:
/*****************************************************************************
* 版权所有(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 + -