搜索
bottom↓
回复: 1

UCOSIII中的CPU使用率与delay

[复制链接]

出0入0汤圆

发表于 2016-7-31 21:11:32 | 显示全部楼层 |阅读模式
开门见山吧,在原子给的UCOS例程6-2《UCOSIII任务挂起和恢复》的基础上进行改动。
当delay的值为100ms时,通过串口打印显示CPU使用率如下图(并附上代码)

  1. void task1_task(void *p_arg)
  2. {
  3.     u8 task1_num=0;
  4.     OS_ERR err;
  5.     CPU_SR_ALLOC();
  6.     p_arg = p_arg;
  7.      
  8.     POINT_COLOR = BLACK;
  9.     OS_CRITICAL_ENTER();
  10.     LCD_DrawRectangle(5,110,115,314);   //画一个矩形
  11.     LCD_DrawLine(5,130,115,130);        //画线
  12.     POINT_COLOR = BLUE;
  13.     LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
  14.     OS_CRITICAL_EXIT();
  15.     while(1)
  16.     {
  17.         task1_num++;    //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
  18.         LED0= ~LED0;
  19.         printf("任务1已经执行:%d次\r\n",task1_num);
  20.         if(task1_num==5)
  21.         {
  22.             OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2
  23.             printf("任务1挂起了任务2!\r\n");
  24.         }
  25.         if(task1_num==10)
  26.         {
  27.             OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err); //任务1运行10次后恢复任务2
  28.             printf("任务1恢复了任务2!\r\n");
  29.         }
  30.         printf("CPU使用率:%d(0~10000)\r\n",OSStatTaskCPUUsage);
  31.         LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域
  32.         LCD_ShowxNum(86,111,task1_num,3,16,0x80);   //显示任务执行次数
  33.         OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //延时100ms
  34.          
  35.     }
  36. }

  37. //task2任务函数
  38. void task2_task(void *p_arg)
  39. {
  40.     u8 task2_num=0;
  41.     OS_ERR err;
  42.     CPU_SR_ALLOC();
  43.     p_arg = p_arg;
  44.      
  45.     POINT_COLOR = BLACK;
  46.     OS_CRITICAL_ENTER();
  47.     LCD_DrawRectangle(125,110,234,314); //画一个矩形
  48.     LCD_DrawLine(125,130,234,130);      //画线
  49.     POINT_COLOR = BLUE;
  50.     LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
  51.     OS_CRITICAL_EXIT();
  52.     while(1)
  53.     {
  54.         task2_num++;    //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
  55.         LED1=~LED1;
  56.         printf("任务2已经执行:%d次\r\n",task2_num);
  57.         LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数
  58.         LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域
  59.         OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //延时100ms
  60.     }
  61. }
复制代码


当delay的值为1s时,通过串口打印显示CPU使用率如下图(并附上代码)

  1. //task1任务函数
  2. void task1_task(void *p_arg)
  3. {
  4.     u8 task1_num=0;
  5.     OS_ERR err;
  6.     CPU_SR_ALLOC();
  7.     p_arg = p_arg;
  8.      
  9.     POINT_COLOR = BLACK;
  10.     OS_CRITICAL_ENTER();
  11.     LCD_DrawRectangle(5,110,115,314);   //画一个矩形
  12.     LCD_DrawLine(5,130,115,130);        //画线
  13.     POINT_COLOR = BLUE;
  14.     LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
  15.     OS_CRITICAL_EXIT();
  16.     while(1)
  17.     {
  18.         task1_num++;    //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
  19.         LED0= ~LED0;
  20.         printf("任务1已经执行:%d次\r\n",task1_num);
  21.         if(task1_num==5)
  22.         {
  23.             OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2
  24.             printf("任务1挂起了任务2!\r\n");
  25.         }
  26.         if(task1_num==10)
  27.         {
  28.             OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err); //任务1运行10次后恢复任务2
  29.             printf("任务1恢复了任务2!\r\n");
  30.         }
  31.         printf("CPU使用率:%d(0~10000)\r\n",OSStatTaskCPUUsage);
  32.         LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域
  33.         LCD_ShowxNum(86,111,task1_num,3,16,0x80);   //显示任务执行次数
  34.         OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
  35.          
  36.     }
  37. }

  38. //task2任务函数
  39. void task2_task(void *p_arg)
  40. {
  41.     u8 task2_num=0;
  42.     OS_ERR err;
  43.     CPU_SR_ALLOC();
  44.     p_arg = p_arg;
  45.      
  46.     POINT_COLOR = BLACK;
  47.     OS_CRITICAL_ENTER();
  48.     LCD_DrawRectangle(125,110,234,314); //画一个矩形
  49.     LCD_DrawLine(125,130,234,130);      //画线
  50.     POINT_COLOR = BLUE;
  51.     LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
  52.     OS_CRITICAL_EXIT();
  53.     while(1)
  54.     {
  55.         task2_num++;    //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
  56.         LED1=~LED1;
  57.         printf("任务2已经执行:%d次\r\n",task2_num);
  58.         LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数
  59.         LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域
  60.         OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
  61.     }
  62. }
复制代码

注意两段代码OSTimeDlyHMSM(); 的差别,其他均相同。CPU查看代码为printf("CPU使用率:%d(0~10000)\r\n",OSStatTaskCPUUsage);
//*********************************************
问1:用                                                            OSStatTaskCtr
*                 OSStatTaskCPUUsage = 100 * (1 - ----------------------------------) (units are in %)
*                                                                   OSStatTaskCtrMax
UCOSIII是用这种方法得到CPU的使用率的,我发现似乎和delay有这较大的关系,如果不用delay,CPU使用率为0,(当然对于这个程序不用delay实验效果也会不同)。那么OSStatTaskCPUUsage 和delay有这什么联系呢?
问2:如果单片机需要高频率采集数据,处理数据,这样就不适合用delay了,那么该怎么得到CPU的使用率呢?
注:以上的delay泛指可以或者不能引起任务调度的延时函数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2016-7-31 22:12:52 | 显示全部楼层
如果不用delay,CPU使用率为0?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 14:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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