freeRTOS调度

article/2025/8/27 4:32:40

freeRTOS调度策略

背景

 嵌入式的设备开发通常有两种模式:裸机开发和OS开发。像功能较为强大的SOC通常都会先一直linux或其他OS然后进行业务逻辑的开发;而单片机则有很多简单的应用场景直接使用裸机开发的模式,稍微复杂些的场景,会先移植OS,然后在OS的基础上开发。我认为移植OS主要有两大需求:实现多线程和更加方便的资源管理,比如内存管理。多线程的实现离不开调度器,调度器的实现又分不开现场切换和调度策略。不同OS通常会有不同的调度策略,有些大型的OS比如linux甚至于会同时支持多种调度策略。本文简单描述目前比较常见的freeRTOS调度策略。

参考资料

 所有内容均参考freeRTOS官网

具体内容

 话不多说,先上图
在这里插入图片描述
 不同于linux或者windows的进程线程概念。freeRTOS中并发的载体被称之为任务。开发者可以基于freeRTOS常见多个任务,从而实现并行运行的需求。比如:现在有个需求:现在需要通过单片机实现一个MP3播放器,该播放器带一个触摸屏,用户需要在播放音乐的同时,还可以通过触摸屏实现人机交互。这样,至少需要两个任务并发运行,一个处理音乐播放功能,一个响应触摸屏的各种功能。
 那么,freeRTOS是如何将cpu的资源分配给各个任务的呢?是能者多得,还是一碗水端平?
 首先,os会将所有的任务分配一个状态:
运行态(Running):当前正在使用cpu的任务,对于单核cpu来说,同一时刻只有一个任务能被标志为运行态。
阻塞态(blocked):当前任务需要被某一事件触发(等待时间或外部事件),才能参与调度。被触发前任务的状态就为阻塞态。通常,阻塞态的任务会设置超时时间,超时后,任务自动解除阻塞,可以参与调度。特殊情况可以一直阻塞下去。
当调度期发现任务处于阻塞态,就不会选择其进入运行态。
挂起态(suspended):挂起态的任务进入和解挂一般由一组API实现,相对于阻塞态而言,挂起和解挂的时机更具操控性。
当调度期发现任务处于挂起态,就不会选择其进入运行态。
就绪态(Ready):任务非阻塞和挂起,满足任务调度条件,就会被置为就绪态,可以参与调度器的调度。
总结:任务切换主要发生在运行态和就绪态。而就绪态更像是任务可以被调度的入场卷,只有就绪态的任务,才有可能被运行。

调度:针对单核CPU、非对称多核(AMP)CPU、对称多核(SMP)CPU。OS提供了不同的调度策略。
单核(默认):使用固定优先级的抢占式调度策略,对于同等优先级的任务执行时间片轮询策略。

抢占式调度策略:无论任务处于任何时刻(任务切换过程中还是任务运行的时间碎片内),加入调度器发现当前运行的任务不为最高优先级任务,那么调度器就会立马转去调度优先级最高的任务运行。举个例子:假如有个优先级为5的任务(该任务当前优先级最高)正在运行,突然有中断进来,将某原本优先级为4的任务修改优先级为6,那么调度器就会切换当前运行任务为优先级为6的任务。

轮询策略:是指相同优先级的任务轮流进入运行状态。

时间片:时间片为一个定时器实现,定时固定时间长度也就是时间片,调度器安排相同优先级的下一个任务开始运行。

问题:
1.如此说来,在该调度策略之下,加入高优先级的任务既不挂起也不阻塞,那岂不是低优先级的任务从来都不会有被调度的可能?
确实是这样的,那如何避免该问题发生?通常最好创建事件驱动型任务,假如某个高优先级的任务正在等待一个事件,那么就不应该使该任务处于任务轮询(事件片轮询)中,而应该将其设置为阻塞态或者挂起态。从而保证低优先级的任务不会一直处于饥饿状态。

2.中断本身也有优先级,该优先级是否会映射入任务优先级?

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

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


http://chatgpt.dhexx.cn/article/FHMRKdso.shtml

相关文章

FreeRTOS 解析

目录 Task Task State Task Priority Idle Task Run Time Statistics Task Scheduling Single-core 单核处理器 AMP 非对称多核处理器 SMP 对称多核处理器 Context Switch Inter-task Communication and Synchronization Queue 队列 Binary Semaphore 二值信号量 …

FreeRTOS队列

在实际的应用中,常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”,这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中…

FreeRTOS任务状态

1. 任务状态介绍 FreeRTOS中的任务状态,可以简单的分为运行态(running)和非运行态(not running)。 但是对于非运行态我们还可以继续细分: 阻塞状态(Blocked)暂停(挂起…

FreeRTOS延时

1、相对延时函数 将当前任务添加到阻塞列表pxDelayedTaskList,任务进入阻塞态。 vTaskDelay → prvAddCurrentTaskToDelayedList → vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) )。任务的阻塞时间更新到状态列表项xStateListItem x…

