这个OSStatInit是最关键的。
[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
* 函 数 名: AppTaskStatistic
* 功能说明: 统计任务,用于实现 CPU 利用率的统计。为了测试更加准确,可以开启注释调用的全局中断开关
* 形 参: thread_input 创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 30
*********************************************************************************************************
*/
void OSStatInit (void)
{
OSStatRdy = FALSE;
tx_thread_sleep(2u); /* 时钟同步 */
//__disable_irq();
OSIdleCtr = 0uL; /* 清空闲计数 */
//__enable_irq();
tx_thread_sleep(100); /* 统计 100ms 内,最大空闲计数 */
//__disable_irq();
OSIdleCtrMax = OSIdleCtr; /* 保存最大空闲计数 *
OSStatRdy = TRUE;
//__enable_irq();
}
static void AppTaskStat(ULONG thread_input)
{
(void)thread_input;
while (OSStatRdy == FALSE)
{
tx_thread_sleep(200); /* 等待统计任务就绪 */
}
OSIdleCtrMax /= 100uL;
if (OSIdleCtrMax == 0uL)
{
OSCPUUsage = 0u;
}
//__disable_irq();
OSIdleCtr = OSIdleCtrMax * 100uL; /* 设置初始 CPU 利用率 0% */
//__enable_irq();
for (;;)
{
// __disable_irq();
OSIdleCtrRun = OSIdleCtr; /* 获得 100ms 内空闲计数 */
OSIdleCtr = 0uL; /* 复位空闲计数 */
// __enable_irq(); /* 计算 100ms 内的 CPU 利用率 */
OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
tx_thread_sleep(100); /* 每 100ms 统计一次 */
}
进入到启动任务后,其它任何任务都不要创建,先创建一个统计任务,不让执行。
启动任务延迟 100ms,延迟的这 100ms 时间基本都是空闲任务在执行,在空闲任务里面做 32 变量加 1 计算。我们就以这 100ms,变量计数的最大值作为 CPU 利用率的分母。
然后开启统计任务的执行,每 100ms 执行一次,统计即可。空闲任务此时的计数值作为分子。通过这种方式就实现了 CPU 利用率的统计。
|