4.FreeRTOS_任务调度算法

可抢占调度与合作调度模式

在FreeRTOS中,可以配置相应的宏configUSE_PREEMPTION来设置调度的模式。

含义

可抢占调度模式:

高优先级的任务可以打断低优先级的任务,只有当高优先级的任务进入阻塞或挂起时,低优先级的任务才可以执行。

合作调度模式:

禁止抢占,不论优先级高低,都遵循谁先来到,谁运行。前面的任务不进入阻塞或挂起,后面的任务就不能够执行。

宏开关

在FreeRTOSConfig.h中,设置宏开关。具体操作如下:

当这个宏为1时,设置为可抢占调度模式。

当这个宏为0时,设置为合作调度模式。

在FreeRTOS中,常用的设置为可抢占调度模式。

时间片轮转

在FreeRTOS中,可以配置相应的宏configUSE_TIME_SLICING来设置是否进行时间片轮转。

含义

时间片轮转对应的是同级别优先级的任务,这需要先设置为可抢占调度模式。

允许时间片轮转:

同级别的优先级的任务交替执行,交替执行的周期可以设置,默认为1ms。交替执行的周期设置可以查看博文“FreeRTOS_任务管理”中的“多任务交替执行的原理”章节,下面是博文链接:

FreeRTOS_任务管理-优快云博客

禁止时间片轮转:

同级别的优先级的任务禁止交替执行,遵循谁先来到,谁运行。前面的任务不进入阻塞或挂起,后面的任务就不能够执行。

这时如果存在高优先级抢断,在高优先级运行完成之后,会进行一次任务调度。这时同级别优先级会切换下一个任务。模型如下:

宏开关

在FreeRTOSConfig.h中,设置宏开关。具体操作如下:

当这个宏为1时,设置为允许时间片轮转。

当这个宏为0时,设置为禁止时间片轮转。

在FreeRTOS中,常用的设置为允许时间片轮转。

空闲任务礼让

在FreeRTOS中,可以配置相应的宏configIDLE_SHOULD_YIELD来设置空闲任务是否礼让。

含义

空闲任务礼让对应的是   优先级为0的任务   与   空闲任务   之间的时间片流转关系,这需要先设置为可抢占调度模式和允许时间片流转。

空闲任务礼让:

空闲任务与其他任务一样,任务处理函数中也是一个while(1)。当使能礼让时,空闲任务只执行一次就触发一次调度,这样就将更多的时间分配给了其他的任务。

空闲任务不礼让:

设置为不礼让时,空闲任务与其他优先级为0的任务没有任何区别,正常的进行交替运行。

宏开关

在FreeRTOSConfig.h中,设置宏开关。具体操作如下:

当这个宏为1时,设置为允许空闲任务礼让。

当这个宏为0时,设置为禁止空闲任务礼让。

在FreeRTOS中,常用的设置为允许空闲任务礼让。

### FreeRTOS任务调度工作机制 #### 任务调度概述 FreeRTOS中的任务调度由操作系统核心完成,主要职责是从就绪列表中挑选最高优先级的任务来执行[^3]。 #### 数据结构与准备阶段 为了支持任务的创建、管理和调度,FreeRTOS定义了几种重要的数据结构用于表示任务及其状态。这些数据结构共同维护了一个全局的就绪链表,它是任务调度的基础之一[^2]。 #### 调度算法 默认情况下,FreeRTOS采用的是固定优先级抢占式的调度策略。这意味着每个任务都被赋予一个固定的优先级,在运行过程中除非发生特定情况(如资源锁定导致的优先级继承),否则此优先级保持不变。当有更高优先级的任务变为可执行状态时,当前正在运行较低优先级的任务会被立即打断并挂起等待重新获得CPU使用权;对于相同优先级下的多个任务,则采取轮转法分配处理时间[^4]。 #### 启动流程 在系统初始化期间,FreeRTOS会先建立好必要的环境,包括但不限于: - 创建至少一个空闲任务作为最低优先级的存在; - 配置Systick定时器以便提供周期性的节拍信号触发上下文切换检查; - 设置处理器模式下使用的主堆栈指针(MSP),并通过加载向量表基址完成异常响应路径设定; - 开启中断允许标志位以及使能各类硬件中断源; 最后通过发起一次SVCall软中断请求进入特权态服务例程从而正式开启多任务并发执行模型——即从所有处于就绪态的任务集合里选取最合适的那个开始真正意义上的“工作”。 ```cpp // 示例代码展示如何配置SysTick定时器以驱动tick计数 void vConfigureTimerForRunTimeStats(void){ SysTick->LOAD = configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ; SysTick->VAL = (0UL); SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值