FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

2023-11-08

一.关于FreeRTOS

1.什么是FreeRTOS?

FreeRTOS是一个迷你的实时操作系统内核。是一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。

在嵌入式领域,FreeRTOS是不多的同时具有实时性,开源性,可靠性,易用性,多平台支持等特点的嵌入式操作系统。目前,FreeRTOS已经发展到支持包含X86,Xilinx,Altera等多达30种的硬件平台,其广阔的应用前景已经越来越受到业内人士的瞩目。

2.为什么选择FreeRTOS?

  1. 具备安全性。
  2. 具备稳定性。 大量开发者使用,并保持高速增长趋势。更多的人使用可以促进发现BUG,增强了稳定性。
  3. 内容简单。 作为一个轻量级的实时操作系统,FreeRTOS本身文件非常少,其内容全部围绕着任务调度,占用的硬件资源比较少,可以应用在对成本要求严格的场合。
  4. 文档齐全。 在FreeRTOS官方网站上,可以找到所有你需要的资料。
  5. 免费、开放源码。 要知道开源不等于免费,像uC/OS,Linux都是开源的,但是一旦用于商业用途都是需要支付一定费用。FreeRTOS不旦开源,而且完全可以免费用于商业产品,这也是为什么FreeRTOS的使用者如此多,据市场调查报告显示,近10年FreeRTOS的使用量在RTOS使用榜上一直稳居前5。

在此,致敬FreeRTOS创始者Richard Barry,感谢他无私的开源精神。

插入一个采访:
问:什么精神鼓励你开发了FreeRTOS?

Richard Barry(FreeRTOS的创始人):
开发FreeRTOS的想法来自大约10多年前我经历的一个服务的项目,我的一个任务是选择一个合适的RTOS。当时可以选择的一个RTOS已经使用在该公司的商业产品里面了,但是版税极为昂贵。 而且,我们的应用仅仅需要一个很小的RTOS解决方案, 一个大的、商业的RTOS在我们这个项目中一点也没有价值。 我转而寻找一个适合的开源的RTOS,然而令我失望的是,因为没有好的文档,开源软件的学习周期太长了,还没有技术支持,软件的质量也难以让人满意。最终我只好推荐了一个商业的、没有产品版税的RTOS。

当项目结束的时候,我开始思考,有多数人会经历同样的寻找过程呢?我想只是应该有数千人计吧。 因为我是一个极客,我开始自己开发一个解决方案,从中我也找到了乐趣。 最初的FreeRTOS 版本发表了之后,很明显我的预计是正确的,的确有数千计的工程师寻找这种解决方案。

之后,我就更正式的安排和计划这个工作。首先我把使用开源的免费软件的风险列了出来,比如质量、知识产权侵权和技术支持问题,接着制定了一个可以减少以上风险的FreeRTOS开发和发行的模式。举三个例子吧,FreeRTOS遵守MISRA规范,进而保证产品的质量,使用FreeRTOS没有知识产权侵权的风险,而且通过社区和专业公司提供技术支持。可以这样说,FreeRTOS基本上就是一个商业RTOS,但是完全免费,这也就是今天人们看到FreeRTOS如此受到欢迎的原因。

———— 对话FreeRTOS创始人

