嵌入式学习小组
直播中

冉屹芳

7年用户 144经验值
私信 关注

UCOS3的CPU利用率问题怎么解决

我在写的CPU利用率程序:(改的原子哥的代码)void census_task(void *p_arg)
{
        OS_ERR err;
        CPU_SR_ALLOC();
    CPU_STK_SIZE free,used;  
        p_arg = p_arg;
         while(DEF_TRUE)
         {
        OSStatTaskCPUUsageInit(&err);
   printf("start_task used:%%%drn ",OSStatTaskCPUUsageMax/OSStatTaskCPUUsage );                  
    printf("used/free:%d/%drn ",OSStatTaskCtr,OSStatTaskCtrMax );                  
                 
          OSTaskStkChk (&Census_TaskTCB,&free,&used,&err);//  把统计任务本身的堆栈使用量也打印出来
      printf("Census_TaskTCB  used/free:%d/%d  usage:%%%drn",used,free,(used*100)/(used+free));                  
                 
          OSTaskStkChk (&Task1_TaskTCB,&free,&used,&err);//  把统计任务本身的堆栈使用量也打印出来
      printf("Task1_TaskTCB  used/free:%d/%d  usage:%%%drn",used,free,(used*100)/(used+free));
                 
          OSTaskStkChk (&Task2_TaskTCB,&free,&used,&err);//  把统计任务本身的堆栈使用量也打印出来
      printf("Task2_TaskTCB  used/free:%d/%d  usage:%%%drn",used,free,(used*100)/(used+free));
          OStimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
         }                        
}
找的资料是说                                              OSStatTaskCtr
                 OSStatTaskCPUUsage = 100 * (1 - ------------------)     (units are in %)
                                                             OSStatTaskCtrMax
可是我不管怎么算CPU使用率都为0,串口显示是这样的(%0下面那一行就是OSStatTaskCtr/OSStatTaskCtrMax)

OSStatTaskCtr/OSStatTaskCtrMax固定为1;
于是我就用OSStatTaskCPUUsageMax/OSStatTaskCPUUsage来算cpu使用率(不知道对不对求解惑)
反而有时能得到数据

那个%1就是
求大神帮我解惑

回帖(5)

李峰

2020-5-20 14:30:51
为啥在while里面调用OSStatTaskCPUUsageInit(&err);这个函数在系统启动后初始化一次就行了,你这样反复初始化能统计到东西才怪
举报

华一颖

2020-5-20 14:39:16
PRINTF("任务名         已用栈(B)  剩余栈(B) 栈使用率(%%)  优先级  CPU使用率(%%)  CPU最大使用率(%%)  调用次数         状态rn");     OSTaskStkChk (&Led0TaskTCB,&free,&used,&err);                                    PRINTF("Led0TaskTCB      %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",       used,free,(used*100)/(used+free),Led0TaskTCB.Prio,Led0TaskTCB.CPUUsage/100.0,Led0TaskTCB.CPUUsageMax/100.0,Led0TaskTCB.CtxSwCtr,task_state[Led0TaskTCB.TaskState]);          OSTaskStkChk (&Led1TaskTCB,&free,&used,&err);                                    PRINTF("Led1TaskTCB      %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",       used,free,(used*100)/(used+free),Led1TaskTCB.Prio,Led1TaskTCB.CPUUsage/100.0,Led1TaskTCB.CPUUsageMax/100.0,Led1TaskTCB.CtxSwCtr,task_state[Led1TaskTCB.TaskState]);          OSTaskStkChk (&TCPCMDTaskTCB,&free,&used,&err);                                    PRINTF("TCPCMDTaskTCB    %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",       used,free,(used*100)/(used+free),TCPCMDTaskTCB.Prio,TCPCMDTaskTCB.CPUUsage/100.0,TCPCMDTaskTCB.CPUUsageMax/100.0,TCPCMDTaskTCB.CtxSwCtr,task_state[TCPCMDTaskTCB.TaskState]);          OSTaskStkChk (&COLLECTTaskTCB,&free,&used,&err);                                    PRINTF("COLLECTTaskTCB   %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",       used,free,(used*100)/(used+free),COLLECTTaskTCB.Prio,COLLECTTaskTCB.CPUUsage/100.0,COLLECTTaskTCB.CPUUsageMax/100.0,COLLECTTaskTCB.CtxSwCtr,task_state[COLLECTTaskTCB.TaskState]);          OSTaskStkChk (&GET_TEMPERATURETaskTCB,&free,&used,&err);                                    PRINTF("STATUS           %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",       used,free,(used*100)/(used+free),GET_TEMPERATURETaskTCB.Prio,GET_TEMPERATURETaskTCB.CPUUsage/100.0,GET_TEMPERATURETaskTCB.CPUUsageMax/100.0,GET_TEMPERATURETaskTCB.CtxSwCtr,task_state[GET_TEMPERATURETaskTCB.TaskState]);          OSTaskStkChk (&UDPDEBUGTaskTCB,&free,&used,&err);                                    PRINTF("UDPDEBUGTaskTCB  %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",       used,free,(used*100)/(used+free),UDPDEBUGTaskTCB.Prio,UDPDEBUGTaskTCB.CPUUsage/100.0,UDPDEBUGTaskTCB.CPUUsageMax/100.0,UDPDEBUGTaskTCB.CtxSwCtr,task_state[UDPDEBUGTaskTCB.TaskState]);              for(i=0;i<12;i++)     {       OSTaskStkChk (&LwIP_task_TCB,&free,&used,&err);        if(LwIP_task_TCB.CtxSwCtr)         PRINTF("LwIP_task_TCB[%2d]%4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srn",           i,used,free,(used*100)/(used+free),LwIP_task_TCB.Prio,LwIP_task_TCB.CPUUsage/100.0,LwIP_task_TCB.CPUUsageMax/100.0,LwIP_task_TCB.CtxSwCtr,task_state[LwIP_task_TCB.TaskState]);     }     cpuuseage=OSStatTaskCPUUsage/100.0;   //由于算出来的是万分之几的CPU占用率,这边做了一些处理     PRINTF("任务切换次数 :%d     CPU总使用率=%3.2f%%rn",OSTaskCtxSwCtr,cpuuseage);
举报

