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

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

在这里插入图片描述

版权声明:本文为CSDN博主「看山是山_Lau」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43499780/article/details/106864477

生成海报
点赞 0

看山是山_Lau

我还没有学会写个人说明!

暂无评论

相关推荐