我在AVR32微控制器(UC3C0512C)上运行C程序。发出avr32-size -A PROGRAM.elf命令将生成以下输出:
PROGRAM.elf :
section size addr
.reset 8200 2147483648
.rela.got 0 2147491848
.text 99512 2147491848
.exception 512 2147591680
.rodata 5072 2147592192
.dalign 4 4
.data 7036 8
.balign 4 7044
.bss 5856 7048
.heap 48536 12904
.comment 48 0
.debug_aranges 8672 0
.debug_pubnames 14476 0
.debug_info 311236 0
.debug_abbrev 49205 0
.debug_line 208324 0
.debug_frame 23380 0
.debug_str 43961 0
.debug_loc 63619 0
.debug_macinfo 94469328 0
.stack 4096 61440
.data_hram0 512 2684354560
.debug_ranges 8368 0
Total 95379957有人能解释一下如何解释这些价值吗?如何根据这个列表计算闪存和内存的使用量?
更新1:
如果没有-A标志,我将得到以下内容:
text data bss dec hex filename
113296 7548 58496 179340 2bc8c PROGRAM.elf更新2:
我不使用动态内存分配,因此根据avr-libc用户手册,空闲内存空间应该是:stackpointer减去__heap_start。
在本例中:61440 - 12904 = 48536字节空闲内存空间。
有人能证实一下吗?
发布于 2013-05-29 05:05:03
(你问题中的两种产出不匹配。bss号码有很大不同。)
如果您不使用malloc,并且不计算堆栈,那么是的,RAM的使用是数据加上bss (加上一些对齐间隔)。数据是在声明中设置的变量,而bss是没有设置的变量。C运行时可能会将它们初始化为0,但它不必这样做。
闪存使用将是文本和数据。也就是说,闪存将包括程序指令和C运行时,但也包括在启动时需要复制到RAM以初始化这些变量的值。这些数据通常被附加到程序指令的末尾。
关于:更新2
RAM按该顺序保存全局变量、堆和堆栈。
全局变量可以在程序中初始化,也可以不初始化。.data部分存储在闪存中,C运行时将这些值复制到RAM的开头,其中对应的变量在代码运行之前存在。全局变量的.bss部分需要内存中的空间来保存值,但它们不一定是初始化的。avr附带的C运行时实际上将这些代码初始化为0。要点是,您不需要存储一个0数组来复制,就像您在.data部分所做的那样。
您不是在使用堆,而是从heap_start和heap_end之间的地址中获得动态分配的内存。
但是堆栈是不受限制的。是的,堆栈指针在启动时被初始化,但是随着程序的运行,它会发生变化,并且可以很好地移动到堆中,甚至可以移动到全局变量(堆栈溢出)中。每当调用函数或在函数中使用局部变量时,堆栈指针就会移动。例如,在函数中声明的大型数组将放在堆栈上。
因此,在回答您的问题时,没有保证保持免费的RAM。
发布于 2013-05-28 11:58:03
我认为您应该删除-A (all)标志,因为这会给您显示更低级别的列表。
默认输出更易于解析,并且似乎直接声明了所要的值。
注意:我没有尝试这个,不是一个安装了AVR工具链的系统。
发布于 2013-05-28 11:59:12
这些值是编译后的C代码的汇编语言部分。有关细节,请参见文档。这个文章也很有用。
标题为.text的部分表示指令部分,即程序集指令。.data部分表示变量(ints、数组等)的大小。size列有重要信息,并且每个部分的大小(以字节为单位)。.stack和.heap表示为准备执行设置虚拟内存的程序而分配的内存。
https://stackoverflow.com/questions/16791311
复制相似问题