c / c ++:我怎么知道用过的闪存的大小?

时间:2014-02-04 20:18:03

标签: c++ c flash memory out-of-memory

我最近遇到了闪存溢出问题。在对代码进行一些优化后,我成功保存了一些闪存并执行了软件。我想通过我的更改保存多少闪存。请让我知道如何检查使用过的闪存/可用闪存。另外我想要特定功能/文件使用多少闪存。

下面提到了一些关于我的开发环境的信息。   - 具有64 k RAM和512 K闪存的Avr微控制器。   - 使用freeRtos。   - 使用GNU C ++编译器。   - 使用AVRATJTAGEICE进行编程和调试。

请让我知道解决方案。

此致 Jagadeep。

3 个答案:

答案 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只是dec0x321c == 12828的十六进制表示形式。

对于嵌入式系统,通常dec必须小于目标设备的闪存大小(或设备上的可用空间)。

通常只需观看GCC的dec命令的textsize输出来监视编译后的代码的大小即可。较大的跳跃通常表示未实现的新功能或constexpr实施不佳。 (不要忘记function-sectionsdata-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