这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32F103ZET6】15:分享freeRTOS的任务调度和任务状态

共2条 1/1 1 跳转至

【STM32F103ZET6】15:分享freeRTOS的任务调度和任务状态

高工
2025-11-18 18:31:12     打赏

一:任务调度的知识分享:

调度器就是使用相关的调度算法来决定当前需要执行的哪个任务

FreeRTOS 一共支持三种任务调度方式:

1.1 抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。

1.2 时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。

这种方式类似于之前的帖子描述:

NUCLEO-U083RC学习历程35-使用任务调度实现不同任务输出-电子产品世界论坛

1.3 协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务。

二:抢占式调度:

执行过程参考帖子:【STM32F103ZET6】14:实测STM32F1的串口输出任务的挂起与恢复功能-电子产品世界论坛

    比如之前的帖子中描述的LED0,LED1,串口1输出任务;三个的优先级不同,这里分别为0,1,2三种不同的优先级别,在任务设置中设置的数值越大,优先级别越大,这点和中断向量分组:抢占优先级和响应优先级不同。程序执行过程如下所示:

1、首先LED0在运行中,在这个过程中LED1就绪了,在抢占式调度器的作用下LED1会抢占LED0的运行。

2、LED1运行过程中,串口1输出任务就绪了,在抢占式调度器的作用下串口1输出任务会抢占LED1的运行。

3、串口1输出任务运行过程中,串口1输出任务阻塞了(系统延时或等待信号量等),此时就绪态中,优先级最高的任务LED1执行

4、串口1输出任务阻塞解除了(延时到了或者接收到信号量),此时串口1输出任务恢复到就绪态中,抢占LED1的运行

抢占式执行总结如下:

1、高优先级任务,会优于低优先级的任务先执行。

2、高优先级任务不停止,低优先级任务无法执行。

3、被抢占的任务将会进入就绪态

三:时间片调度:

同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片,在FreeRTOS中,一个时间片就等于SysTick 中断周期。

比如在之前的帖子中,创建的100ms,200ms,1000ms的三个任务。

执行过程如下所示:

1、首先100ms运行完一个时间片后,切换至200ms运行。

2、1000ms运行过程中(还不到一个时间片),1000ms阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务100ms。

总结如下所示:

1、同等优先级任务,轮流执行;时间片流转

2、一个时间片大小,取决为滴答定时器中断周期。

四:任务状态:

1:运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态。

2:就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态

3:阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态 

4:挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。

几种状态的转换图如下所示:

15-1.png

总结如下:

1:运行态仅仅支持就绪态被转换。

2:挂起态,阻塞态只有在进入就绪态,才能被再次执行。




关键词: STM32F103ZET6     freeRTOS     调度    

院士
2025-11-19 10:42:57     打赏
2楼

真棒,真棒!

赞一下!

期待楼主的FreeRTOS的更多分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]