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

2023-05-16

写在前面:因为实际使用需求,学习了一段时间FreeRTOS。从FreeRTOS的市场占有率来看,网上的资料应该很多,但是在学习过程中尤其是遇到问题的时候,发现真正有用的资料并不多。
所以写这篇文章的目的有二。一:方便初学者快速的入门;二:对自己这一阶段的学习进行一个阶段性的小结,接下来有时间的话会更多地将自己的学习成果进行分享。
因为笔者也不过是个短时间的初学者,难免会有疏漏和差错,仅供参考。同时也欢迎大佬批评指教。不吝赐教 : )

开篇:上干货

笔者根据数日来的学习经验,总结出来的FreeRTOS的知识框架。下文会有相应部分的解释。
知识框架

一.任务

1)基本属性

1.1)优先级

  • 1.每个任务分配一个从0~configMAX_PRIORITIES-1的优先级,优先级的数字越低表示任务的优先级越低;

  • 2.高优先级抢占低优先级:

当一个任务A正在运行,另外一个任务B(优先级高于A)阻塞时间到或者事件触发处于就绪态,那么B会从A那抢占处理器,B开始运行,A停止运行;

FreeRTOS 调度器确保处于就绪态或运行态的高优先级的任务获取处理器使用权,换句话说就是处于就绪态的最高优先级的任务才会运行。

  • 3.时间片轮转:

当宏configUSE_TIME_SLICING定义为1 的时候多个任务可以共用一个优先级,数量不限。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。

1.2)任务控制块/任务堆栈

1.任务控制块:

FreeRTOS的每个任务都有一些属性需要存储,FreeRTOS把这些属性集合到一起用一个结构体来表示,这个结构体叫做任务控制块。

属性:任务名字,优先级,任务堆栈大小,任务句柄等。

2.任务堆栈:

FreeRTOS之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,任务调度器在进行任务切换的时候会将当前任务的现场 (CPU寄存器值等 )保存在此任务的任务堆栈中,等到此任务下次运行的时候就会先用堆栈中保存的值来恢复现场 ,恢复现场以后任务就会接着从上次中断的地方开始运行。

2)状态

  • 运行态:
    当一个任务正在运行时,那么就说这个任务处于运行态, 处于运行态的任务就是当前正在使用处理器的任务。 如果使用的是核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。

  • 就绪态:
    处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起 可以运行的任务,但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!

  • 阻塞态:
    如果一个任务当前正在等待某个外部事件的话就说它处于阻塞态,比如说如果某个任务调用了函数 vTaskDelay()的话就会进入阻塞态, 直到延时周期完成。

    任务在等待队列、信号量、事件组、通知或互斥信号量的时候也会进入阻塞态 。任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!

  • 挂起态
    像阻塞态一样,任务进入挂起态以后也不能被调度器调用进入运行态,
    但是进入挂起态的任务没有超时时间。任务进入和退出挂起态通过调用函数 vTaskSuspend()和 xTaskResume()
    任务之间的切换关系:
    四种任务状态切换

    3)操作

    创建相对于删除;挂起相对于恢复

二.机制

1)队列

  • 1.所有的通信和同步机制都是基于队列实现的
  • 2.队列不但可以传递数组,也可以传递结构体

2)信号量

信号量是深度为1的队列。

3)任务通知

任务通知来代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高。

4)低功耗模式

4.1)STM32支持的低功耗模式

1 sleep:睡眠

在 SLEEP 模式下,只有内核停止了工作,而外设仍然在运行。
在进入 SLEEP 模式后,所有中断(‘外部中断、串口中断、定时器中断等’)均可唤醒 MCU,从而退出 SLEEP 模式。

2 stop:停止

在 STOP 模式下,内核停止工作,并且所有的时钟(如 HCLK, PCLK1, PCLK2 等)也停止工作,即所有外设停止工作,这里有一点要特别注意,此时 SYSTICK 也会被停掉。当然,我们产品中的 RTC 还在继续运行,因为它的时钟源为外部的 32.768K 晶振。

在进入 STOP 模式后,只有外部中断(EXTI)才能唤醒 MCU由于 RTC 中断挂在外部中断线上,所以 RTC 中断也能唤醒 MCU)。

3 standby:待机

在 STANDBY 模式下,内核、所有的时钟、以及后备 1.2V 电源全部停止工作。

从 STANDBY 模式中唤醒后,系统相当于执行了一次复位操作,程序会从头来过。

4.2)空闲任务的钩子函数实现的低功耗

1.钩子函数

