0

我正在使用为 Arduino 编写的各种开源库来试验 Arduino。这些库中的大多数都有数百种方法/功能,但我实际上只使用了其中的一小部分。

在这种情况下,Arduino 是否会将所有内容加载到它的内存中?换句话说,从库中提取所需的内容有什么好处吗?

此外,请指出任何描述 Arduino 内存管理的好文章。

4

3 回答 3

1

不,不是的。它只是使用您通过#include 语句选择的库。
由于 arduino 中的内存有限,您只能加载所需的库,一旦编译它们,只有所需的函数会被编译成二进制文件。所以内存使用量是最小的。
看看 arduino 的内存模型http://arduino.cc/en/Tutorial/Memory,相当简洁。

于 2013-03-08T13:58:45.863 回答
0

静态链接库是存档中目标文件的集合。链接器将搜索库以解析代码中的引用,并将仅提取和链接那些包含解析此类符号所需的代码的目标文件。

这有多有效取决于库的粒度。例如,如果所有函数(即使是您不需要的函数)都定义在单个目标文件中,则链接器将提取并链接整个目标文件,这可能会导致代码臃肿。理想情况下,库作者将为每个目标文件定义一个外部接口(或至少始终一起使用的接口)。

智能链接器可以执行所谓的链接器反馈,它本质上执行链接两次,因此即使在单个目标文件中也可以删除未引用的代码。我不知道您的链接器是否这样做,但大概信息将在文档中。

在任何情况下,您都可以让链接器生成一个链接图,该图将准确显示已链接的内容以及链接的大小。当然请注意,许多库函数将依赖于其他库函数,因此将包含您在任何情况下都可能没有直接引用的代码。

于 2013-03-08T11:38:06.323 回答
0

您可以“avr-objdump -t”从您的精灵创建地图。-d 用于汇编列表。至于自己看。您需要从 IDE 的首选项中启用显示编译的详细输出,以显示包含 elf 文件的临时目录。

例子:

C:\DOCUME~1\mflaga\LOCALS~1\Temp\build6395515806682540138.tmp>C:\projects\Arduino\hardware\tools\avr\bin\avr-objdump -t MP3Shield_Library_Demo.cpp.elf > MP3Shield_Library_Demo_wo_mem.cpp.elf.map
C:\DOCUME~1\mflaga\LOCALS~1\Temp\build6395515806682540138.tmp>C:\projects\Arduino\hardware\tools\avr\bin\avr-objdump -d MP3Shield_Library_Demo.cpp.elf > MP3Shield_Library_Demo_wo_mem.cpp.elf.lst

我做了上述操作,并在后续构建之间注释掉了对我的库的函数成员的调用。查看代码没有链接到程序集中。

于 2013-03-08T14:55:21.000 回答