我在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空间。
有人可以证实吗?
答案 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
以十进制表示法获取大小。
然后你可以复制&粘贴到电子表格中,过滤,按部分排序,然后总结。