我正在开发Arduino Due,它有96k SRAM和512k闪存代码。如果我有一个程序可以编译成50k,当我运行代码时,我将使用多少sram?我会立即使用50k,还是仅使用我调用的函数使用的内存?在将草图上传到arduino之前,有没有办法测量这种内存使用情况?
答案 0 :(得分:2)
你可以运行
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,但这取决于您使用的编译器套件的链接器功能。
答案 1 :(得分:0)
您的整个程序已加载到arduino中,因此将使用至少 50K闪存。然后在运行代码时,你将分配一些变量,一些在堆栈上,一些是全局的,它们也会在SRAM上占用一些内存。
我不确定是否有办法准确测量所需的内存,但您可以根据代码中分配的变量的数量和类型进行粗略估计。请记住,全局变量将在代码在arduino上运行的整个时间内占用空间,局部变量(在一对{..}中声明的变量)保留在内存中,直到'}'大括号也知道作为变量的范围。还要记住,你提到的编译后的50K代码只是代码部分,它不包括你的变量,甚至不包括全局变量。代码存储在闪存中,变量存储在SRAM中。变量仅在运行时开始占用内存。
我还想知道你是如何计算代码使用50K内存的吗?
答案 2 :(得分:0)