二.FreeRTOS的特点

  1. 实时性: FreeRTOS可以配置成为一个硬实时操作系统内核,也可以配置为非实时型内核,甚至于部分任务是实时性的,部分不是。这一点比uC/OS-II 要灵活。
  2. 任务数量: FreeRTOS对任务数没有限制,同一优先级也可以有多个任务。这点上比uC/OS-II好。
  3. 抢占式或协作式调度算法: 任务调度既可以为抢占式也可以为协作式。采用协作式调度算法后,一个处于运行态任务除非主动要求任务切换,否则是不会被调度出运行态的。
  4. 任务调度的时间点: 调度器会在每次定时中断到来时决定任务调度,同时外部异步事件也会引起调度器任务调度。
  5. 调度算法: 任务调度算法首先满足高优先级任务最先执行,当多于1个任务具有相同的高优先级时,采用round robin算法调度。
  6. 优先级翻转: FreeRTOS没有提供优先级继承机制或其他的避免优先级翻转的方法。
  7. 任务间通信: FreeRTOS 支持队列和几种基本的任务同步机制。
    (一)消息队列: 任务间传递信息可以采用队列方式,FreeRTOS实现的队列机制传递信息是采用传值方式,因此对于传递大量数据效率有些低。但可以通过传递指针的方式提高效率。中断处理函数中读写队列都是非阻塞型的。任务中读写队列可以为阻塞型也可以配置非阻塞型。当配置为阻塞型时可以指定一个阻塞的最大时间限(Timeout)。
    (二)任务间同步: FreeRTOS 支持基本的信号量功能。FreeRTOS 采用队列来实现信号量的功能,可以认为一个值为n的信号量就是一个长度为n的队列,队列中每个元素的大小为0。这样的队列并不会浪费宝贵的内存空间。
    (三)对于死锁(Deadlock)的处理: FreeRTOS 并没有实现一种可以完全避免死锁的机制。只是通过指定一个阻塞的最大时间限(Timeout)来减少死锁现象的发生。或者说是给出了当死锁现象发生时解锁的可能。当然能不能真的解锁要依赖于使用者的处理代码是否合适。
    (四) 临界区: FreeRTOS 采用开关中断的方式实现临界区保护。任务代码中临界区可以嵌套,FreeRTOS 会自动记录每个任务中临界区嵌套的层数。
    (五)暂停调度: 与进入临界区类似,FreeRTOS 可以通过暂时关闭任务调度来保证任务代码不被更高优先级的其他任务打断,与临界区不同,关闭任务调度并不会关闭中断,这样中断处理函数仍会照常的执行。
    (六)内存分配: FreeRTOS 提供了多种内存动态分配的方法,具体程序中需要选择其中一种。最简单的内存分配方式提供了一种非常简单的固定内存分配算法,这种方式下只支持内存的分配,不支持分配内存的回收。因此,任务建立后就不能被删除。其他几种内存分配算法支持分配内存的回收,有的方法支持邻接内存块的合并,有些不支持。对我个人来说,我还是比较欣赏uC/OS-II中内存分配的方法,既保证了实时性,也具有一定的灵活性。FreeRTOS 中提供的几种方式,实时性好的功能上有缺陷,功能上完善的实时性却不好。我通常采用的方式是采用最简单的内存固定分配算法,当需要动态释放时将uC/OS-II中内存分配的代码拿来用。

