Freertos4(低功耗模式 内存管理)

181 阅读3分钟

1.低功耗模式

低功耗介绍

答:很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等;一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。FreeRTOS也提供了一个叫Tickless的低功耗模式,方便带FreeRTOS操作系统的应用开发。(为了解决IDLE函数占用过多CPU时间)

STM32低功耗模式

image.png

  • 在FreeRTOS中主要使用的是睡眠模式:

    • 进入睡眠模式: WFI 指令(__WFI )、WFE 指令(__WFE) 。
    • 退出睡眠模式:任何中断或事件都可以唤醒睡眠模式。

为了可以降低功耗,又不影响系统运行,该如何做?

  • 答:可以在本该空闲任务执行的期间,让MCU 进入相应的低功耗模式;当其他任务准备运行的时候,唤醒MCU退出低功耗模式。

  • 难点:

      1. 进入低功耗之后,多久唤醒?也就是下一个要运行的任务如何被准确唤醒。
      1. 任何中断均可唤醒MCU,若滴答定时器频繁中断则会影响低功耗的效果?
  • 解决:将滴答定时器的中断周期修改为低功耗运行时间,退出低功耗后,需补上系统时钟节拍数。

  • 值得庆幸的是:FreeRTOS 的低功耗 Tickless 模式机制已经处理好了这些难点。(自动实现)

2.内存管理

  • 任务栈是一种数据结构,申请占用的是堆空间
5种内存管理算法

image.png

  • heap_4的特点

    • heap_4 内存管理算法使用了首次适应算法,也支持内存的申请与释放并且能够将空闲且相邻的内存进行合并,从而减少内存碎片的现象。
  • 首次适应算法

    • 假设heap有3块空闲内存(按内存块地址由低到高排序):5字节、50字节、25字节。
    • 现在新创建一个任务需要申请20字节的内存。
    • 第一步:找出第一个能满足pvPortMalloc的内存:50字节。
    • 第二步:把它划分为20字节、30字节;返回这20字节的地址,剩下30字节仍然是空闲状态,留给后续的pvPortMalloc使用。
  • heap4内存管理实现过程

image.png

  • 最后发现申请了32(因为不仅要创建内存,还要有对应的结构体以及需要字节对齐)
  • 字节对齐:为8也即申请的内存需要为8的整数倍

问题

  • 发现当连续申请内存时,只能释放最近一次的内存 image.png

  • task1函数中使用了一个指针 buff 来存储申请的内存地址。每当按下 key1 时,您都会调用 pvPortMalloc 申请 20 字节的内存,并将地址存储在 buff 中。当按下 key2 时,您使用 vPortFree(buff) 释放内存。由于 buff 只存储了最近一次申请的内存地址,因此只能释放最近一次申请的内存。

  • 解决:专门使用一个数组来保存每次的地址