一、基础知识
uCOS为可剥性型实时操作系统,顾名思义可剥夺型意为:
① 在系统的运行过程中高优先级任务可剥夺低优先级任务的CPU使用权。
② 低优先级任务不可打断高优先级任务。
在uCOS操作系统中,多个任务的优先级不同,而在系统的运行过程中,uCOS总是在任务就绪表里面寻找最高优先级的任务来执行。
问题:根据以上特性,是否会造成,高优先级的任务一直占用CPU资源不断的执行,而低优先级的任务得不到CPU资源永远不会执行?
答:显然这样的情况是有可能发生,低优先级任务永远不会被执行。
解决方案:在高优先级的任务的执行过程中,需在适当的时候,释放CPU资源,进行任务的调度,让低优先级的任务得到运行。
二、试验部分
本次试验,基于STM32F103RCT6,uCOSIII ,创建两个任务,任务一高优先级:打开LED1,任务二低优先级:打开LED2,
任务一:打开LED1
//此任务优先级4
void led1_open_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
LED0 = 0;//OPEN
}
}
任务二:打开LED2
//此任务优先级5
void led2_open_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
LED1 = 0;//OPEN
}
}
试验结果:只有任务一高优先级得到执行,而低优先级一直未执行
结果分析:因任务一优先级高,任务一直处于执行态,执行完成后并未释放CPU资源,相当于任务一永远在执行,而任务二优先级低,一直未被执行。
改进方法:在任务一中,添加以下代码,当任务执行完成后,主动释放CPU资源,就可实现预期结果。
//任务优先级高
void led_open_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
LED0 = 0;//OPEN
OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err); //延时5ms
//delay_ms(5);
}
}
在任务执行之后,可调用OS延时函数,有以上两种,都可进行任务的切换,因为这两个函数内部都已经封装好需进行任务切换的相关函数,关于此部分代码具体可参考UCOS开发手册。
看到这里有些朋友就在想,为什么这两个函数设置的参数都是5ms?
这与系统是时钟节拍数有关,等于说,你设置的延时时间不得低于系统的一个时钟节拍,T(秒)=1/F(频率)。在本程序中,系统的
时钟节拍周期为5ms,所以设置小于5ms的参数都没效果,只有大于等于5ms才可实现功能。
#define OS_CFG_TICK_RATE_HZ 200u
这个定义在os_cfg_app.h里面,修改参数就可实现时钟节拍周期的改变计算公式:T(秒)=1/F(频率)。