1.低功耗模式
低功耗介绍
答:很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等;一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。FreeRTOS也提供了一个叫Tickless的低功耗模式,方便带FreeRTOS操作系统的应用开发。(为了解决IDLE函数占用过多CPU时间)
STM32低功耗模式
-
在FreeRTOS中主要使用的是睡眠模式:
- 进入睡眠模式: WFI 指令(__WFI )、WFE 指令(__WFE) 。
- 退出睡眠模式:任何中断或事件都可以唤醒睡眠模式。
为了可以降低功耗,又不影响系统运行,该如何做?
-
答:可以在本该空闲任务执行的期间,让MCU 进入相应的低功耗模式;当其他任务准备运行的时候,唤醒MCU退出低功耗模式。
-
难点:
-
- 进入低功耗之后,多久唤醒?也就是下一个要运行的任务如何被准确唤醒。
-
- 任何中断均可唤醒MCU,若滴答定时器频繁中断则会影响低功耗的效果?
-
-
解决:将滴答定时器的中断周期修改为低功耗运行时间,退出低功耗后,需补上系统时钟节拍数。
-
值得庆幸的是:FreeRTOS 的低功耗 Tickless 模式机制已经处理好了这些难点。(自动实现)
2.内存管理
- 任务栈是一种数据结构,申请占用的是堆空间
5种内存管理算法
-
heap_4的特点:
- heap_4 内存管理算法使用了首次适应算法,也支持内存的申请与释放,并且能够将空闲且相邻的内存进行合并,从而减少内存碎片的现象。
-
首次适应算法:
- 假设heap有3块空闲内存(按内存块地址由低到高排序):5字节、50字节、25字节。
- 现在新创建一个任务需要申请20字节的内存。
- 第一步:找出第一个能满足pvPortMalloc的内存:50字节。
- 第二步:把它划分为20字节、30字节;返回这20字节的地址,剩下30字节仍然是空闲状态,留给后续的pvPortMalloc使用。
-
heap4内存管理实现过程
- 最后发现申请了32(因为不仅要创建内存,还要有对应的结构体以及需要字节对齐)
- 字节对齐:为8也即申请的内存需要为8的整数倍
问题
-
发现当连续申请内存时,只能释放最近一次的内存
-
task1函数中使用了一个指针buff来存储申请的内存地址。每当按下key1时,您都会调用pvPortMalloc申请 20 字节的内存,并将地址存储在buff中。当按下key2时,您使用vPortFree(buff)释放内存。由于buff只存储了最近一次申请的内存地址,因此只能释放最近一次申请的内存。 -
解决:专门使用一个数组来保存每次的地址