Ma-包 发表于 2016-7-31 21:11:32

UCOSIII中的CPU使用率与delay

开门见山吧,在原子给的UCOS例程6-2《UCOSIII任务挂起和恢复》的基础上进行改动。
当delay的值为100ms时,通过串口打印显示CPU使用率如下图(并附上代码)

void task1_task(void *p_arg)
{
    u8 task1_num=0;
    OS_ERR err;
    CPU_SR_ALLOC();
    p_arg = p_arg;
   
    POINT_COLOR = BLACK;
    OS_CRITICAL_ENTER();
    LCD_DrawRectangle(5,110,115,314);   //画一个矩形
    LCD_DrawLine(5,130,115,130);      //画线
    POINT_COLOR = BLUE;
    LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
    OS_CRITICAL_EXIT();
    while(1)
    {
      task1_num++;    //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
      LED0= ~LED0;
      printf("任务1已经执行:%d次\r\n",task1_num);
      if(task1_num==5)
      {
            OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2
            printf("任务1挂起了任务2!\r\n");
      }
      if(task1_num==10)
      {
            OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err); //任务1运行10次后恢复任务2
            printf("任务1恢复了任务2!\r\n");
      }
      printf("CPU使用率:%d(0~10000)\r\n",OSStatTaskCPUUsage);
      LCD_Fill(6,131,114,313,lcd_discolor); //填充区域
      LCD_ShowxNum(86,111,task1_num,3,16,0x80);   //显示任务执行次数
      OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //延时100ms
         
    }
}

//task2任务函数
void task2_task(void *p_arg)
{
    u8 task2_num=0;
    OS_ERR err;
    CPU_SR_ALLOC();
    p_arg = p_arg;
   
    POINT_COLOR = BLACK;
    OS_CRITICAL_ENTER();
    LCD_DrawRectangle(125,110,234,314); //画一个矩形
    LCD_DrawLine(125,130,234,130);      //画线
    POINT_COLOR = BLUE;
    LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
    OS_CRITICAL_EXIT();
    while(1)
    {
      task2_num++;    //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
      LED1=~LED1;
      printf("任务2已经执行:%d次\r\n",task2_num);
      LCD_ShowxNum(206,111,task2_num,3,16,0x80);//显示任务执行次数
      LCD_Fill(126,131,233,313,lcd_discolor); //填充区域
      OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //延时100ms
    }
}

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

//task1任务函数
void task1_task(void *p_arg)
{
    u8 task1_num=0;
    OS_ERR err;
    CPU_SR_ALLOC();
    p_arg = p_arg;
   
    POINT_COLOR = BLACK;
    OS_CRITICAL_ENTER();
    LCD_DrawRectangle(5,110,115,314);   //画一个矩形
    LCD_DrawLine(5,130,115,130);      //画线
    POINT_COLOR = BLUE;
    LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
    OS_CRITICAL_EXIT();
    while(1)
    {
      task1_num++;    //任务1执行次数加1 注意task1_num1加到255的时候会清零!!
      LED0= ~LED0;
      printf("任务1已经执行:%d次\r\n",task1_num);
      if(task1_num==5)
      {
            OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2
            printf("任务1挂起了任务2!\r\n");
      }
      if(task1_num==10)
      {
            OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err); //任务1运行10次后恢复任务2
            printf("任务1恢复了任务2!\r\n");
      }
      printf("CPU使用率:%d(0~10000)\r\n",OSStatTaskCPUUsage);
      LCD_Fill(6,131,114,313,lcd_discolor); //填充区域
      LCD_ShowxNum(86,111,task1_num,3,16,0x80);   //显示任务执行次数
      OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
         
    }
}

//task2任务函数
void task2_task(void *p_arg)
{
    u8 task2_num=0;
    OS_ERR err;
    CPU_SR_ALLOC();
    p_arg = p_arg;
   
    POINT_COLOR = BLACK;
    OS_CRITICAL_ENTER();
    LCD_DrawRectangle(125,110,234,314); //画一个矩形
    LCD_DrawLine(125,130,234,130);      //画线
    POINT_COLOR = BLUE;
    LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
    OS_CRITICAL_EXIT();
    while(1)
    {
      task2_num++;    //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
      LED1=~LED1;
      printf("任务2已经执行:%d次\r\n",task2_num);
      LCD_ShowxNum(206,111,task2_num,3,16,0x80);//显示任务执行次数
      LCD_Fill(126,131,233,313,lcd_discolor); //填充区域
      OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
    }
}
注意两段代码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泛指可以或者不能引起任务调度的延时函数。

nzk123 发表于 2016-7-31 22:12:52

如果不用delay,CPU使用率为0?
页: [1]
查看完整版本: UCOSIII中的CPU使用率与delay