如何解释avr32大小的输出?

时间:2013-05-28 11:49:38

标签: avr avr-gcc

我在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

有人可以解释如何解释这些值吗? 如何根据此列表计算闪存和RAM的使用情况?

更新1:

没有-A标志,我得到以下内容:

   text    data     bss     dec     hex filename
 113296    7548   58496  179340   2bc8c PROGRAM.elf

更新2:

我没有使用动态内存分配,因此根据avr-libc user-manual,可用内存空间应该是:stackpointer减去__heap_start

在这种情况下:61440 - 12904 = 48536字节空闲RAM空间。

有人可以证实吗?

5 个答案:

答案 0 :(得分:2)

(你的问题中两个输出不匹配.bss数字大不相同。)

如果你不使用malloc,并且不计算堆栈,那么是的,RAM的使用是数据加上bss(加上一些对齐间距)。数据是在声明中设置的变量,而bss是不是的变量。 C运行时可能会将它们初始化为0,但它不必。

闪存用法将是文本和数据。也就是说,flash将包括程序指令和C运行时,还包括在启动时需要复制到RAM中以初始化这些变量的值。这些数据通常被添加到程序指令的末尾。

回复:更新2

RAM按顺序保存全局变量,堆,然后是堆栈。

全局变量可以在程序中初始化,也可以不。 .data部分存储在flash中,C运行时将这些值复制到RAM的开头,其中相应的变量在代码运行之前存在。全局变量的.bss部分需要RAM中的空间来保存值,但它们不一定是初始化的。 avr-gcc附带的C运行时实际上将这些初始化为0.请注意,您不需要存储0的数组进行复制,就像使用.data部分一样。

您没有使用堆,但是从heap_start和heap_end之间的地址获取动态分配的内存。

但是堆栈不受限制。是的,堆栈指针在启动时被初始化,但它随着程序的运行而改变,并且可以很好地移动到堆中,甚至移动到全局变量中(堆栈溢出)。无论何时调用函数,或者使用函数内的局部变量,堆栈指针都会移动。例如,在函数内声明的大型数组将进入堆栈。

因此,在回答您的问题时,没有任何RAM可以保证免费。

答案 1 :(得分:1)

我认为您应该删除-A(所有)标记,因为这会为您提供更低级别的列表。

默认输出更容易解析,并且似乎直接表示您所追求的值。

注意:我没有尝试这个,不是安装了AVR工具链的系统。

答案 2 :(得分:0)

这些值是已编译C代码的汇编语言部分。有关详细信息,请参阅docs。这个article也很有帮助。

标题为.text的部分代表指令部分,即汇编指令。 .data部分表示变量的大小(整数,数组等)。 size列具有重要信息,并且每个部分的大小以字节为单位。 .stack.heap表示为准备执行程序以设置虚拟内存而分配的内存。

答案 3 :(得分:0)

我想在你的链接器脚本中,你的RAM为0,Flash为0x80000000,所以需要进入RAM的所有东西都在地址0+(.stack是61440的最后一个(跨越接下来的4k))。所以你需要多一点64k的RAM。你拥有的其他一切都是闪光的。

提供的链接器脚本是正确的。

另见unwind的评论。

答案 4 :(得分:0)

你可以尝试

  

avr-nm --print-size --radix d --demangle x.elf

以十进制表示法获取大小。

然后你可以复制&粘贴到电子表格中,过滤,按部分排序,然后总结。