【问题标题】:Does importing libraries load everything in Arduino?导入库是否会在 Arduino 中加载所有内容?
【发布时间】:2013-03-08 10:24:14
【问题描述】:

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

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

请进一步指出任何描述 Arduino 内存管理的好文章。

【问题讨论】:

    标签: memory-management embedded arm arduino microcontroller


    【解决方案1】:

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

    【讨论】:

    • 我看到 #include <..> 的位置包裹在 #ifdef (0) 周围仍然得到分配的 RAM。大概是其功能的指针。我不确定 IDE 使用的优化效率如何。因此,从未使用的库中编译了一些东西。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      您可以“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
      

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

      【讨论】:

      • 我需要回去看看为什么我上面关于 #def'ed out 库的评论仍然使用 RAM。
      猜你喜欢
      • 2012-11-17
      • 2012-12-08
      • 1970-01-01
      • 2013-05-08
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多