【问题标题】:RAM usage AT32UC3B0512RAM 使用 AT32UC3B0512
【发布时间】:2015-04-08 13:54:47
【问题描述】:

我正在寻找一种方法来查看在 at32uc3b0512 上运行的应用程序的 RAM 使用情况。

arv32-size.exe foo.elf 告诉我:

  text    data     bss     dec     hex filename
263498   11780   86524  361802   5854a foo.elf

根据“google”,RAM 使用量为 .data + .bss。但是 .data + .bss 已经是 (11780+86524)/1024 = 96kb,这意味着我的 RAM 已满(at32uc3b0512 -> 96kb SRAM)。但是该应用程序可以按需要工作。我错了吗???

【问题讨论】:

  • 链接器在构建期间生成的 .map 文件应该告诉您每个部分的大小。这可能是一种仔细检查 arv32-size.exe 告诉你的方法。
  • 试试avr32-size -A,输出往往更理智。请参阅stackoverflow.com/questions/16791311/… 上的较早讨论。
  • 如果我尝试 avr32-size.exe -A,.data 具有相同的大小,但 .bss 只有 21664 ......因此一切正常。但是为什么avr32-size.exe在不同的模式下会绘制不同的值呢?
  • 我发现了与 *-size 实用程序类似的问题,除了我正在报告 RAM 利用率。我建议您将您的发现提交到 avr-gcc 的邮件列表

标签: c embedded avr winavr


【解决方案1】:

您使用的芯片有 96kB 的 RAM,这也是 .bss 和 .data 部分的总和。这并不意味着您的所有 RAM 都已用完,而只是显示 RAM 是如何分配的。

【讨论】:

    【解决方案2】:

    MCU上的程序通常位于FLASH中

    • 如果您有一些操作系统,则不是这样
    • 并在运行时从 SD 卡之类的地方将程序加载到内存中
    • 并非所有 MCU 都能做到这一点
    • 我怀疑这不是你的情况
    • 程序 Flash 有 512 KB 大(我从你的 IC 编号猜测)

    SDRAM 用于 C 引擎/OS、堆栈和堆

    • 你的芯片有 96 KB
    • C 引擎类似于操作系统处理
    • 动态分配、堆、栈、子程序调用
    • 包括编译期间使用的 RTL
    • 以及用于未使用中断的粗略虚拟中断子例程...

    当你将程序编译为 ELF/HEX 时

    • 编译器/链接器只告诉你
    • 程序代码和数据有多大(位于程序闪存中)
    • 你有多大的静态变量
    • 其余的直到运行时本身才知道

    所以如果你需要知道你占用了多大的内存

    • 那么你需要从运行时提取它
    • 通过一些 RTL 调用来获取内存状态
    • 或根据以下知识自行估算
    • 你的程序做什么
    • 使用了多少动态内存
    • 堆/堆栈垃圾/使用
    • 递归级别等...
    • 或者您可以尝试增加内存分配,直到内存不足
    • 并计算您总共分配了多少块
    • 然后释放它的粗略
    • 然后使用的内存是~ 96KB - altogether_allocated_memory
    • (+/-) 粒度...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-12
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2018-11-28
      • 2013-05-29
      相关资源
      最近更新 更多