谷动谷力

标题: FreeRTOS 任务调度 (单核、AMP 和 SMP) [打印本页]

作者: sunsili    时间: 2022-2-26 23:17
标题: FreeRTOS 任务调度 (单核、AMP 和 SMP)
FreeRTOS 任务调度
(单核、AMP 和 SMP)


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


默认 RTOS 调度策略(单核)

默认情况下,FreeRTOS 使用固定优先级的抢占式调度策略,具有相同优先级任务的循环时间片:

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

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

配置 RTOS 调度策略

以下 FreeRTOSConfig.h 设置更改了默认调度行为:

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 配置时,以下配置选项会有所帮助,前提是该代码依赖于以下假设:如果存在能够运行的较高优先级任务,则较低优先级任务将不会运行。






欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2