我最近遇到了闪存溢出问题。在对代码进行一些优化后,我成功保存了一些闪存并执行了软件。我想通过我的更改保存多少闪存。请让我知道如何检查使用过的闪存/可用闪存。另外我想要特定功能/文件使用多少闪存。
下面提到了一些关于我的开发环境的信息。 - 具有64 k RAM和512 K闪存的Avr微控制器。 - 使用freeRtos。 - 使用GNU C ++编译器。 - 使用AVRATJTAGEICE进行编程和调试。
请让我知道解决方案。
此致 Jagadeep。
答案 0 :(得分:0)
在生成的elf文件中使用binutils中的size
命令。当您似乎使用AVR芯片时,请使用avr-size
。
要获得函数的大小,请使用binutils中的nm
命令(AVR芯片上的avr-nm
)。
答案 1 :(得分:0)
请让我知道解决方案。
抱歉,没有解决方案!你必须通过与你的最终ELF相关联的内容,并确定它是按意图链接还是不需要的默认链接。
请告诉我如何查看使用过的闪存/可用闪存。
这主要取决于您的实际目标硬件平台,因此您必须设法让.text
部分适合您。
另外,我想要特定功能/文件使用多少闪存。
GCC binutils的nm
工具提供了有关ELF文件中找到的任何(全局)符号的详细信息,以及它在相关部分中占用的空间。您只需要grep
特定函数/类/命名空间(最佳解码!)的结果来累积节类型和符号过滤输出以进行分析。
这就是方法,我一直在使用一个名为nmalyzr
的小工具。很抱歉,因为它在GIT回购中,它没有按预期工作(我有工作版本,没有被推回)。
一般来说,追逐具有#include <iostream>
语句的代码是一个很好的策略(无论是否使用std::cout
或类似,提供静态实例!),或者不需要的newlib / libstdc ++例如,绑定默认异常处理。
答案 2 :(得分:0)
您正在寻找GCC的size
程序。
size
可以传递完整编译的.elf
文件。默认情况下,它将输出如下内容:
$ size linked-file.elf
text data bss dec hex filename
11228 112 1488 12828 321c linked-file.elf
这是说:
此文件的
11228
“部分”中有.text
个字节。通常用于功能。
程序中有112
个字节的初始化数据:带有初始值的全局变量。
有1488
个字节的未初始化数据:没有初始值的全局变量。
dec
只是前三个值的总和:11228 + 112 + 1488 = 12828
。
hex
只是dec
值0x321c == 12828
的十六进制表示形式。
对于嵌入式系统,通常dec
必须小于目标设备的闪存大小(或设备上的可用空间)。
通常只需观看GCC的dec
命令的text
或size
输出来监视编译后的代码的大小即可。较大的跳跃通常表示未实现的新功能或constexpr
实施不佳。 (不要忘记function-sections
和data-sections
)。
注意:对于AVR,您需要使用avr-size
检查AVR .elf
文件的链接大小。 avr-size
对目标芯片加一个额外的参数,并将自动计算所选芯片的已用闪存百分比。
GCC的size
也可以直接在中间目标文件上工作。
如果要检查函数的编译大小,此功能特别有用。
您应该会看到以下摘录:
$ size -A main.cpp.o
main.cpp.o :
section size addr
.group 8 0
.group 8 0
.text 0 0
.data 0 0
.bss 0 0
.text._Z8sendByteh 8 0
.text._ZN3XMC5IOpin7setModeENS0_4ModeE 64 0
.text._ZN7NamSpac6OptionIN5Clock4TimeEEmmEi 76 0
.text.Default_Handler 24 0
.text.HardFault_Handler 16 0
.text.SVC_Handler 16 0
.text.PendSV_Handler 16 0
.text.SysTick_Handler 28 0
.text._Z5errorPKc 8 0
.text._ZN7NamSpac5Motor2goEi 368 0
.text._ZN7NamSpac5Motor3getEv 12 0
.rodata.cst1 1 0
.text.startup.main 632 0
.text._ZN7NamSpac7Program3runEv 380 0
.text._ZN7NamSpac8Position4tickEv 24 0
.text.startup._GLOBAL__sub_I__ZN7NamSpac7displayE 292 0
.init_array 4 0
.bss._ZN5Debug9formatterE 4 0
.rodata._ZL10dispDigits 8 0
.bss.position 4 0
.bss.motorState 4 0
.bss.count 4 0
.rodata._ZL9diameters 20 0
.bss._ZN7NamSpac8diameterE 16 0
.bss._ZN5Debug3pinE 12 0
.bss._ZN7NamSpac7displayE 24 0
.rodata.str1.4 153 0
.rodata._ZL12dispSegments 32 0
.bss._ZL16diametersDisplay 10 0
.bss.loadAggregate 4 0
.bss.startCount 4 0
.bss._ZL15runtimesDisplay 10 0
.bss._ZN7NamSpac7runtimeE 16 0
.bss.startTime 4 0
.rodata._ZL8runtimes 20 0
.comment 111 0
.ARM.attributes 49 0
Total 2494