|
开门见山吧,在原子给的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[task1_num%14]); //填充区域
- 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[13-task2_num%14]); //填充区域
- 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[task1_num%14]); //填充区域
- 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[13-task2_num%14]); //填充区域
- 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泛指可以或者不能引起任务调度的延时函数。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|