FreeRTOS学习笔记

在网上看到的一段很形象的描述,放在这里给大家娱乐一下。

裸机开发:n个人拉屎,先进去一个拉完,下一个再来。
看门狗:如果有人拉完屎还占着,茅坑刷视频,把他拖出去
中断系统:n个人拉屎,先进去的拉完,下一个再来。如果有拉肚子的,当前在拉的人无条件让出茅坑,让拉肚子的先拉。
rtos:n个人拉屎,每个人拉10秒钟,憋住。下一个人拉,在轮询。拉肚子的可以先拉完不打断。
双核:两个茅坑
dma:拉屎的时候不用大脑操控阔约肌,由脊髓自动操控,使得大脑可以刷抖音
系统栈:就是每个人的肠胃,保存了每个人拉屎中断时剩余的屎量(当前状态的变量)
中断向量表:记录了每个人是否拉肚子和拉肚子的缓急情况,以此调度茅坑
rtos邮箱:正在拉屎的人告诉厕所管理员的信息。
局部变量:每个人肚子里剩余的屎,故拉完屎后,局部变量不再占用ram
全局变量:每个人往厕所门上贴的纸条,故全局变量地址不变且永远占据内存空间。
ram:公共厕所
阻塞式:如果一个人便秘,就一直占据茅坑,直到拉出来。
非阻塞:便秘的时候在茅坑外等待,想拉了再冲进去
flash:每个人初始的屎量,排队顺序。
ld文件:每个人家的地址和公厕的地址

1. 简介

1.1 RTOS简介

RTOS(实时操作系统)是指一类系统,如 FreeRTOS,uC/OS,RTX,RT-Thread 等,都是 RTOS 类操作系统。

FreeRTOS 由美国的 Richard Barry 于 2003 年发布。

FreeRTOS 于 2017 年被亚马逊收购,改名为 AWS FreeRTOS。

1.2 FreeRTOS优势

FreeRTOS 通过 MIT 开源许可免费分发,包括一个内核和一组不断丰富的 IoT 库,适用于所有行业领域。FreeRTOS 的构建突出可靠性和易用性

  • 开源和免费:FreeRTOS是一款开源的RTOS,采用MIT许可证发布,可以免费使用、修改和分发。

  • 轻量级设计:FreeRTOS注重轻量级设计,适用于资源受限的嵌入式系统,不占用过多内存和处理器资源。

  • 广泛应用:FreeRTOS在嵌入式领域得到广泛应用,包括工业自动化、医疗设备、消费电子产品、汽车电子等。

  • 多平台支持:FreeRTOS的设计注重可移植性,可以轻松地移植到不同的硬件平台,支持多种处理器架构。

  • 丰富的功能:提供了多任务调度、任务通信、同步等功能,适用于复杂的嵌入式应用场景。

简单来说:使用人数多,轻量级,开源免费,兼容性强,功能丰富

2. FreeRTOS基础知识

2.1 多任务处理

使用多任务操作系统可以简化原本复杂的软件应用程序的设计:

  • 操作系统的多任务处理和任务间通信功能允许将复杂的应用程序 划分为一组更小且更易于管理的任务。

  • 这种划分可以简化软件测试,确保团队分工明确,并促进代码复用。

  • 复杂的时序和排序细节将由 RTOS 内核负责,从而减轻了应用程序代码的负担。

简单来说:FreeRTOS可以帮助我们把复杂的项目细分为一小块一小块。

2.2 多任务处理与并发

常规单核处理器一次只能执行一个任务,但多任务操作系统可以快速切换任务, 使所有任务看起来像是同时在执行。下图展示了 三个任务相对于时间的执行模式。任务名称用不同颜色标示,并写在左侧。时间从左向右移动, 彩色线条显示在特定时间执行的任务。上方展示了所感知的并发执行模式, 下方展示了实际的多任务执行模式。

 简单理解:单核就是一个厕所,多核就是多个厕所。如果只有一个厕所,同一个时间只能一个人上厕所。但是想要同时上厕所,通过调度多人快速轮循上厕所看起来像是多人一起上厕所。

2.3 任务调度

由上可知想要看起来像多人上厕所,就需要一个管理人员负责调度,所以任务调度器就出现了。

调度器负责决定在任何特定时间哪个人去上厕所。

