📄 bspmcpu.c
字号:
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 + -