FreeRTOS 是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议。这里说 到的开源,指的是你可以免费得获取到 FreeRTOS 的源代码,且当你的产品使用了 FreeRTOS 且没有修改 FreeRTOS 内核源码的时候,你的产品的全部代码都可以闭源,不用开源,但是当 你修改了 FreeRTOS 内核源码的时候,就必须将修改的这部分开源,反馈给社区,其它应用部 分不用开源。免费的意思是无论你是个人还是公司,都可以免费地使用,不需要掏一分钱。


FreeRTOS框架



FreeRTOS框架介绍


一. 任务

1. 基本属性

1.1 优先级

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

  • 1.高优先级抢占低优先级:
    当一个任务A正在运行,另外一个任务B(优先级高于A)阻塞时间到或者事件触发处于就绪态,那么B会从A那抢占处理器,B开始运行,A停止运行;
  • 2.时间片轮转:
    当宏configUSE_TIME_SLICING定义为1 的时候多个任务可以共用一个优先级,数量不限。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。

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

1.2 任务控制块/任务堆栈

  • 1.任务控制块:
    FreeRTOS的每个任务都有一些属性需要存储,FreeRTOS把这些属性集合到一起用一个结构体来表示,这个结构体叫做任务控制块。
    属性:任务名字,优先级,任务堆栈大小,任务句柄等。
  • 2.任务堆栈:
    FreeRTOS之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,任务调度器在进行任务切换的时候会将当前任务的现场 (CPU寄存器值等 )保存在此任务的任务堆栈中,等到此任务下次运行的时候就会先用堆栈中保存的值来恢复现场 ,恢复现场以后任务就会接着从上次中断的地方开始运行。

2. 状态

  • 1.运行态:
    当一个任务正在运行时,那么就说这个任务处于运行态, 处于运行态的任务就是当前正在使用处理器的任务。 如果使用的是核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。
  • 2.非运行态:
    • 就绪态:
      处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起 可以运行的任务,但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!

    • 阻塞态:

      • 如果一个任务当前正在等待某个外部事件的话就说它处于阻塞态,比如说如果某个任务调用了函数 vTaskDelay()的话就会进入阻塞态, 直到延时周期完成。
      • 任务在等待队列、信号量、事件组、通知或互斥信号量的时候也会进入阻塞态 。任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!
    • 挂起态:
      像阻塞态一样,任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间。任务进入和退出挂起态通过调用函数 vTaskSuspend()xTaskResume()

3. 操作

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

二. 机制

1. 队列

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

2. 信号量

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

3. 任务通知

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

4. 低功耗

4.1. 低功耗模式:

  • sleep:睡眠
  • stop:停止
  • standby:待机

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

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

    • 执行低优先级,后台或需要不停处理的功能代码。
    • 测试处系统处理裕量(空闲任务只会在所有其它任务都不运行时才有机会执行,所
      以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富余的处理时
      间)。
    • 将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能
      需要处理的时候,系统自动进入省电模式。
  • 2.将处理器设置为低功耗模式
    FreeRTOS是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低能耗。一般会在空闲任务的钩子函数中执行低功耗相关处理,比如设置处理器进入低功耗模式(上面4.1提到的三种方式)、关闭其他外设时钟、降低系统主频等等。

4.2. Tickless 模式

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

5. 内存管理列表和列表项

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

6. 内存管理

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

三. API函数

FreeRTOS API函数及应用详情请阅读下面章节

第一章:任务创建、删除、延时

第二章:任务优先级

第三章:任务状态

第四章:显示任务详细信息

第五章:查看任务堆栈空间

第六章:队列

第七章:软件定时器

第八章:二值信号量

第九章:计数型信号量

第十章:互斥信号量

第十一章:递归互斥量

第十二章:事件标志组

基于 Michael_ee 老师学习 ESP32_FreeRTOS

