【13】uC/OS-III应用开发————>CPU利用率及堆栈检测统计(STM32F767)

  1. 简述
    1. CPU利用率其实就是系统运行程序占用的CPU资源,表示处理器在某段时间程序运行的状况
    2. 如果这段时间中,程序一直占用CPU的使用权,可认为CPU利用率是100%
    3. uC/OS的CPU利用率统计功能需要将OS_CFG_STAT_TASK_EN置1才能使用
  2. CPU利用率统计初始化:OSStatTaskCPUUsageInit()
    1. 统计原理
      1. 利用空闲任务一直做加法运算的这个功能
      2. 假设某段时间T中,CPU一直都在空闲任务中做自增运算,这个算出来的值就是CPU空闲时候的最大值(假设100)
      3. -----------------------,空闲任务算出来的值为80,说明空闲资源占系统的80%,其余20%是任务占用
    2. 利用率计算公式:CPUUsage(%) = 100 * (1 - OSStatTaskCtr / OSStatTaskCtrMax)
    3. CPUUsage:利用率
    4. OSStatTaskCtr:空闲任务运算的值
    5. OSStatTaskCtrMax:空闲任务中运算的最大值
  3. 堆栈溢出检测概念及作用
    1. MMU和MPU是处理器上特殊硬件,可以检测非法访问,如果任务企图访问未被允许的内存空间,就会产生警告
    2. STM32没有上述功能,可以使用软件模拟堆栈检测,uC/OS自带
    3. OS_CFG_STAT_TASK_STK_CHK_EN置1
    4. 检测原理:
  4. 统计任务:OS_StatTask()
    1. OS_CFG_STAT_TASK_EN置1后,系统自动创建统计任务OS_StatTask();
    2. 它会在任务中计算整个系统的CPU利用率,各个任务的CPU利用率和各个任务的堆栈使用信息
  5. 堆栈检测OSTaskStkChk()
    1. OS_CFG_STAT_TASK_STK_CHK_EN置1
    2. 任务创建选项参数包含OS_OPT_TASK_STK_CHK
  6. 任务堆栈大小的确定
    1. 堆栈大小取决于任务的需要
    2. 通常按计算堆栈大小乘以1.5~2倍的余量计数
  7. 例程
    1. 任务创建
      /**************************************************
       * 函数名: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发送一次      
          }    
      }
      

       

    2. 统计
       /**************************************************
       * 函数名: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); 
          }    
      }

       

  8. 下载验证
  9. 总结
    1. OSStatTaskCPUUsageInit()函数初始化时,一定要在创建用户任务之前
  10. 参考资料:
    1. 正点原子《STM32F767 UCOS开发手册》
    2. 野火《uC/OS-III内核应用与开发》
    3. 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
    4. 官方源码
  11. 硬件平台:
    1. 正点原子阿波罗F767
  12. 软件平台:
    1. MDK5.2.5
  13. 库版本:
    1. TM32Cube_FW_F7_V1.4.0
  14. uC/OS-III版本
    1. UCOSIII 3.04
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值