———此处内容来自博客(https://blog.csdn.net/liyuanbhu/article/details/7911163)

三.如何在CubeMX上配置FreeRTOS


开发环境:CubeMX   Vesion 5.4.0
     Keil      Vesion 5.28

     
(一)首先,像往常一样需要先设置RCC、SYS以及时钟树,这里不做详细介绍。

需要提醒一点的是:裸机的时钟源默认是SysTick,但是开启FreeRTOS后,FreeRTOS会占用SysTick,所以需要需要为其他总线提供另外的时钟源。具体步骤如下图(以TIM7例)


(二)开启FreeRTOS(选择CMSIS_V1,V2我没用过),进行相关配置。详情如下:

在FreeRTOS的配置列表中有七种不同属性的配置,为其标上序号,其对应的内容为:

  1. Task and Quenes: 任务与队列的创建。
  2. Timers and Semaphores: 定时器和信号量的创建。
  3. Mutexes: 互斥量的创建。
  4. FreeRTOS Heap Usage: 用于查看堆使用情况。
  5. config parameters: 内核参数设置,用户根据自己的实际应用来裁剪定制FreeRTOS内核。
  6. Include parameters: FreeRTOS部分函数的使能。
  7. User Constants: 相关宏的定义,可以自建一些常量在工程中使用。

详情如下:

1. Task and Quenes 任务与队列:
关于任务和队列的创建,这里不做详细介绍,因为后面还会继续更新博客专门讲任务和队列创建以及对应的API函数。这里主要提醒一点:任务与队列不一定需要在CubeMX中创建,也可以在其生成的工程中调用FreeRTOS源码手动创建任务与队列。在CubeMX中创建任务本质上和在工程内创建没有什么不同,都是都调用FreeRTOS源码,只不过CubeMX会对FreeRTOS源码进行二次封装。

2. Timers and Semaphores 定时器与信号量:
用于定时器和信号量的创建

3. Mutexes 互斥量:
用于互斥量的创建

4. FreeRTOS Heap Usage 堆使用情况:

FreeRTOS Heap Usage 用于查看FreeRTOS堆的使用情况(关于堆与栈的区别)。就像电脑下载软件会占用电脑内存一样,FreeRTOS内创建任务也会占用单片机内存。除了任务,还有队列、信号量等等都会占用内存,从FreeRTOS Heap Usage 栏就能看出各部分的内存占用情况(以Bytes为单位)。

5. config parameters 系统内核配置:

对于各个内核参数的理解,内容非常多,可以参考以下文章:

1 . FreeRTOS系列第6篇—FreeRTOS内核配置说明
注:作者对FreeRTOS内核的理解非常深入,建议反复观看。

2 . STM32CubeMX中的FreeRTOS的设置之内核参数
注:作者将参数整理成表格,非常直观,也非常容易理解。如果看得不爽可以点击下载它的PDF:(CSDN下载链接)。

注意: 参数中的 Enable代表1,Disable代表0。最终内核参数的设置会生成在工程中的FreeRTOSConfig_template.h文件中。

6. Include parameters 函数使能:

各函数的功能如下图:


各函数的详细使用方法可以参考博客:

  1. FreeRTOS中Inclued parameters各参数的作用
  2. FreeRTOS系列第12篇—FreeRTOS任务应用函数

7. User Constants 用户常量

User Constants 用于设置常量

四.FreeRTOS文档资料

下面列出的是FreeRTOS比较好的学习资料:

1. FreeRTOS官网(可以下到源码与官方配套文档)

2. FreeRTOS相关API函数手册

3. 正点原子 《STM32F407+FreeRTOS开发手册》

4. 野火《FreeRTOS 内核实现与应用开发实战指南——基于Stm32》

4. FreeRTOS任务案例教学


五.同系列博客

  1. FreeRTOS+CubeMX系列第一篇——初识FreeRTOS
  2. FreeRTOS+CubeMX系列第二篇——任务的创建与删除
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS+CubeMX系列第一篇——初识FreeRTOS 的相关文章

随机推荐

  • Tableau Prep使用

    下载了 Tableau Prep 2019 1 4 版本 安装后 注册使用14天的试用版 1 连接数据源 2 创建数据流 如下图 一共创建了2个数据流 分别存到2个不同的csv文件
  • 环境变量的作用和位置

    1 当要求系统运行一个程序而没有告诉它程序所在的完整路径时 系统除了在当前目录下面寻找此程序外 还应到环境变量path中指定的路径去找 用户通过设置环境变量 来更好的运行进程 一般说的环境变量都是指系统的环境变量 2 轻松打开win10环境
  • configure交叉编译 说明

    交叉编译某个应用程序时 通常需要 configure 来生成对应的 Makefile configure 最关键的三个选项是 host HOST 指定软件运行的系统平台 如果没有指定 将会运行 config guess 来检测 build
  • YoloV8改进策略:增加分支,减少漏检

    文章目录 摘要 数据集 如何解决问题 原始网络Yolov8 改进一 改进二 改进三 总结 扩展 YoloV5增加小目标检测的分支 摘要 如何检测小目标 这个一直是比较头疼的问题 如果都是小目标还好说 我们可以采用切图的方式 如果是数据集的目
  • 目标检测——day66 Scaled-YOLOv4: Scaling Cross Stage Partial Network

    Scaled Yolov4 可伸缩跨级部分网络 Scaled YOLOv4 1 Introduction 2 Related work 2 1 Real time object detection 2 2 Model scaling 模型缩
  • Spring boot 文件下载接口

    RequestMapping xzwj 复制代码 public void xzwj HttpServletResponse res String id throws IOException String fileName 12345 png
  • ES6 Set

    ES6 Set 数据结构 定义 特殊情况 set与字符串 Set的用法 数组去重 并集 交集 差集 定义 Set对象提供了一种数据结构 类似于数组 但是没有重复值 特殊情况 Set对象存储的值具有唯一性 所以添加元素时需要判断两个元素的恒等
  • np.meshgrid()函数 以及 三维空间中的坐标位置生成 以及 numpy.repeat()函数介绍

    一 np meshgrid 函数 1 np meshgrid 介绍 X Y np meshgrid x y 代表的是将x中每一个数据和y中每一个数据组合生成很多点 然后将这些点的x坐标放入到X中 y坐标放入Y中 并且相应位置是对应的 下面是
  • Redis主从复制和哨兵模式

    Redis主从复制和哨兵模式 一 Redis主从复制 1 为什么要搭建主从模式 2 主从搭建步骤 第一步 第二步 第三步 第四步 第五步 启动从机 第六步 启动6380的客户端 二 Redis哨兵模式 1 哨兵模式是什么 2 哨兵的作用 3
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 解决MySQL命令行输入密码闪退+不能启动问题

    win10环境 新下载MySQL8 0 26 刚装完还是能用 两天没打开 突然出现了问题 下面记录一下解决过程 右键屏幕底部 打开任务管理器 服务 在服务中点击查看MySQL服务状态是否为开启 MySQL服务没有开启 搜索 cmd 右键单击
  • Ansible脚本搭建k8s平台

    1 官网下载安装virtualBox centos7镜像 2 virtualBox安装centos7镜像 参考http www cnblogs com hihtml5 p 8217062 html 3 下载安装putty通过SSH连接虚拟机
  • Linux 进程基础概念-进程状态、进程构成、进程控制

    目录 Linux 进程 进程基础概念 进程状态 进程的构成 进程控制 进程创建和终止 Linux 进程 参考 linux操作系统 进程的切换与控制 到底有啥关系 知乎 zhihu com Linux进程解析 deep explore的博客
  • 【代码】处理数据集的一些常用脚本

    前言 由于训练模型经常使用到一些处理数据集的脚本 每次重新写都蛮麻烦的 因此决定整理一下之后备用 加快效率 一些是借鉴网上的脚本但是因为时间太久找不到原链接所以比较抱歉没有贴出来原链接 还有一些是自己写的 发出来分享一下 1 voc数据集抽
  • wifi卡慢延迟高_wifi卡怎么办(wifi信号满格但网速慢解决方法)

    最近学霸君有个朋友 天天吹自己家里 100M 光纤 可每晚一起开黑王者的总是说家里 WiFi 莫名卡顿 断流 然后各种理由坑人 让它换路由器吧 又不舍得花这点钱 说是够用就行 生怕自己气成祖安人的学霸君 只好上门帮他看看是不是路由器没设置好
  • [技术发展-26]:新型信息与通信网络的数据安全

    前言 网络安全 通常指计算机网络的安全 实际上也可以指计算机通信网络的安全 计算机通信网络是将若干台具有独立功能的计算机通过通信设备及传输媒体互连起来 在通信软件的支持下 实现计算机间的信息传输与交换的系统 而计算机网络是指以共享资源为目的
  • 【idea插件开发】从0入门idea插件开发,idea插件开发教程,如何开发idea插件

    idea插件介绍 作为一枚程序员 平时最常用的ide就是IntelliJ IDEA 平时会用到各种各样的插件 通过插件的使用 提高自己的开发效率 idea具有全局性 安装好插件后 对idea生效 所有的工程均能找到 idea使用的便捷性 在
  • 单词长度(输入在一行中给出一行文本,以‘.’结束,结尾的句号不能计算在最后一个单词的长度内。在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。)

    单词长度 5分 题目内容 你的程序要读入一行文本 其中以空格分隔为若干个单词 以 结束 你要输出这行文本中每个单词的长度 这里的单词与语言无关 可以包括各种符号 比如 it s 算一个单词 长度为4 注意 行中可能出现连续的空格 输入格式
  • OpenWRT的开发

    Openwrt 官方正式的发行版是已编译好了的映像文件 后缀名bin或trx trx2 此映像文件可从Openwrt官方网站的下载页面中轻松获取到 连接地址为 OpenWrt官方网站 准备工作 在开始编译Openwrt之前需要您做些准备工作
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实