- 简述
- CPU利用率其实就是系统运行程序占用的CPU资源,表示处理器在某段时间程序运行的状况
- 如果这段时间中,程序一直占用CPU的使用权,可认为CPU利用率是100%
- uC/OS的CPU利用率统计功能需要将OS_CFG_STAT_TASK_EN置1才能使用
- CPU利用率统计初始化:OSStatTaskCPUUsageInit()
- 统计原理
- 利用空闲任务一直做加法运算的这个功能
- 假设某段时间T中,CPU一直都在空闲任务中做自增运算,这个算出来的值就是CPU空闲时候的最大值(假设100)
- -----------------------,空闲任务算出来的值为80,说明空闲资源占系统的80%,其余20%是任务占用
- 利用率计算公式:CPUUsage(%) = 100 * (1 - OSStatTaskCtr / OSStatTaskCtrMax)
- CPUUsage:利用率
- OSStatTaskCtr:空闲任务运算的值
- OSStatTaskCtrMax:空闲任务中运算的最大值
- 统计原理
- 堆栈溢出检测概念及作用
- MMU和MPU是处理器上特殊硬件,可以检测非法访问,如果任务企图访问未被允许的内存空间,就会产生警告
- STM32没有上述功能,可以使用软件模拟堆栈检测,uC/OS自带
- OS_CFG_STAT_TASK_STK_CHK_EN置1
- 检测原理:
- 略
- 统计任务:OS_StatTask()
- OS_CFG_STAT_TASK_EN置1后,系统自动创建统计任务OS_StatTask();
- 它会在任务中计算整个系统的CPU利用率,各个任务的CPU利用率和各个任务的堆栈使用信息
- 堆栈检测OSTaskStkChk()
- OS_CFG_STAT_TASK_STK_CHK_EN置1
- 任务创建选项参数包含OS_OPT_TASK_STK_CHK
- 任务堆栈大小的确定
- 堆栈大小取决于任务的需要
- 通常按计算堆栈大小乘以1.5~2倍的余量计数
- 例程
- 任务创建
/************************************************** * 函数名:static void AppTaskLed(void *p_arg) * 描述 :led应用 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskLed(void *p_arg) { OS_ERR err; (void)p_arg; for(;;) { LED1_TOGGLE; printf("AppTaskLed Running\r\n"); OSTimeDlyHMSM ( 0, 0, 1, 0, OS_OPT_TIME_DLY, & err ); //每1s发送一次 } }
- 统计
/************************************************** * 函数名:static void AppTaskStatus(void *p_arg) * 描述 :led应用 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskStatus(void *p_arg) { OS_ERR err; (void)p_arg; for(;;) { printf("------------------------------------------------------------\r\n"); printf ( "CPU利用率:%d.%d%%\r\n", OSStatTaskCPUUsage / 100, OSStatTaskCPUUsage % 100 ); printf ( "CPU最大利用率:%d.%d%%\r\n", OSStatTaskCPUUsageMax / 100, OSStatTaskCPUUsageMax % 100 ); printf ( "LED1任务的CPU利用率:%d.%d%%\r\n", AppTaskLedTCB.CPUUsageMax / 100, AppTaskLedTCB.CPUUsageMax % 100 ); printf ( "统计任务的CPU利用率:%d.%d%%\r\n", AppTaskStatusTCB.CPUUsageMax / 100, AppTaskStatusTCB.CPUUsageMax % 100 ); printf ( "LED1任务的已用和空闲堆栈大小分别为:%d,%d\r\n", AppTaskLedTCB.StkUsed, AppTaskLedTCB.StkFree ); printf ( "统计任务的已用和空闲堆栈大小分别为:%d,%d\r\n", AppTaskStatusTCB.StkUsed, AppTaskStatusTCB.StkFree ); printf("------------------------------------------------------------\r\n"); OSTimeDlyHMSM (0,0,0,500,OS_OPT_TIME_PERIODIC,&err); } }
- 任务创建
- 下载验证
- 总结
- OSStatTaskCPUUsageInit()函数初始化时,一定要在创建用户任务之前
- 参考资料:
- 正点原子《STM32F767 UCOS开发手册》
- 野火《uC/OS-III内核应用与开发》
- 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
- 官方源码
- 硬件平台:
- 正点原子阿波罗F767
- 软件平台:
- MDK5.2.5
- 库版本:
- TM32Cube_FW_F7_V1.4.0
- uC/OS-III版本
- UCOSIII 3.04
【13】uC/OS-III应用开发————>CPU利用率及堆栈检测统计(STM32F767)
最新推荐文章于 2023-10-12 21:14:59 发布