FreeRTOS多任务管理

文章目录 1、任务1.1 任务简介1.2 任务调度1.3 任务的状态 (就绪态 / 运行态 / 阻塞态 / 挂起态)1.4 空闲任务 2、动态创建两个任务2.1 定义动态内存空间的堆2.2 定义任务函数2.3 定义 任务控制块 指针2.4 动态创建任务 xTaskCreate()2.5 启动任务 vTaskStartScheduler() 3、常…

FreeRTOS 移植

源码 FreeRTOS源码 选择 FreeRTOS 的最新版本 V9.0.0(2016 年)比较稳定 1)解压后的文件 提取的文件, FreeRTOS—>Source->portable目录下的MemMang,RVDS MemMang 存放内存相关的源文件,heap_1.c,heap_2.c,he…

初识FreeRTos

初识FreeRTos Preface一、FreeRTos简介二、 为什么选择FreeRTos三、FreeRTos资料和源码的下载四、介绍我自己的开发环境4.1FreeRTos4.2AlienTek Summary Preface 距离我上一次写博客已经差不多有5个月了,最近想给自己挖个新坑,讲一讲关于FreeRTos 相关的…

FreeRTOS移植

1. 前言 本文是基于FreeRTOSv9.0.0版本的实时系统,移植到STM32F103芯片平台上。移植环境使用的是MDK5.32版本,我在移植之前就已经构建好了一个裸机工程源码了,而且已经确保了这份裸机代码是没有问题的。开始移植之前我强烈建议一定要确认自己…

FreeRTOS快速入门-初探FreeRTOS

首发,公众号【一起学嵌入式】 对于 RTOS 入门系列文章,已经更新完一款(RT-Thread): 助你快速入门 RT-Thread 这个系列的文章结合 RT-Thread,介绍过 RTOS 相关的核心知识。 接下来,开始另外一…

FreeRTOS系列|FreeRTOS简介

1. RTOS简介 RTOS全称为 Real Time Operation System,即实时操作系统。RTOS强调的是实时性,又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作,不允许超时;而软实时里对处理过程超时的要求则没有很严格。RTOS的核心就…

freertos任务基础知识(freertos篇)

多任务 对于单任务系统就是常说裸机大while循环,有的时候也需要加一些中断服务函数完成一些处理,相比于多任务而言上面的单任务系统也叫做前后台系统,即(中断服务函数叫前台程序,大while叫后台程序) 前后台…

FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架

目录 一、为什么要学习FreeRTOS 二、前言------从0到1认识FreeRTOS 1、逻辑系统与多任务系统 1.1、裸机系统:裸机系统通常分成轮询系统和前后台系统 1.2、多任务系统 2、数据结构-列表与列表项 三、任务 3.1基本属性 3.1.1任务栈 3.1.2任务控制块 3.1.3任…

一、初识FreeRTOS之FreeRTOS简介

目录 一、什么是FreeRTOS? 二、为什么选择FreeRTOS? 三、FreeRTOS的特点 四、FreeRTOS资料与源码下载 五、FreeRTOS源码文件介绍 一、什么是FreeRTOS? Free即免费的,RTOS的全称是Real time operating system,中文就是实时操作…

Docker技术入门与实战-第3版.pdf OCR 高清 可复制

Docker技术入门与实战-第3版.pdf OCR 高清 可复制 Docker技术入门与实战-第3版.pdf OCR 高清 可复制简介预览下载地址 Docker技术入门与实战-第3版.pdf OCR 高清 可复制 简介 本书从Docker基本原理开始,深入浅出地讲解Docker的构建与操作,内容系统全面…

从docker到kubernetes(k8s)入门与实战--docker教程

安装docker 装个依赖 yum -y install gcc gcc-c 卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 安装依…

Docker 入门到实战教程(二)安装Docker

一.卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…

Docker入门及进阶教程

阅读声明: 该教程笔记来源于dockers——菜鸟教程 一、Docker介绍 1. Docker教程 Docker是一个开源的容器引擎,基于Go语言并遵从Apache2.0协议开源。 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器,然后发…

Docker 实战

目录 一、常用操作 1、镜像创建 2、镜像查询 3、镜像删除 4、镜像运行 5、查询容器进程 6、查询容器执行日志 7、删除容器 8、进入容器 二、导入和导出 1、save 和 load 2、export 和 import 3、区别 三、案例 1、检查是否安装依赖 2、安装依赖 3、docker打包镜…

Docker 实战教程之从入门到提高 (四)

本系列的前三篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的工作原理。通过动手对 Nginx Docker 镜像进行修改&#xf…

Docker快速入门实战

为什么使用容器? 1、上线流程繁琐 2、资源利用率低 3、扩容/缩容不及时 4、服务器环境臃肿 5、环境不一致性 容器VS虚拟机 VM VS Container Docker 是什么 1、使用最广泛的开源容器引擎 2、一种操作系统级的虚拟化技术 3 、依赖于Linux内核特性&#xff1…