【FreeRTOS】相关推荐

  1. 【FreeRTOS】02 任务的创建

    上一节我们利用cubemx自动生成了一个实例,它建立了两个用户任务和一个默认任务,并成功运行起来了.本节我们将分析一下FreeRTOS任务创建的过程,并结合创建时需要的参数讲解一下FreeRTOS任务 ...

  2. 【FreeRTOS】在Cortex-M4开发板上移植FreeRTOS并且实现LED灯闪烁(保姆级教程)

    相信有不少小伙伴手上只有M4的开发板,想要移植FreeRTOS:但是,网上大部分都是M3移植教程.因此,陷入深深的迷茫中,难不成只能使用仿真了???

  3. 【FreeRTOS】12 任务通知——更省资源的同步方式

    我们之前讲过信号量.消息队列.事件标志组,它们都可以实现任务间的通信和同步.本节我们讲解任务通知(Task Notifications),它是freeRTOS中实现的另一种通信和同步的方法,在一定程度 ...

  4. 【FreeRTOS】11 软件定时器

    定时器是MCU常用的外设,我们在学习各种单片机时必然会学习它的硬件定时器.但是,MCU自带的硬件定时器资源是有限的,而且一般会用在实时性要求很强的地方. 在freeRTOS中提供了软件定时器的功能,来 ...

  5. 【FreeRTOS】简介

    文章目录 一.FreeRTOS是什么? 二.发展历史 三.相似操作系统 一.FreeRTOS是什么? FreeRTOS是一款开源 免费的嵌入式设备用实时操作系统(Real Time Operating ...

  6. 【FreeRTOS】队列管理

    前言 通过阅读本文可以了解到: 如何创建队列 一个队列如何管理它包含的数据 如何发送数据至队列 如何从队列接收数据 阻塞队列意味着什么 如何阻塞多个队列 如何覆盖队列中的数据 如何清除一个队列 读取和 ...

  7. 【FreeRTOS】06 临界段的保护——关中断和关调度

    本节来讲一讲FreeRTOS如何保护临界段,先讲临界段的概念,再讲保护临界段的方法. 1)临界段的概念 简单来讲,临界段是一段执行时不允许被中断(或其他任务)打断的代码:如果被打断,就有可能运行出错. ...

  8. 源码学习 - 【FreeRTOS】PRIVILEGED_FUNCTION 含义理解

    这里写自定义目录标题 引言 PRIVILEGED_FUNCTION 的宏定义出处 从段空间看程序从预处理到加载的过程 参考资料 引言 PRIVILEGED_FUNCTION 标识符是在笔者查看 xTa ...

  9. 【FreeRTOS】小白进阶之如何使用FreeRTOS事件标志组

    事件标志组使用浅析. 1.头文件声明 #include "FreeRTOS.h" #include "task.h" #include "event_ ...

最新文章

  1. 尝试在视图不在窗口层次结构中的UIViewController上呈现UIViewController
  2. Android开发工具之Android Studio--如何打包sdk通过arr包的方式
  3. 【转】应用架构一团糟?如何将单体应用改造为微服务
  4. GlassFish 3.1.2充满了MOXy(EclipseLink JAXB)
  5. js随机从数组中取出几个元素
  6. Java笔记-Integer或Long转String时补0(补零)
  7. 【CCCC】L3-019 代码排版 (30分),大模拟
  8. [转载] Python dict.keys方法
  9. Java Swing的进化
  10. mysql 解压版安装及DATA初始化 root用户密码修改
  11. C#、net core、net5自定义实体注解
  12. 更换pycharm主题
  13. android 改机型玩王者,安卓手机改机型华为nova 8 Pro体验《王者荣耀》90帧超高帧率模式...
  14. cruzer php sandisk 闪迪u盘量产工具_sandisk cruzer 32G U盘量产工具下载
  15. 程序员最不想让你知道的尴尬瞬间,看完我眼睛都绿了
  16. javascript中使用split对多个分割符进行分割
  17. 智慧养殖远程管理监控方案
  18. 「六一端午」双节|营销人必看的新玩法
  19. 我眼中的微软Azure:Microsoft Azure
  20. 北大陈春花院长博士文凭被质疑买自“野鸡大学”,牵出多位名校教授,北大回应...

热门文章

  1. 用python庆祝生日_雷吉娜用搞笑的歌曲庆祝自己50岁的生日:“今天一个婊子老了”...
  2. MATLAB有趣或有用小程序合集
  3. 一些实用的镜像网站推荐
  4. InputReader读取rawEvent解析
  5. HP elitebook 735 g5 笔记本电脑升级BIOS驱动后Type-C无法扩展显示屏的解决方案
  6. 【学习笔记】HttpRunner自动化测试框架入门
  7. 工作进度跟踪表excel_在Excel中跟踪时间
  8. 上篇: php 微信公众号 基于Thinkphp3.2框架开发
  9. Java初级知识复习-2021.12.27~2022.02.09
  10. 胶质瘤新发现丨神经胶质瘤标志物研究