本期话题
提到 RTOS,首先会想到多任务(多线程)编程,那么 RTOS 的任务之间切换发生在什么时候呢?
聊一聊
导致任务切换的原因有很多,今天来简单总结一下任务切换发生的时机。
关于任务切换发生的时机,总结了以下几点,供参考:
(1)任务调度器启动后,会查询任务就绪列表,选择高优先级的任务开始运行。
(2)系统时钟节拍递增的时候(即时钟节拍变化的时候),会查看就绪任务列表,如果有高优先级的任务,则进行切换。否则,接着看是否有同优先级的就绪任务,若有,则切换到同优先级的任务去执行。
(3)获取信号量/互斥量的时候。在获取信号量/互斥量失败的时候,若是有等待时间,则会将当前的任务挂起,切换到其他就绪任务。
(4)释放信号量/互斥量的时候。在释放完成后,查看是否有任务等待信号量/互斥量,如果有,则进行任务切换,使其获取到信号量。
(5)通过消息邮箱/消息队列发送消息后。如果有任务阻塞在等待接收消息,那么发送消息成功后,会进行任务切换。另外一种,如果以阻塞方式发送消息,且邮箱/消息队列已满,则会挂起当前任务,切换到其他就绪任务。
(6)从邮箱/消息队列读取消息的时候。如果以阻塞方式读取消息,并且邮箱/消息队列中没有消息可读,则会进行任务切换。
(7)向事件标志组发送事件。事件发送完成后,查看是否有任务阻塞等待当前事件标志组,如果有,且等待的事件全部满足,则将其唤醒并进行任务切换。
(8)从事件标志组接收事件。如果以阻塞方式读取事件标志组,并且需要获取的事件还不满足,则挂起当前任务,切换到其他就绪任务。
(9)任务函数内部调用系统延时,挂起当前任务,切换到其他就绪任务执行。
(10)任务主动让出 CPU,调用让出 CPU 的系统函数,则会切换到其他就绪任务。
最后,不同 RTOS 的具体实现机制存在不同。还有 RTOS 提供其他的系统资源会导致任务切换,比如 RT-Thread 的内存池获取和释放会引起任务切换。
好了,先说这些。你还知道其他情况吗?
加油~
觉得文章不错,点击“分享”、“赞”、“在看” 呗!