STM32F1+HAL库+FreeTOTS学习1——FreeRTOS入门
- 裸机开发与操作系统
- 嵌入式操作系统简介
- FreeRTOS简介
- FreeRTOS的几个重要概念
- 任务调度器
- 任务状态
- 状态列表
裸机开发与操作系统
在以往的嵌入式学习中,我们最常用的就是裸机开发,所谓裸机开发就是指在没有操作系统支持的情况下,直接使用裸机硬件的一种开发方式。在裸机开发中,我们往往会定义一个循环,比如while(1)来控制单片机循环内的代码,实现特定的功能;但是这样的方法存在一些问题:单片机始终受困于循环之中,虽说有各种各样的中断,让裸机开发能够应对一些较为复杂的场合,但是单片机始终无法摆脱单任务,简单应用的场合。
而操作系统的出现,则是准确的解决了裸机开发的痛点。最显著的就是让单片机不再局限于单任务,能够同时运行多个任务,处理更为复杂的任务,实现单片机芯片性能的释放。
以上为个人总结的出,操作系统具体介绍看下面:
嵌入式操作系统简介
嵌入式操作系统(Embedded Operating System)是专门设计用于嵌入式系统的操作系统,它通常运行在资源有限、功耗低、特定功能的硬件平台上,如微控制器、传感器节点、嵌入式设备等。与桌面计算机或服务器操作系统不同,嵌入式操作系统需要考虑更多的实时性、稳定性和功耗优化。
嵌入式操作系统的主要特点和功能包括:
-
实时性:对于许多嵌入式应用来说,时间的准确性和响应速度至关重要。因此,嵌入式操作系统通常提供实时调度器,能够确保任务在指定的时间内完成。
-
资源管理:由于嵌入式系统资源有限,嵌入式操作系统需要有效地管理内存、处理器时间、外设等资源。它们提供了资源分配和调度的机制,以便多个任务能够协同工作而不互相干扰。
-
低功耗设计:嵌入式操作系统通常优化了功耗管理,能够有效控制设备在不同运行状态下的能耗,延长电池寿命或者减少能源消耗。
-
实时操作:针对需要处理实时数据流或事件的应用,嵌入式操作系统能够确保及时响应和处理,如控制系统、传感器数据采集等。
-
驱动程序支持:嵌入式操作系统提供了通用的设备驱动程序接口,简化了与硬件的交互,开发者可以通过API调用来访问和控制各种硬件设备。
-
任务调度:多任务管理是嵌入式操作系统的一个重要功能。它能够管理多个任务的优先级、调度顺序以及任务之间的通信和同步。
-
通信支持:许多嵌入式系统需要与外部设备或网络进行通信。嵌入式操作系统提供了通信协议和接口支持,如串口通信、网络协议栈等。
FreeRTOS是嵌入式操作系统的一种,也是我们要学习的内容:
FreeRTOS简介
FreeRTOS(Real-Time Operating System)是一个开源的实时操作系统内核,专为嵌入式系统设计。它提供了轻量级的多任务管理、任务调度、定时器、信号量、消息队列等功能,使得开发者能够在嵌入式设备上轻松实现复杂的应用程序。
主要特点:
-
开源和免费:FreeRTOS是开源项目,采用MIT许可证,可以免费用于商业和个人项目。这使得开发者可以自由地使用、修改和分发它,同时享受开源社区的支持和贡献。
-
轻量级和高效:FreeRTOS的内核设计非常精简,占用资源少,适合运行在内存和处理器能力有限的嵌入式设备上。其任务切换速度快,响应时间短,适用于对实时性要求高的应用场景。
-
多任务管理:FreeRTOS支持多任务管理,可以同时运行多个任务,每个任务有独立的任务优先级。开发者可以利用任务调度器(scheduler)来控制任务执行的顺序和时间片分配,实现复杂的并发控制和协同工作。
-
实时调度器:内置的实时调度器确保任务能按照优先级和预定时间执行,满足实时数据处理和响应的需求。这使得FreeRTOS特别适合需要及时处理事件或数据的应用,如工业控制、汽车电子等领域。
-
资源管理:FreeRTOS提供了丰富的资源管理功能,包括内存管理、任务间通信(如信号量、消息队列、邮箱等)、定时器和事件控制等。这些功能能够有效地管理和分配设备的有限资源,提高系统的效率和稳定性。
-
可移植性:FreeRTOS支持多种架构和开发板,如ARM、AVR、PIC等,以及多种编译器,如GCC、Keil、IAR等。这种广泛的支持使得开发者可以轻松在不同硬件平台上移植和使用FreeRTOS。
-
社区支持和生态系统:FreeRTOS拥有活跃的开发社区和生态系统,提供了丰富的文档、示例代码和技术支持。开发者可以通过社区获取技术支持、交流经验,加速开发过程。
总结下来就是:免费开源、简单好用、可移植性高、可裁剪、轻量级、使用广泛。
FreeRTOS的几个重要概念
任务调度器
调度器就是使用相关的调度算法来决定当前需要执行的哪个任务,FreeRTOS 一共支持三种任务调度方式:
- 抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
- 高优先级任务,优先执行。
- 高优先级任务不停止(或者说是阻塞:任务内部在延时或者等待系统信号量等操作叫阻塞),低优先级任务无法执行。
- 被抢占的任务会进入就绪状态。
- 时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。
- 同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片,在FreeRTOS中,一个时间片就等于SysTick 中断周期
- 同等优先级任务,轮流执行;时间片流转
- 一个时间片大小,取决为滴答定时器中断周期
- 当一个任务进入阻塞,但是时间片还没用完时,会直接进入下一个任务,且下一个任务的时间片长短不变。
- 协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务,FreeRTOS现在虽然还支持,但是官方已经表示不再更新协程式调度,基本上不使用了。
任务状态
在FreeRTOS中任务一共有以下四种状态:
- 运行态:正在执行的任务处于运行态,在STM32中,同一时刻只有一个任务处于运行态,之所以说FreeRTOS能够实现多任务,是因为单片机在很短时间内依次执行多个任务,由于一个时间片间隔很短,导致好像同时在运行多个任务。
- 就绪态:表示该任务已经可以被执行,但是还没轮到它,处于就绪态
- 阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态
- 挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态
只有就绪态的任务可以变成运行态!!!
状态列表
除了运行态之外,其他状态的任务都有一个任务列表
- 就绪列表:pxReadyTasksLists[x] ,X表示优先级
- 阻塞列表:pxDelayedTaskList
- 挂起列表:xSuspendedTaskList
调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行 ,当所有任务处于同一个优先级时,会都在同一个就绪列表上