其他分享
首页 > 其他分享> > uCOS学习笔记(三)高、低优先级任务之间的切换与调度

uCOS学习笔记(三)高、低优先级任务之间的切换与调度

作者:互联网

一、基础知识

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(频率)。

 

 

标签:优先级,uCOS,调度,任务,arg,低优先级,执行,CPU
来源: https://blog.csdn.net/qq_41975640/article/details/97663762