谷动谷力

 找回密码
 立即注册
查看: 1587|回复: 0
打印 上一主题 下一主题
收起左侧

FreeRTOS 任务调度 (单核、AMP 和 SMP)

[复制链接]
跳转到指定楼层
楼主
发表于 2022-2-26 23:17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FreeRTOS 任务调度
(单核、AMP 和 SMP)


本页概述了适用于单核、非对称多核 (AMP) 和对称多核 (SMP) RTOS 配置的 FreeRTOS 调度算法。调度算法是决定哪个 RTOS 任务应该处于运行状态的软件例程。在任何给定时间,每个处理器内核只能有一个处于运行状态的任务。AMP 是每个处理器内核运行自己的 FreeRTOS 实例的地方。SMP 是一个 FreeRTOS 实例,可跨多个内核调度 RTOS 任务
免费下载的FreeRTOS 书籍包含对基本 FreeRTOS 调度算法的更完整描述,并带有图表和示例。


默认 RTOS 调度策略(单核)

默认情况下,FreeRTOS 使用固定优先级的抢占式调度策略,具有相同优先级任务的循环时间片:
  • “固定优先级”是指调度器不会永久更改任务的优先级,尽管它可能会由于优先级继承 而暂时提高任务的 优先级。
  • “抢占式”意味着调度程序始终运行能够运行的最高优先级 RTOS 任务,而不管任务何时能够运行。例如,如果中断服务例程 (ISR) 更改了能够运行的最高优先级任务,调度程序将停止当前正在运行的低优先级任务并启动高优先级任务——即使这发生在一个时间片内。在这种情况下,较低优先级的任务被称为已被较高优先级的任务“抢占”。
  • “循环”是指共享优先级的任务轮流进入运行状态。
  • “时间片”意味着调度程序将在每个滴答中断上在同等优先级的任务之间切换 - 滴答中断之间的时间是一个时间片。(滴答中断是 RTOS 用来测量时间的周期性中断。)

使用优先级抢占式调度器 - 避免任务饥饿

始终运行能够运行的最高优先级任务的结果是,从不进入阻塞或挂起状态的高优先级任务将永久饿死任何执行时间的所有低优先级任务。这就是为什么通常最好创建事件驱动的任务的原因之一。例如,如果一个高优先级任务正在等待一个事件,它不应该为该事件循环(轮询),因为通过轮询它总是在运行,因此永远不会处于阻塞或挂起状态。相反,任务应该进入阻塞状态以等待事件。可以使用许多FreeRTOS 任务间通信和同步原语之一将事件发送到任务. 接收到该事件会自动将较高优先级的任务从阻塞状态中移除。较低优先级的任务将在较高优先级的任务处于阻塞状态时运行。

配置 RTOS 调度策略

以下 FreeRTOSConfig.h 设置更改了默认调度行为:
  • configUSE_PREEMPTION如果configUSE_PREEMPTIONtaskYIELD()为 0,则抢占关闭,并且仅当运行状态任务进入阻塞或挂起状态、运行状态任务调用或中断服务例程 (ISR) 手动请求 上下文切换时才会发生上下文切换。
  • configUSE_TIME_SLICING如果configUSE_TIME_SLICING为 0,则时间片关闭,因此调度程序不会在每个滴答中断时在同等优先级的任务之间切换。

FreeRTOS AMP 调度策略

使用 FreeRTOS 的非对称多处理 (AMP) 是多核设备的每个内核运行自己独立的 FreeRTOS 实例的地方。这些内核并不都需要具有相同的架构,但如果 FreeRTOS 实例需要相互通信,则确实需要共享一些内存。
每个内核都运行自己的 FreeRTOS 实例,因此任何给定内核上的调度算法都与上面针对单核系统的描述完全相同。您可以使用流或消息缓冲区作为内核间通信原语,以便一个内核上的任务可以进入阻塞状态以等待从不同内核发送的数据或事件。

FreeRTOS SMP 调度策略

使用 FreeRTOS 的对称多处理 (SMP) 是 FreeRTOS 的一个实例跨多个处理器内核调度 RTOS 任务的地方。由于只运行一个 FreeRTOS 实例,因此一次只能使用一个端口的 FreeRTOS,因此每个内核必须具有相同的处理器架构并共享相同的内存空间。
FreeRTOS SMP 调度策略使用与单核调度策略相同的算法,但与单核和 AMP 方案不同,SMP 导致在任何给定时间有多个任务处于运行状态(有一个运行状态任务每个核心)。这意味着不再假设低优先级任务仅在没有更高优先级任务可以运行时才会运行。要了解原因,请考虑 SMP 调度程序如何选择在双核微控制器上运行的任务,当最初有一个高优先级任务和两个中等优先级任务都处于 就绪状态时. 调度器需要选择两个任务,每个内核一个。首先,高优先级任务是能够运行的最高优先级任务,因此它被选为第一个核心。这样就剩下两个中等优先级的任务作为能够运行的最高优先级的任务,因此选择一个作为第二个核心。结果是高优先级和中等优先级任务同时运行。

配置 SMP RTOS 调度策略

在将针对单核或 AMP RTOS 配置编写的代码移动到 SMP RTOS 配置时,以下配置选项会有所帮助,前提是该代码依赖于以下假设:如果存在能够运行的较高优先级任务,则较低优先级任务将不会运行。
  • configRUN_MULTIPLE_PRIORITIES如果configRUN_MULTIPLE_PRIORITIES设置为 0, FreeRTOSConfig.h则调度程序将仅在任务具有相同优先级的情况下同时运行多个任务。这可以修正编写的代码,假设一次只运行一个任务,但代价是失去 SMP 配置的一些好处。
  • configUSE_CORE_AFFINITY如果configUSE_CORE_AFFINITY在 中设置为 1 FreeRTOSConfig.h,则vTaskCoreAffinitySet()API 函数可用于定义任务可以在哪些内核上运行和不能在哪些内核上运行。使用它,应用程序编写者可以防止两个假设它们各自的执行顺序的任务同时执行。

+11

最近谁赞过

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-5-22 00:03 , Processed in 0.083890 second(s), 38 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表