你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】FreeRTOS RAM 使用情况及优化方法

[复制链接]
STMCU小助手 发布时间:2022-2-21 20:07
一.写在前面的话:7 Y4 u) T/ n" f4 [) {7 _$ V
嵌入式设计中使用 RTOS 必然会带来额外的 RAM 消耗,然而许多初次接触 RTOS 的工程师并不清楚如何评估 RAM 的消耗量。这篇文档以 FreeRTOS 为例,介绍评估 RAM 使用情况的一般方法,并给出在 FreeRTOS 下优化 RAM 使用的方法,也由衷的期望读者在使用其他 RTOS 时,可以通过相似的思路来解决问题。
4 p9 w  o) }$ s' |5 r* p4 r
$ p, X' M4 J% Z, |1 k二.FREERTOS RAM 使用情况
: B- m& T& i. M% ]FreeRTOS 的组件包括调度器,内存管理单元及任务间通讯方法,当然还提供可选的软件定时器(事实上,多数 RTOS 提供的组件都是这几项)。因此对 RAM 的使用情况的评估也与这几项直接相关。内存管理单元提供内存管理办法,直接消耗内存的包括调度器,任务间通讯方法及软件定时器,当然每一个任务还需要一定的堆栈空间。在具体的应用中,使用的任务数量可能不同,每个任务的堆栈空间也可能不一样,任务间通讯的方式也可能不同,当然我们还要考虑到 MCU 得内核和编译器优化选项的问题。但是,通过简单的估算,还是可以轻松的得到 RAM 使用情况的大体信息。7 w, k: F" @4 P
! w; D* k/ b9 t. L1 Q7 l8 h% ?8 Z. h
文中提供的信息是以 STM32F407(Cortex-M4 内核)为硬件,IAR 编译选项开到最高,FreeRTOS 采用最新的 v8.0.0 来进行测试的。基本情况呢我们慢慢来分析一下。$ B! K# q+ h3 u1 V* q; E  A' i0 G
% J; U! O* r+ c) z
1. 调度器

/ {* O9 l" w( w8 p. E$ l   采用嵌入式系统中比较常见的抢占式内核 256bytes 左右。真的很小,当然与 IAR 的编译优化有关系。4 c0 {; m& D% ~9 o. x: g
   3 e+ T, L5 p6 b" K! V) \) C
2.任务- X1 g! u$ k. r7 b' \8 u$ o: J. T' n
   一个任务的内存使用包括两个部分,任务控制块(Task Control Block,嗯,大名鼎鼎的 TCB)和任务堆栈空间。在任务控制块的结构体信息中包含很多预编译选项(预编译选项包括什么,我建议你阅读下源码),总体而言,毫无疑问的是你想要的越多,付出的也得越多。按最小配置情况来讲,任务控制块需要 64bytes(任务名这里设置为 4 个 bytes)。
! y: ], S; m: \$ i9 y; ~2 G  f   任务堆栈就是一个比较棘手的问题了,许多工程师一上来就分配 512bytes(⊙﹏⊙b 汗)。其实许多任务用不了这么多的。想想任务堆栈都需要存些什么东西?CPU 寄存器值,任务中局部变量,调用的函数参数和函数调用深度(使用迭代函数请慎重)。因此在进行任务堆栈分配时考虑到最糟糕情况就好了,就是上面提到的信息全部得以保存即可。并不是每个任务都需要 512bytes 的。最后,分配的值对齐,也就是 128,256,512 等等。$ w5 g! }/ m! H( D" @+ q

" ?5 f- {. N: g; a& v" f0 E, \9 `6 N4 W3.任务间通讯
% W4 x* ]+ f' J4 k; n+ q- Q+ _# w   任务间通讯是 RTOS 提供的另一项重要机制,方法很多,信号量,队列,邮箱等(如果你不知道我说的是什么,搜下邵贝贝吧 :-D)。在 FreeRTOS 中,所有的通讯机制都是基于队列,因此,在FreeRTOS 中这一项的估算围绕队列就可以了。一个队列需要 74bytes(最小配置,预编译选项请阅读源码)。另外,至关重要的是,队列可以存放简单的数据,比如一个变量(这就可以诞生信号量),当然也可以存放数组,指针什么的。数组需要的空间,指针指向内容所需要的空间是需要额外计算的。
. J7 ^6 O. a0 o& P* E1 I   9 C1 q2 t% d' Z  c" k
4.定时器
! e2 G; d) C/ L1 \! g) ]   RTOS 往往都提供了软件定时器,用起来还是不错的,个人感觉在消费类电子产品中使用软件定时器更合适些。一个定时器 56bytes。就这些。
$ h; n$ h* P& t9 g6 V. O% g6 G( r4 p& H2 @  k
   总结一下。见下表。
0 I, L7 p  Z9 f5 _. m) P: F
% A% S$ o% ?9 Z 9{4KV}82]_ZOVWQ)}G_0K~1.png
* Q1 r, I( T0 f2 {7 K' a& I  E: w* F1 Z# }
   在产品评估阶段,参考这些信息进行一般的估计是可行的,当然还是要给自己留点 Margin 的。
# ]4 E& n6 |. h7 X- }   0 X; U' \1 G6 o# I
三.优化方法:
% |7 x/ _& G% G; h2 H3 Y7 R1. 分析空闲 RAM
$ X* E* |5 r& B2 o$ r  D8 N   FreeRTOS 提供了非常多的的方法来获得哪些 RAM 被分配了但是没有被使用。简单的阅读下代码注释马上就可以使用相关的函数了,都在 task.c 中。这个办法可以很好的降低任务堆栈所浪费的空间。
9 A- e6 F- F  B' g9 ^" g- y
& Y) u; D& B4 F4 c2. 在开发的后期对 FreeRTOS 进行尽可能小的配置

( z6 L6 F; \% ?* y. b    所有的任务都不会被阻塞你就可以删掉守护任务。
2 n8 z0 W& f3 k- l. S2 ?    调试选项当然也应该关掉。
8 ^4 w8 x+ o# n0 u( `8 ]( H- C    根据应用的情况,将最大优先级和最小堆栈量设置的尽可能小。/ Y9 o' N% z  Y! W3 A9 E0 z. V2 x" L
% Y: T, e4 p0 x7 p  V
3. 如果这都不行,换更大 RAM 的器件吧,STM32 提供了最丰富的产品线。5 N' d4 i- {" w/ K( I& O5 l
5 I, O' v  s" ]1 X/ F! S# `0 V% a
赞 收藏 评论0 发布时间:2022-2-21 20:07

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版