【问题标题】:How to interpret avr32-size output?如何解释 avr32 大小的输出?
【发布时间】:2013-05-28 11:49:38
【问题描述】:

我在 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 user-manual,可用RAM空间应该是:stackpointer减去__heap_start

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

有人可以确认吗?

【问题讨论】:

    标签: avr avr-gcc


    【解决方案1】:

    (您的问题中的两个输出不匹配。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。

    【讨论】:

    • 感谢您的回答。我已经仔细检查了。两个输出都是使用相同的 .elf 文件生成的。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回答。我在我的问题中添加了不带-A 标志的输出。为什么 bss 值如此不同?
    【解决方案3】:

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

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

    另见 unwind 的评论。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        你可以试试

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

        以十进制表示的大小。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-24
          • 2014-08-09
          • 2021-06-01
          • 2014-02-03
          • 2018-09-16
          • 2018-09-09
          • 1970-01-01
          相关资源
          最近更新 更多