freertos之任务调度算法

介绍

所谓调度算法,就是怎么确定哪个就绪态的任务可以切换为运行状态。
通过配置文件FreeRTOSConfig.h的三个配置项来配置调度算法:configUSE_PREEMPTION (是否抢占)
configUSE_TIME_SLICING (是否轮转)
configIDLE_SHOULD_YIELD (空闲任务是否让步)

调度算法的行为主要体现在两方面:高优先级的任务先运行、同优先级的就绪态任务如何被选中。调度算法要确保同优先级的就绪态任务,能"轮流"运行,策略是"轮转调度"(Round Robin Scheduling)。轮转调度并不保证任务的运行时间是公平分配的,我们还可以细化时间的分配方法。

搭配方式:

在这里插入图片描述

### 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、付费专栏及课程。

余额充值