1

我在 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 用户手册,可用 RAM 空间应该很简单:stackpointer减号__heap_start

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

有人可以确认吗?

4

5 回答 5

2

(您的问题中的两个输出不匹配。bss 编号完全不同。)

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

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

回复:更新2

RAM 依次保存全局变量、堆和堆栈。

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

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

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

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

于 2013-05-29T05:05:03.697 回答
1

我认为您应该删除-A(all) 标志,因为这会为您提供所显示的更底层的列表。

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

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

于 2013-05-28T11:58:03.363 回答
0

我猜在您的链接器脚本中,RAM 为 0,Flash 为 0x80000000,因此所有需要进入 RAM 的东西都位于地址 0+(.stack 是最后一个 61440(跨越下一个 4k))。因此,您将需要更多 64k 的 RAM。您拥有的其他一切都是闪存。

前提是您的链接描述文件是正确的。

另请参阅 unwind 的评论。

于 2013-05-28T12:07:19.817 回答
0

你可以试试

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

以十进制表示的大小。

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

于 2013-05-28T12:26:07.290 回答
0

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

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

于 2013-05-28T11:59:12.890 回答