通过空闲任务钩子函数(或称回调,hook, or call-back),可以直接在空闲任务中添
加应用程序相关的功能。空闲任务钩子函数会被空闲任务每循环一次就自动调用一次。
通常空闲任务钩子函数被用于:

  • 执行低优先级,后台或需要不停处理的功能代码。
  • 测试处系统处理裕量(空闲任务只会在所有其它任务都不运行时才有机会执行,所
    以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富余的处理时
    间)。
  • 将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能
    需要处理的时候,系统自动进入省电模式。

FreeRTOS是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低能耗。一般会在空闲任务的钩子函数中执
行低功耗相关处理,比如设置处理器进入低功耗模式(上面4.1提到的三种方式)、关闭其他外设时钟、降低系统主频等等。

4.3)Tickless 模式

FreeRTOS系统提供的低功耗模式,当处理器进入空闲任务周期以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时侯处理器才会从低功耗模式中唤醒。

5)列表和列表项

列表是FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。

6)内存管理

内存管理是一个系统基本组成部分,FreeRTOS中大量使用到了内存管理,比如创建任务、信号量、队列等会自动从堆中申请内存。用户应用层代码也可以 FreeRTOS提供的内存管理函数来申请和释放内存。

三.API函数

开篇图中简单地列出了几个API函数,如任务创建;任务挂起;队列创建;信号量创建等。
写在最后:后续会陆续写出各个部分更详细的说明使用方法,以及例程。
感谢阅读:)
欢迎关注公众号,干货满满。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于FreeRTOS初学者,FreeRTOS整体知识框架 的相关文章

  • 【剑指offer】数组中重复的数字

    解法1 重排序法 抓住题目中的特点 xff0c 由于数组的所有数字都在0 n 1范围内 xff0c 所以数据的范围和下标的范围是一样的 线性扫描数组 xff0c 将扫描到的数放到它对应的下标位置上 若对应位置上已经有这个数则可以判断这是一个
  • 【剑指offer】删除链表的节点

    遍历链表 xff0c 判断当前节点是否为给定删除值 xff0c 是则将其删除 xff08 让该节点的父节点指向其子节点 xff09 实现时可以在链表头部加一个临时节点 xff0c 方便处理待删节点在第一个的情况 span class tok
  • 【剑指offer】栈的压入、弹出序列

    解题思路 由于出栈序列会存在很多种可能 xff0c 例如入栈顺序为1 2 3 4 5 xff0c 可能的出栈序列为1 2 3 4 5 4 5 3 2 1等等 xff0c 不可能将所有序列进行穷举 xff0c 因此需要按照入栈序列和出栈序列进
  • 【剑指offer】数字序列中某一位的数字

    解法一 如下图所示 xff0c 将字符序列按照位数分为多个区域 xff0c 蓝色区域共有10个数 xff0c 每个数一位 xff0c 占10位 xff0c 橙色区域共90个数 xff0c 每个数两位 xff0c 占180位 xff0c 以此
  • 【剑指offer】二叉搜索树的第k个节点

    利用二叉搜索树的特点 xff0c 左边节点的值 lt 中间节点的值 lt 右边节点的值 xff0c 对二叉树进行中序遍历即可 通过res保存值 xff0c count记录遍历了多少个 中序遍历是在中间输出节点 xff0c 所以count在中
  • Linux查看文件占用空间、磁盘剩余、设备挂载情况

    查看文件占用空间 命令为du sh file xff0c 表示disk usage xff0c sh为可选参数 xff0c s表示short xff0c h表示human xff0c 即输出简短的信息 xff0c 适合人类查看 xff0c
  • Linux磁盘分区挂载

    输入lsblk命令查看当前各磁盘分区情况 xff0c 可以看到 xff0c sdb硬盘有1 2 5三个分区 xff0c sdb5挂载在根目录 下 xff08 即根目录的文件都存在sdb5分区 xff09 sda硬盘没有分区也没有挂载到任何目
  • win10 latex - Texlive+Texstudio安装

    安装Texlive环境 通过清华大学开源软件镜像站进行下 xff0c https mirrors tuna tsinghua edu cn ctan systems texlive Images 打开镜像 xff0c 双击bat文件 xff
  • 二叉搜索树的后序遍历序列

    由于输入的是后序遍历序列 xff0c 首先我们可以确定序列的最后一个位置为根节点 由于二叉搜索树的左子树比根节点小 xff0c 根节点比右子树小 xff0c 因此我们需要判断根节点的左右子树是否满足该条件 xff0c 关键是找到其左子树和右
  • 【剑指offer】二叉树中和为某一值的路径(一)

    直接对二叉树进行前序遍历 xff0c 每次累加当前节点的值 xff0c 如果到达叶子节点 xff0c 判断当前累加和是否等于给定值 xff0c 是则返回true xff0c 否则继续遍历二叉树 xff0c 若找不到则返回false span
  • Docker 容器互联

    1 基于 Volume 互联 1 1 存储 Driver Aufs Docker最早支持的driver xff0c 但它只是Linux内核的一个补丁集 Device Mapper xff1a Linux2 6 内核提供的一种从逻辑设备到物理
  • torch.cdist高效计算大矩阵相似度

    问题定义 现有矩阵 A R N C
  • 【剑指offer】二叉搜索树与双向链表

    双向链表从左到右的顺序很明显就是中序遍历二叉树输出的顺序 xff0c 因此核心思想就是使用中序遍历 xff0c 在遍历过程中调整指针的指向 需要用到两个全局变量 xff08 递归的题目不用吝啬全局变量 xff09 xff0c c u r N
  • win10远程计算机

    确保被控制电脑远程功能开启 控制面板 61 61 gt 允许远程访问 选中允许远程连接到此计算机 查看被控制电脑的用户名和ip 命令行 query user xff0c 下面的用户名为远程登录的用户名 密码为改账户的登录密码 xff08 不
  • 【剑指offer】对称的二叉树

    递归法 通过两个指针同时递归遍历左右两个子树 xff0c 判断当前遍历到的两个节点是否相等 如下图 xff0c 需要注意的是 xff0c 左右子树的遍历不是完全一样 xff0c 左子树采用左右遍历 xff0c 右子树采用右左遍历 xff0c
  • 【剑指offer】判断是不是平衡二叉树

    这题只需要在求二叉树深度的基础上扩展一下即可 xff0c 下面为求二叉树深度的代码 span class token keyword public span span class token class name HashMap span
  • Linux查看硬盘属性(机械硬盘/固态硬盘)

    通过命令lsblk d o name rota查看 xff0c 0表示固态硬盘 xff0c 1表示机械硬盘 xff0c sda为机械硬盘 xff0c sdb为固态硬盘
  • python计算众数scipy

    计算如下数组中每一行的众数 xff0c 期望结果 xff0c 第一行为1 xff0c 第二行为3 0 0 1 1 1 2 3 3 2 3 使用scipy 的统计包stats中的mode函数 xff0c 指定第二个维度 xff0c 返回元组
  • 【剑指offer】序列化二叉树

    解题思路 序列化时 xff0c 可以通过各种遍历方法 xff0c 例如层序遍历 递归遍历对二叉树进行遍历 xff0c 遍历过程中将每个节点的值拼接到字符串中 xff0c 注意每个节点之间用一个标识符隔开 xff0c 例如 xff0c 这是为
  • Linux cuda11.1安装torch_scatter,torch-sparse,torch-cluster,torch-spline-conv,torch-geometric

    创建虚拟环境 conda create n torch18 span class token assign left variable python span span class token operator 61 span span c