林明

2020-5-20 14:48:47
PRINTF("任务名         已用栈(B)  剩余栈(B) 栈使用率(%%)  优先级  CPU使用率(%%)  CPU最大使用率(%%)  调用次数         状态rn");
    OSTaskStkChk (&Led0TaskTCB,&free,&used,&err);                              
    PRINTF("Led0TaskTCB      %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",
      used,free,(used*100)/(used+free),Led0TaskTCB.Prio,Led0TaskTCB.CPUUsage/100.0,Led0TaskTCB.CPUUsageMax/100.0,Led0TaskTCB.CtxSwCtr,task_state[Led0TaskTCB.TaskState]);
   
    OSTaskStkChk (&Led1TaskTCB,&free,&used,&err);                              
    PRINTF("Led1TaskTCB      %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",
      used,free,(used*100)/(used+free),Led1TaskTCB.Prio,Led1TaskTCB.CPUUsage/100.0,Led1TaskTCB.CPUUsageMax/100.0,Led1TaskTCB.CtxSwCtr,task_state[Led1TaskTCB.TaskState]);
   
    OSTaskStkChk (&TCPCMDTaskTCB,&free,&used,&err);                              
    PRINTF("TCPCMDTaskTCB    %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",
      used,free,(used*100)/(used+free),TCPCMDTaskTCB.Prio,TCPCMDTaskTCB.CPUUsage/100.0,TCPCMDTaskTCB.CPUUsageMax/100.0,TCPCMDTaskTCB.CtxSwCtr,task_state[TCPCMDTaskTCB.TaskState]);
   
    OSTaskStkChk (&COLLECTTaskTCB,&free,&used,&err);                              
    PRINTF("COLLECTTaskTCB   %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",
      used,free,(used*100)/(used+free),COLLECTTaskTCB.Prio,COLLECTTaskTCB.CPUUsage/100.0,COLLECTTaskTCB.CPUUsageMax/100.0,COLLECTTaskTCB.CtxSwCtr,task_state[COLLECTTaskTCB.TaskState]);
   
    OSTaskStkChk (&GET_TEMPERATURETaskTCB,&free,&used,&err);                              
    PRINTF("STATUS           %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",
      used,free,(used*100)/(used+free),GET_TEMPERATURETaskTCB.Prio,GET_TEMPERATURETaskTCB.CPUUsage/100.0,GET_TEMPERATURETaskTCB.CPUUsageMax/100.0,GET_TEMPERATURETaskTCB.CtxSwCtr,task_state[GET_TEMPERATURETaskTCB.TaskState]);
   
    OSTaskStkChk (&UDPDEBUGTaskTCB,&free,&used,&err);                              
    PRINTF("UDPDEBUGTaskTCB  %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srnrn",
      used,free,(used*100)/(used+free),UDPDEBUGTaskTCB.Prio,UDPDEBUGTaskTCB.CPUUsage/100.0,UDPDEBUGTaskTCB.CPUUsageMax/100.0,UDPDEBUGTaskTCB.CtxSwCtr,task_state[UDPDEBUGTaskTCB.TaskState]);
        
    for(i=0;i<12;i++)
    {
      OSTaskStkChk (&LwIP_task_TCB,&free,&used,&err);
      if(LwIP_task_TCB.CtxSwCtr)
        PRINTF("LwIP_task_TCB[%2d]%4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %srn",
          i,used,free,(used*100)/(used+free),LwIP_task_TCB.Prio,LwIP_task_TCB.CPUUsage/100.0,LwIP_task_TCB.CPUUsageMax/100.0,LwIP_task_TCB.CtxSwCtr,task_state[LwIP_task_TCB.TaskState]);
    }
    cpuuseage=OSStatTaskCPUUsage/100.0;   //由于算出来的是万分之几的CPU占用率,这边做了一些处理
    PRINTF("任务切换次数 :%d     CPU总使用率=%3.2f%%rn",OSTaskCtxSwCtr,cpuuseage);
举报

刘艳芳

2020-5-20 15:03:49
统计任务初始化了吗?
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);          //统计任务               
#endif
理论上OSStatTaskCPUUsage就是以百分数表示的使用率
举报

更多回帖

×
20
完善资料,
赚取积分