目的:
介绍UCOSII中 cpu利用率计算方法
使用方法:
1:在启动任务中调用OSStatInit();
2:在合适的地方打印OSCPUUsage,就可以得到当前系统cpu的利用率。要特别注意的是系统调用OSStart()后只有3个任务处于 就绪态,分别是
1>启动任务
2>统计任务
3>空闲任务
否则的话,就不能保证系统在OSStatInit()中计算得到的OSIdleCtrMax是准确的,因为在此期间会有其它的任务运行。
示例代码如下:
#include "print.h"
#include <stdio.h>
#include "sys_tick.h"
#include "ucos_ii.h"
#include "misc.h"
OS_STK stack_task_start[128];
OS_STK stack_task_start0[128];
OS_STK stack_task_start1[128];
void start_task0(void *p_arg)
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
for(;;)
{
OS_ENTER_CRITICAL();
printf("\start_task0 running\n");
OS_EXIT_CRITICAL();
OSTimeDly(1);
printf("OSCPUUsage = %d\n",OSCPUUsage);
}
}
void start_task1(void *p_arg)
{
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
for(;;)
{
OS_ENTER_CRITICAL();
printf("\start_task1 running\n");
OS_EXIT_CRITICAL();
OSTimeDly(1);
}
}
void start_task(void *p_arg)
{
printf("\start_task start\n");
OSStatInit();
OSTaskCreate(start_task0,(void*)0,&stack_task_start0[127],5);
OSTaskCreate(start_task1,(void*)0,&stack_task_start1[127],6);
OSTaskDel(OS_PRIO_SELF);
printf("\start_task end\n");
}
int main(void)
{
print_init();
SysTick_Configuration();
OSInit();
OSTaskCreate(start_task,(void*)0,&stack_task_start[127],4);
OSStart();
while(1)
{
}
}
结果如下:
原理:
1>系统仅仅有空闲任务运行时其在0.1s内运行的次数(Version : V2.92.07版本为0.1s)
2>系统正常运行后,如果有空闲的话,先调用统计任务(如果其就绪的话),计算CPU利用率,然后将自己睡眠0.1s,之后空闲 任务就一直运行直到其被抢占。
注:本质就是获得在0.1s内,由于cpu空闲,空闲任务中OSIdleCtr自增的次数,其除以OSIdleCtrMax就是空闲率