随机推荐

  • pytorch查看张量占用内存大小

    element size返回单个元素的字节大小 xff0c nelement返回元素个数 span class token keyword import span torch a span class token operator 61 s
  • MySQL8.0 集群安装 (K8S)

    尝试了很多版本的mysql镜像 xff0c 都存在这样那样的的问题 原始需求中 xff0c 需要同时支持x86 64 AMD64 和aarch64 ARM64V8 xff0c 最后找到Oracle官方出品的MySQL Server 8 0镜
  • 使用latex导出IEEE文献格式

    创建一个tex文件 xff0c 内容如下 documentclass span class token punctuation span a4paper span class token punctuation span 10pt span
  • IDEA中设置python解释器(不同虚拟环境)

    按住Ctrl 43 Shift 43 Alt 43 s xff0c 或 File gt Project Structure xff0c 在Module SDK处下拉找到对应的python解释器 xff0c 如果第一次添加python解释器
  • TF-IDF

    TF IDF xff08 term frequency inverse document frequency xff09 是一种用于信息检索与数据挖掘的常用加权技术 TF意思是词频 Term Frequency xff0c IDF意思是逆文
  • 第一次写博客-C/C++软件开发工程师需要学习哪些东西?

    学习路线概述 概述数据结构和算法操作系统计算机网络数据库设计模式 概述 作为一名本科机械电子 xff0c 研究生研究计算机视觉方向的211应届毕业生 xff0c 如何才能从事C C 43 43 软件开发类的工程师呢 xff1f 如果能有机会
  • Vue中使用v-for不能用index作为key值

    今天在改一个项目 xff0c 有一个 lt el tabs gt 的列表循环 xff0c 需要根据权限控制列表项的显示 xff0c 代码如下 xff1a span class token operator lt span template
  • java 冒泡排序 选择排序 插入排序及其异同点

    交换两坐标位置的swap 函数 之后要用到 span class token keyword public span span class token keyword static span span class token keyword
  • 自抗扰(ADRC)控制原理及控制器设计

    自抗扰控制是在PID控制算法基础上进行改进的新型控制方法 xff0c 它具有不依赖于控制对象模型 不区分系统内外扰的结构特点 常用的自抗扰控制器主要由跟踪微分器 xff08 Tracking Differentiator xff0c TD
  • LQR控制基本原理(包括Riccati方程具体推导过程)

    全状态反馈控制系统 状态反馈控制器 通过选择K xff0c 可以改变的特征值 xff0c 进而控制系统表现 LQR控制器 最优控制 xff0c 其本质就是让系统以某种最小的代价来让系统运行 xff0c 当这个代价被定义为二次泛函 xff0c
  • 运行VINS-Fusion时找不到vins_node节点的问题解决

    问题 xff1a 在执行 rosrun vins vins node span class token operator span span class token operator span catkin ws span class to
  • Faster RCNN(Pytorch版本)代码及理论笔记

    文章目录 前言一 Faster RCNN整体流程二 PASCAL VOC2012数据集1 简介2 下载方式3 文件结构及含义 三 加载数据集四 数据预处理1 流程2 标准化数据3 缩放4 将图片处理为统一尺寸5 数据预处理的输入输出 五 B
  • K8S 网络CNI

    1 简介 CNI 容器网络接口 Container Network Interface xff1a 由Google和Core OS主导制定的容器网络标准 xff0c 它仅仅是一个接口 xff0c 具体的功能由各个网络插件自己去实现 xff1
  • 二叉树-前-中-后序遍历

    二叉树 二叉树概念 xff1a 1 空树 2 非空 xff1a 根节点 xff0c 根节点的左子树 xff0c 根节点的右子树组成 注意 xff01 注意 xff01 时刻记得二叉树是根 xff0c 根的左子树 xff0c 根的右子树 xf
  • 变量的声明与定义&&内部函数与外部函数

    1 变量的声明与定义 对于函数 声明部分是对有关标识符 xff08 变量 函数 结构体 xff09 的属性进行声明 xff1b 函数的声明是函数的原型 xff0c 而函数的定义是对函数功能的定义 对被调函数的声明是放在主调函数的声明部分 x
  • 《Java面向对象编程(阿里云大学)》笔记(文档+思维导图)

    课程链接 xff1a https edu aliyun com course 1011 xff08 还是建议去看课程 xff0c 笔记仅供参考 由于文中的所有内容均为手敲 xff0c 并且有些代码并未验证 xff0c 因此如有错误 xff0
  • 《JDBC数据库开发进阶(阿里云大学》笔记(文档+思维导图)

    第1章 xff1a 事务处理 课时1 xff1a 事务的四大特性 xff08 ACID xff09 课时2 xff1a MySQL中开启和关闭事务 课时3 xff1a JDBC中完成事务处理 在JDBC中处理事务 xff0c 都是通过Con
  • PyCharm使用教程 --- 7、使用PyCharm进行DeBug调试

    很多新手朋友对PyCharm的使用无从下手 xff0c 于是花费了一点时间整理这份PyCharm操作手册 xff0c 完整PDF下载 xff1a 终于写完了 xff01 PyCharm操作手册 V1 0版本 PDF下载 目录如下 xff1a
  • FreeRTOS中断和任务之间的队列,自定义串口通讯协议

    本文提供这样一种方法 xff1a FreeRTOS中串口接收数据中断 xff0c 然后通过队列将数据传递给任务A xff0c 在任务A中对数据进行处理 xff0c 串口使用的通讯协议为自定义 依次给出了串口的初始化 中断服务函数 任务A x
  • 适用于FreeRTOS初学者,FreeRTOS整体知识框架

    写在前面 xff1a 因为实际使用需求 xff0c 学习了一段时间FreeRTOS 从FreeRTOS的市场占有率来看 xff0c 网上的资料应该很多 xff0c 但是在学习过程中尤其是遇到问题的时候 xff0c 发现真正有用的资料并不多