写在前面:因为实际使用需求,学习了一段时间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函数,如任务创建;任务挂起;队列创建;信号量创建等。
写在最后:后续会陆续写出各个部分更详细的说明使用方法,以及例程。
感谢阅读:)
欢迎关注公众号,干货满满。

适用于FreeRTOS初学者,FreeRTOS整体知识框架相关推荐

  1. 软考高级-信息系统项目管理师计划制定及整体知识框架

    报考指南 资格设置 岗位设置和描述 报考流程 信息系统项目管理师师考试说明 1.考试要求 (1)掌握信息系统知识: (2)掌握信息系统项目管理知识和方法: (3)掌握大型.复杂项目管理和多项目管理的知 ...

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

    目录 一.为什么要学习FreeRTOS 二.前言------从0到1认识FreeRTOS 1.逻辑系统与多任务系统 1.1.裸机系统:裸机系统通常分成轮询系统和前后台系统 1.2.多任务系统 2.数据 ...

  3. 6条适用于PHP初学者的学习线路和建议

    2019独角兽企业重金招聘Python工程师标准>>> 适用于PHP初学者的学习线路和建议,本期我们为大家总结出6条建议,废话不多说,我们先来看下PHP初学者的学习线路: (1) 熟 ...

  4. 《教育学原理》知识框架整理

    <教育学原理>知识框架整理 一.教育学概述 (一)教育学的概念:教育学是研究教育现象和教育问题,揭示教育规律的科学. (二)教育学的研究对象:教育学以教育现象.教育问题为其研究对象,通过对 ...

  5. 【信息系统项目管理师】高项知识框架--考点大汇总

    [信息系统项目管理师]高项知识框架–考点大汇总 章节 管理领域 过程说明 输入输出 工具技术 项目文档 流程步骤 概念分类 控制审计 知识点汇总 第二章 管理基础 - - - - - 11 - 11 ...

  6. 后端开发知识框架汇总

    后端开发知识框架汇总 Spring框架 Spring/Springboot/SpringMVC Spring ​ 其是一个引擎,众多衍生产品例如boot.security.jpa等等:但他们的基础都是 ...

  7. 项目管理知识框架PMBOK(文字版)

    项目管理知识框架PMBOK 项目整体管理[I](Integration) 1. 制定项目章程(Develop Project Charter) 2. 制定项目初步范围说明书(Develop Preli ...

  8. 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架

    1.概述 转载:Flink 源码阅读笔记(15)- Flink SQL 整体执行框架 在数据处理领域,无论是实时数据处理还是离线数据处理,使用 SQL 简化开发将会是未来的整体发展趋势.尽管 SQL ...

  9. Python3.x整体知识介绍—撩妹大法

    Python3.x整体知识介绍-撩妹大法 说明:下面关于Python的介绍都是基于window系统 一.什么是Python 简介:Python是一种解释型,动态数据类型,面向对象高级设计语言:Pyth ...

最新文章

  1. 零基础入门学习Python(34) 面向对象
  2. hdu4888 最大流(构造矩阵)
  3. 组策略 之 文件夹重定向
  4. PHP中的const
  5. numpy 随机数_数据分析numpy基础看着一篇就够了
  6. oracle 存储过程打印语句,oracle学习之第一个存储过程:打印Hello World
  7. Confluence 6 让一个空间可以公众访问
  8. linux根目录下各文件的作用
  9. 网络视频传输的服务质量(QoS)
  10. Java8新特性详解
  11. ffmpeg 源代码简单分析 :av_read_frame()
  12. 仰睇天路,俯促鸣弦。神仪妩媚,举止详妍
  13. 基于Javaweb的问卷调查系统
  14. RK3566触屏旋转方向
  15. 1400㎡,联诚发龙腾LED透明屏点燃五月天新加坡演唱会!
  16. 微信小程序开发: 开发前准备工作
  17. 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
  18. strlen获取char*的大小问题
  19. IPMP、PMP、CPMP三个证书该如何选择,有什么区别,哪个对于工作上的
  20. 网络安全等级保护测评机构简介

热门文章

  1. centos安装Redis详细教程
  2. 【考研经验】2018北邮计算机学院考研经验(复试经验较多)
  3. 在CentOS下编译VLC源码
  4. c++把数组所有元素剔除_C语言数组——删除数组中的某个值
  5. dell 2950服务器安装系统,DELL 2950 服务器安装系统的方法
  6. Android开发之输入法详解
  7. JAVA-Ftp上传文件,文件上传上去了,但是大小是0KB
  8. 记:微信小程序实现横屏手写板图片正向保存
  9. dns解析服务器原理,DNS解析过程及原理
  10. FillMemory()、ZeroMemory(),fillchar()