前言
在项目选型阶段评估RAM和FLASH大小是经常会遇到的问题。今天聊聊如何评估?
第一步:将一个完整的项目拆分成各个模块。
第二步:按照以往项目的经验,统计各个模块需要资源的大小。
例如下面表格:(数据随便写的)
模块 | RAM(byte) | FLASH(byte) |
系统 | 2048 | 4096 |
通讯 | 1024 | 2048 |
充电 | 512 | 1024 |
总计 | 3584 | 7168 |
有了这个表格在汇报的时候就会显得有理有据。如果想加减某个模块只要简单计算即可知道消耗资源的多少。
如何统计各个模块的资源大小?
每个模块都是由若干个文件组成的。统计每一个文件占有的RAM和FLASH即可知道这个这个模块占有的资源大小。这就要求在写代码时要做好分层和解耦。模块间如果相互耦合统计起来就麻烦了。
介绍一个指令:arm-none-eabi-size
arm-none-eabi-size
是一个用于查看编译后生成的ARM目标代码文件大小的工具,它是 arm-none-eabi-gcc
工具链的一部分,专门用于嵌入式系统开发,尤其是针对不包含操作系统的(bare-metal)ARM Cortex-M系列微控制器。当你使用 arm-none-eabi-gcc
编译完一个程序后,可以使用 arm-none-eabi-size
来检查生成的目标文件、可执行文件或者库文件所占用的内存大小,包括代码段(text)、数据段(data)、BSS段(bss)。
基本用法:
arm-none-eabi-size [选项] 文件名
常用选项:
-
不带任何选项直接使用,会显示出代码段、数据段和BSS段的大小,以及它们的总和。
-
-t
或--total
:仅显示总大小,不分别列出各段。 -
-A
或--radix=
:指定输出数字的基数,比如--radix=16
会以十六进制显示大小。 -
-d
或--debug
:显示调试部分的大小。 -
-x
或--exec-header
:对于可执行文件,显示可执行头部的信息。
比如我们要计算a.o这个文件的资源大小可以使用
arm-none-eabi-size a.o
输出结果
text data bss dec hex filename
1024 12 32 1068 42c a.o
如果一个模块有a.o、b.o、c.o 三个文件可以使用下面指令统计资源大小。
arm-none-eabi-size -total *.o
输出结果
text data bss dec hex filename
1024 0 4 1028 404 a.o
2048 8 32 2088 828 b.o
5120 0 0 5120 1400 c.o
---- ---- ---- ---- ----
8192 8 36 8236 2030 total //上面三个文件的总和
其中RAM大小为data+bss;FlASH大小为text+data 。