首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释avr32 32大小的输出?

如何解释avr32 32大小的输出?
EN

Stack Overflow用户
提问于 2013-05-28 11:49:38
回答 5查看 1.5K关注 0票数 1

我在AVR32微控制器(UC3C0512C)上运行C程序。发出avr32-size -A PROGRAM.elf命令将生成以下输出:

代码语言:javascript
复制
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标志,我将得到以下内容:

代码语言:javascript
复制
   text    data     bss     dec     hex filename
 113296    7548   58496  179340   2bc8c PROGRAM.elf

更新2:

我不使用动态内存分配,因此根据avr-libc用户手册,空闲内存空间应该是:stackpointer减去__heap_start

在本例中:61440 - 12904 = 48536字节空闲内存空间。

有人能证实一下吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 2013-05-28 11:58:03

我认为您应该删除-A (all)标志,因为这会给您显示更低级别的列表。

默认输出更易于解析,并且似乎直接声明了所要的值。

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

票数 1
EN

Stack Overflow用户

发布于 2013-05-28 11:59:12

这些值是编译后的C代码的汇编语言部分。有关细节,请参见文档。这个文章也很有用。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16791311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档