
一.写在前面的话: 嵌入式设计中使用 RTOS 必然会带来额外的 RAM 消耗,然而许多初次接触 RTOS 的工程师并不清楚如何评估 RAM 的消耗量。这篇文档以 FreeRTOS 为例,介绍评估 RAM 使用情况的一般方法,并给出在 FreeRTOS 下优化 RAM 使用的方法,也由衷的期望读者在使用其他 RTOS 时,可以通过相似的思路来解决问题。- o ~# O( Z; Y5 L$ T& C 二.FREERTOS RAM 使用情况! X5 R6 V0 }1 `( V0 q# m# Y FreeRTOS 的组件包括调度器,内存管理单元及任务间通讯方法,当然还提供可选的软件定时器(事实上,多数 RTOS 提供的组件都是这几项)。因此对 RAM 的使用情况的评估也与这几项直接相关。内存管理单元提供内存管理办法,直接消耗内存的包括调度器,任务间通讯方法及软件定时器,当然每一个任务还需要一定的堆栈空间。在具体的应用中,使用的任务数量可能不同,每个任务的堆栈空间也可能不一样,任务间通讯的方式也可能不同,当然我们还要考虑到 MCU 得内核和编译器优化选项的问题。但是,通过简单的估算,还是可以轻松的得到 RAM 使用情况的大体信息。 * u0 u" y/ l8 @! }. { 文中提供的信息是以 STM32F407(Cortex-M4 内核)为硬件,IAR 编译选项开到最高,FreeRTOS 采用最新的 v8.0.0 来进行测试的。基本情况呢我们慢慢来分析一下。) X; Z5 a: q& u' r 1. 调度器6 [+ A9 ]& |! z 采用嵌入式系统中比较常见的抢占式内核 256bytes 左右。真的很小,当然与 IAR 的编译优化有关系。 2.任务& s8 Q. f. ]3 e7 z9 p c9 t2 r 一个任务的内存使用包括两个部分,任务控制块(Task Control Block,嗯,大名鼎鼎的 TCB)和任务堆栈空间。在任务控制块的结构体信息中包含很多预编译选项(预编译选项包括什么,我建议你阅读下源码),总体而言,毫无疑问的是你想要的越多,付出的也得越多。按最小配置情况来讲,任务控制块需要 64bytes(任务名这里设置为 4 个 bytes)。6 m% Q' o1 \1 z5 s# j 任务堆栈就是一个比较棘手的问题了,许多工程师一上来就分配 512bytes(⊙﹏⊙b 汗)。其实许多任务用不了这么多的。想想任务堆栈都需要存些什么东西?CPU 寄存器值,任务中局部变量,调用的函数参数和函数调用深度(使用迭代函数请慎重)。因此在进行任务堆栈分配时考虑到最糟糕情况就好了,就是上面提到的信息全部得以保存即可。并不是每个任务都需要 512bytes 的。最后,分配的值对齐,也就是 128,256,512 等等。 I( Y' n& ^: B5 e 4 N& g- O& M5 Z# ^ 3.任务间通讯 任务间通讯是 RTOS 提供的另一项重要机制,方法很多,信号量,队列,邮箱等(如果你不知道我说的是什么,搜下邵贝贝吧 :-D)。在 FreeRTOS 中,所有的通讯机制都是基于队列,因此,在FreeRTOS 中这一项的估算围绕队列就可以了。一个队列需要 74bytes(最小配置,预编译选项请阅读源码)。另外,至关重要的是,队列可以存放简单的数据,比如一个变量(这就可以诞生信号量),当然也可以存放数组,指针什么的。数组需要的空间,指针指向内容所需要的空间是需要额外计算的。# y9 _. {3 k; D# I: x/ l8 ~( ^2 C 4.定时器1 g3 f4 Z, F+ i( p RTOS 往往都提供了软件定时器,用起来还是不错的,个人感觉在消费类电子产品中使用软件定时器更合适些。一个定时器 56bytes。就这些。. K. I8 _' }( k + k9 [0 D9 r+ p 总结一下。见下表。6 u; n: c4 f# U9 y' q* Q9 q - Y& X1 F- N7 W8 M$ z3 u7 N k$ ~ ![]() ) A, E- q& X# E4 m 在产品评估阶段,参考这些信息进行一般的估计是可行的,当然还是要给自己留点 Margin 的。 2 q5 d# Y( p4 D 三.优化方法:6 {/ h( T/ N% ^. O 1. 分析空闲 RAM! Q# e6 r' P$ ] FreeRTOS 提供了非常多的的方法来获得哪些 RAM 被分配了但是没有被使用。简单的阅读下代码注释马上就可以使用相关的函数了,都在 task.c 中。这个办法可以很好的降低任务堆栈所浪费的空间。 2. 在开发的后期对 FreeRTOS 进行尽可能小的配置* e8 z% J L( w$ d6 J 所有的任务都不会被阻塞你就可以删掉守护任务。# i( s4 W% c! M. [4 Y( k 调试选项当然也应该关掉。0 Q: s n- |5 c5 z8 f5 y0 m. m* y 根据应用的情况,将最大优先级和最小堆栈量设置的尽可能小。8 ?, B7 z1 O. X$ M0 B/ E0 _+ I 3. 如果这都不行,换更大 RAM 的器件吧,STM32 提供了最丰富的产品线。 5 g% d. e4 d4 g) \) G* ] |
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?