OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3518|回复: 5

UCOS3的CPU利用率问题

[复制链接]

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-11
在线时间
47 小时
发表于 2016-8-18 12:32:10 | 显示全部楼层 |阅读模式
1金钱
我在写的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:%%%d\r\n ",OSStatTaskCPUUsageMax/OSStatTaskCPUUsage );                  
    printf("used/free:%d/%d\r\n ",OSStatTaskCtr,OSStatTaskCtrMax );                  
                 
          OSTaskStkChk (&Census_TaskTCB,&free,&used,&err);//  把统计任务本身的堆栈使用量也打印出来
      printf("Census_TaskTCB  used/free:%d/%d  usage:%%%d\r\n",used,free,(used*100)/(used+free));                  
                 
          OSTaskStkChk (&Task1_TaskTCB,&free,&used,&err);//  把统计任务本身的堆栈使用量也打印出来
      printf("Task1_TaskTCB  used/free:%d/%d  usage:%%%d\r\n",used,free,(used*100)/(used+free));
                 
          OSTaskStkChk (&Task2_TaskTCB,&free,&used,&err);//  把统计任务本身的堆栈使用量也打印出来
      printf("Task2_TaskTCB  used/free:%d/%d  usage:%%%d\r\n",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)
捕获.PNG
OSStatTaskCtr/OSStatTaskCtrMax固定为1;
于是我就用OSStatTaskCPUUsageMax/OSStatTaskCPUUsage来算cpu使用率(不知道对不对求解惑)
反而有时能得到数据
捕获1.PNG
那个%1就是
求大神帮我解惑

最佳答案

查看完整内容[请看2#楼]

为啥在while里面调用OSStatTaskCPUUsageInit(&err);这个函数在系统启动后初始化一次就行了,你这样反复初始化能统计到东西才怪
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-18 12:32:11 | 显示全部楼层
为啥在while里面调用OSStatTaskCPUUsageInit(&err);这个函数在系统启动后初始化一次就行了,你这样反复初始化能统计到东西才怪
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11478
金钱
11478
注册时间
2013-3-8
在线时间
1227 小时
发表于 2016-8-18 16:01:44 | 显示全部楼层
PRINTF("任务名         已用栈(B)  剩余栈(B) 栈使用率(%%)  优先级  CPU使用率(%%)  CPU最大使用率(%%)  调用次数         状态\r\n");     OSTaskStkChk (&Led0TaskTCB,&free,&used,&err);                                    PRINTF("Led0TaskTCB      %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %s\r\n\r\n",       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    %s\r\n\r\n",       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    %s\r\n\r\n",       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    %s\r\n\r\n",       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    %s\r\n\r\n",       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    %s\r\n\r\n",       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[i],&free,&used,&err);        if(LwIP_task_TCB[i].CtxSwCtr)         PRINTF("LwIP_task_TCB[%2d]%4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %s\r\n",           i,used,free,(used*100)/(used+free),LwIP_task_TCB[i].Prio,LwIP_task_TCB[i].CPUUsage/100.0,LwIP_task_TCB[i].CPUUsageMax/100.0,LwIP_task_TCB[i].CtxSwCtr,task_state[LwIP_task_TCB[i].TaskState]);     }     cpuuseage=OSStatTaskCPUUsage/100.0;   //由于算出来的是万分之几的CPU占用率,这边做了一些处理     PRINTF("任务切换次数 :%d     CPU总使用率=%3.2f%%\r\n",OSTaskCtxSwCtr,cpuuseage);
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11478
金钱
11478
注册时间
2013-3-8
在线时间
1227 小时
发表于 2016-8-18 16:02:12 | 显示全部楼层
PRINTF("任务名         已用栈(B)  剩余栈(B) 栈使用率(%%)  优先级  CPU使用率(%%)  CPU最大使用率(%%)  调用次数         状态\r\n");
    OSTaskStkChk (&Led0TaskTCB,&free,&used,&err);                              
    PRINTF("Led0TaskTCB      %4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %s\r\n\r\n",
      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    %s\r\n\r\n",
      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    %s\r\n\r\n",
      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    %s\r\n\r\n",
      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    %s\r\n\r\n",
      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    %s\r\n\r\n",
      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[i],&free,&used,&err);
      if(LwIP_task_TCB[i].CtxSwCtr)
        PRINTF("LwIP_task_TCB[%2d]%4d       %4d          %3d%%       %3d      %3.2f%%            %3.2f%%     %8d    %s\r\n",
          i,used,free,(used*100)/(used+free),LwIP_task_TCB[i].Prio,LwIP_task_TCB[i].CPUUsage/100.0,LwIP_task_TCB[i].CPUUsageMax/100.0,LwIP_task_TCB[i].CtxSwCtr,task_state[LwIP_task_TCB[i].TaskState]);
    }
    cpuuseage=OSStatTaskCPUUsage/100.0;   //由于算出来的是万分之几的CPU占用率,这边做了一些处理
    PRINTF("任务切换次数 :%d     CPU总使用率=%3.2f%%\r\n",OSTaskCtxSwCtr,cpuuseage);
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-8-18 21:13:54 | 显示全部楼层
本帖最后由 yyx112358 于 2016-8-18 21:14 编辑

统计任务初始化了吗?

#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);          //统计任务               
#endif

理论上OSStatTaskCPUUsage就是以百分数表示的使用率
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-11-10 11:29:24 | 显示全部楼层
你这就算解决了?UCOSIII里面OSStatTaskCPUUsage本身就代表统计任务的CPU利用率(放大10000倍),我想问楼主一个问题,你的任务执行次数在哪打印?我的疑惑在于统计任务每0.1S调用一次,然后在OSStatReset(&err)就会把tcb->CtxSwCtr清零。所以我想问你在哪打印的某任务的执行次数?谢啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-27 01:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表