FreeRTOS 默认使用固定优先级抢占式调度策略,对同等优先级的任务执行时间片轮询调度:

  • 抢占式调度:FreeRTOS采用抢占式调度方式,允许更高优先级的任务在任何时刻抢占正在执行的低优先级任务。这确保了高优先级任务能够及时响应,并提高了系统的实时性。

  • 时间片轮询:在相同优先级的任务之间,FreeRTOS采用时间片轮转策略。每个任务执行一个时间片,如果有其他同优先级的任务等待执行,则切换到下一个任务。这有助于公平地分配CPU时间。

但是并不是说高优先级的任务会一直执行,导致低优先级的任务无法得到执行。如果高优先级任务等待某个资源(延时或等待信号量等)而无法执行,调度器会选择执行其他就绪的高优先级的任务。

简单理解:坐飞机的话分为vip通道和普通通道,你是vip说明你优先级高,你可以先上飞机。这就是抢占式调度。时间片轮训类似A,B,C三个人同时想上厕所(优先级相同),A先去拉一会(拉一个时间片)然后出出来,B再去拉一会(拉一个时间片)然后出出来,C再去拉一会(拉一个时间片)然后出出来,然后一直循环

2.4 任务状态

FreeRTOS中任务共存在4种状态:

  • 运行态:当任务实际执行时,它被称为处于运行状态。如果运行 RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。注意在STM32中,同一时间仅一个任务处于运行态。

  • 就绪态:准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态), 但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。

  • 阻塞态:如果任务当前正在等待延时或外部事件,则该任务被认为处于阻塞状态。

  • 挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。

只有就绪态可转变成运行态,其他状态的任务想运行,必须先转变成就绪态。转换关系如下:

这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表:

  • 就绪列表:pxReadyTasksLists[x],其中x代表任务优先级数值。

  • 阻塞列表:pxDelayedTaskList。

  • 挂起列表:xSuspendedTaskList。

  每种状态都维护了一个列表List(其实用的链表):
        就绪态是特殊的:
            ① 维护一个32bit的变量,对应优先级有任务,对应的bit位置1,方便查找;
            ② 每一个优先级,都单独维护了一个列表(链表),相同优先级的任务在同一个列表中

代码实现:如果想使用状态机实现一个音乐播放器

 char status = 'C';
 
 switch (status)
 
 case 'A' :
    播放处理;
    if(暂停按键) status = 'B';
    if(停止按键) status = 'C';
 
 case 'B' : 
    暂停处理;
    if(停止按键) status='C';
    if(播放按键) status='A';
 
 case 'C' : 
    停止处理;
    if(播放按键) status = 'A';

2.5 上下文切换

当一个任务执行时,它会利用处理器/微控制器寄存器,并像其他程序一样访问 RAM 和 ROM。这些资源(处理器寄存器,堆栈等)一起组成了任务执行上下文

一个任务在即将执行将两个处理器寄存器内包含的数值相加之前被挂起。 当该任务被挂起时,其他任务会执行,还可能会修改处理器寄存器的数值。恢复时, 该任务不会知道处理器寄存器已经被修改过了——如果它使用经修改过的数值, 那么求和会得到一个错误的数值。

为了防止这种类型的错误,任务恢复时必须有一个与挂起之前相同的上下文 。通过在任务挂起时保存任务的上下文,操作系统内核负责确保上下文保持不变。任务恢复时,其保存的上下文在执行之前由操作系统内核恢复。

保存被挂起的任务的上下文和恢复被恢复的任务的上下文的过程被称为 上下文切换

  • 将 TaskA在相应的处理器寄存器中的上下文保存到其任务堆栈中。

  • 将 TaskB 的上下文从其任务堆栈中恢复到相应的处理器寄存器中

在需要切换任务的时候进行上下文切换,真正执行上下文切换是在PendSV的ISR中处理的。

在FreeRTOS中有以下几个情况会触发PendSV异常产生切换:

  • RTOS 滴答中断:会处理就绪列表,判断是否要切换任务(包括抢占式、时间片轮转)。

  • 任务执行完毕:主动调用任务切换函数进行强制切换。

简单来说:切换上下文就是切换任务,任务之间相互转换到CPU的过程中难免会遇到变量名相同的情况,为保证数据的唯一性,采用上下文切换的方式进行更稳定保存现场。

3. FreeRTOS移植

3.1 简单介绍源码结构

3.1.1 源码下载地址

官网地址:FreeRTOS™ - FreeRTOS™

3.1.2 结构介绍    

所用FreeRTOS版本为202212.01版本

名称

描述

FreeRTOS

FreeRTOS内核

FreeRTOS-Plus

FreeRTOS组件,一般我们会选择使用第三方的组件

tools

工具

GitHub-FreeRTOS-Home

FreeRTOS的GitHub仓库链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值