【发布时间】:2013-10-24 22:34:52
【问题描述】:
我正在为Arduino Due 开发,它有 96k SRAM 和 512k 闪存用于代码。如果我有一个可以编译到 50k 的程序,那么当我运行代码时,我将使用多少 sram?我会立即使用 50k,还是只使用我调用的函数使用的内存?在我将草图上传到 arduino 之前,有没有办法测量这种内存使用情况?
【问题讨论】:
我正在为Arduino Due 开发,它有 96k SRAM 和 512k 闪存用于代码。如果我有一个可以编译到 50k 的程序,那么当我运行代码时,我将使用多少 sram?我会立即使用 50k,还是只使用我调用的函数使用的内存?在我将草图上传到 arduino 之前,有没有办法测量这种内存使用情况?
【问题讨论】:
你可以跑
arm-none-eabi-size bin.elf
地点:
bin.elf 是生成的二进制文件(在编译日志中查找)arm-none-eabi-size 是 Arduino for arm 附带的一个工具,可让您了解二进制文件的内存分布。这个程序可以在 Arduino 目录中找到。在我的 Mac 中,这是/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/g++_arm_none_eabi/bin
此命令将输出:
text data bss dec hex filename
9648 0 1188 10836 2a54 /var/folders/jz/ylfb9j0s76xb57xrkb605djm0000gn/T/build2004175178561973401.tmp/sketch_oct24a.cpp.elf
data + bss 是 RAM,text 是程序存储器。
非常重要:这不考虑动态内存(在堆栈中创建),这只是用于静态和全局变量的 RAM 内存。还有其他技术可以动态检查 RAM 使用情况,例如 this one,但这取决于您使用的编译器套件的链接器功能。
【讨论】:
您的整个程序已加载到 arduino,因此将使用 至少 50K 闪存。然后在运行代码时,您将分配一些变量,一些在堆栈上,一些全局变量也将占用一些内存,但在 SRAM 上。
我不确定是否有办法精确测量所需的内存,但您可以根据代码中分配的变量的数量和类型进行粗略估计。请记住,在代码在 arduino 上运行的整个过程中,全局变量将占用空间,局部变量(在一对 {..} 中声明的变量)保留在内存中,直到 '}' 大括号也已知作为变量的范围。还要记住,您提到的编译后的 50K 代码只是代码部分,它不包括您的变量,甚至不包括全局变量。代码存储在闪存中,变量存储在 SRAM 中。变量仅在运行时才开始占用内存。
我也很想知道您是如何计算代码使用 50K 内存的?
【讨论】:
这是一个输出可用 RAM 内存的小库。 当我的程序崩溃并且代码中没有错误时,我经常使用它。原来我的内存快用完了。 所以非常好用!
希望对您有所帮助! :)
【讨论】: