ucosii任务切换方式

之前在学习ucosii的时候,对于任务切换存有疑问,因为一直以来都信奉一句话:如果没有任务切换与挂起,OS将一直运行在当前任务。再加上看了这篇博文:ucosii任务所以一直认为如果低优先级任务里面没有强制切换,高优先级任务即使就绪也无法执行。后来经过同事指正,才意识到一直以来的理解都是错的。
其实那句话没问题,有问题的是没有理解ucosii的两种切换方式:

1任务级任务切换

高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。
最具代表性的当然是系统延时函数

2中断级任务切换

高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。
问题就出在这,我一直以为ucosii在中断结束后会进行任务切换,却忘了系统时钟中断(滴答计时器)。

关于两种切换方式,拿正点原子F103 ucosii2实验1-1来具体分析:

1.系统延时切换

ucosii任务切换方式_第1张图片
整个程序只创建了两个任务一个优先级6,一个优先级7。实际现象两个任务交替运行,我们进入delay_ms()内:
ucosii任务切换方式_第2张图片
可以看到里面就一个函数,再进入:
ucosii任务切换方式_第3张图片
ucosii最终使用的就是这个函数OSTimeDly(),再进入:
ucosii任务切换方式_第4张图片
其他不用管,很明显最后如果满足条件会调用任务切换函数:
ucosii任务切换方式_第5张图片
在这里插入图片描述
ucosii任务切换方式_第6张图片
最终我们追溯到了OSCtxSw这个实际切换任务的函数。证明了在满足一定条件下,延时过后是会触发任务切换的。

2.系统时钟中断切换

在初始化内可以看到这个函数delay_init():
ucosii任务切换方式_第7张图片
进入之后可以看到开启了SysTick:
ucosii任务切换方式_第8张图片
所以每个系统节拍都会触发SysTick中断:
ucosii任务切换方式_第9张图片
而触发任务切换的函数即OSIntExit():
ucosii任务切换方式_第10张图片

ucosii任务切换方式_第11张图片
所以在每次时钟节拍都会触发中断,一旦有高优先级任务进入就绪态,会立马切换到高优先级任务。

关于更多的任务切换具体细节与策略,推荐下面这篇博文,写的很详细:
ucos2任务切换策略

你可能感兴趣的:(stm32,嵌入式,操作系统)