【问题标题】:Embedded systems header functions嵌入式系统标头函数
【发布时间】:2011-09-05 06:08:04
【问题描述】:

我是嵌入式系统的新手,想了解更多,

我目前正在针对 ARM 嵌入式系统的占用空间优化软件,并且想知道您包含在源文件中的头文件。它们放在哪里?

现在我只是使用软件(OVP)来模拟 ARM 硬件平台,但在实际硬件中,您必须将头文件放在某个地方对吗?就像在 gcc 中一样,在 hd 上有标准库。我们是否也必须在嵌入式机器中插入这个库?空间有限!有什么方法可以最小化库的大小?谢谢!

例子

#include <stdio.h>

#include <stdlib.h>

我正在使用交叉编译器 arm-elf-gcc

最好的问候

吉古先生

【问题讨论】:

  • 那些不是图书馆。
  • 哦,好的,得改一下,谢谢!
  • <stdio.h> 等不必是占用硬盘空间的真实文件(尽管它们通常是)。我称它们为“标头”(有时称为“系统标头”);我将“头文件”称为引用品种:#include "foobar.h"

标签: c embedded


【解决方案1】:

您似乎对已编译的可执行代码存在一些基本误解。以下适用于嵌入式和桌面系统。

头文件与其他任何源文件一样。不同之处在于它们是由预处理器插入到编译单元中,而不是直接编译。此外,在大多数情况下,它们仅包含声明性语句,并且通常不会在可执行指令或存储数据的意义上对生成的代码做出贡献。

在运行时没有您的源代码需要存在于目标上;编译器的工作是从您的源代码生成本机可执行机器代码。在目标上存储和运行的正是这个机器代码。

头文件与不同。它只是(通常)库内容的声明(函数原型和其他符号声明,如常量、数据、宏、枚举)。该库采用存储在组合档案中的预编译/组装目标代码的形式。链接器的工作是将所需的库代码与通过编译您自己的源代码生成的目标代码相结合。在目标上存储和执行的是这个链接的可执行文件,而不是原始源代码。

仅包含声明性代码的头文件的例外情况是它们在宏中包含内联代码或可执行代码。但是,如果应用程序显式调用此类代码,则只会占用应用程序中的空间。

当链接库代码时,仅链接应用程序代码中解析引用所需的那些库目标代码组件,而不是整个库(除非整个库仅由单个目标文件组成)。

【讨论】:

  • 感谢您的解释!如果我想找到有关此的更多信息,我应该搜索什么?链接器和编译器?
  • 我说得对吗,如果我在 中使用 printf 函数,只有那个函数会被编译成可执行的 elf 文件吗?因此,如果我找到其他具有较小 printf 函数的库(例如另一个答案中的 Diet libc),我可以将 c 文件复制到同一个文件夹中,并将其包含在 " " 而不是 ?
  • 否,如果您使用printf(),则包含其实现的目标文件以及包含任何进一步依赖项的目标文件将被包括在内。根据库的粒度和凝聚力,这可能包括您可能不需要的东西。在某些情况下,C 运行时可能是共享库或 DLL(就像 Windows/VC++ 和 MinGW 中的 MSVCRT.DLL 一样),在这种情况下,它对可执行文件大小的影响最小,但仍具有运行时内存占用。
【解决方案2】:

该库确实必须包含在刻录到嵌入式系统内存中的映像中。通常您会告诉链接器删除未使用的函数,这对节省内存大有帮助。但是这个内存是您的程序在闪存中占用的内存,或者您用于非易失性代码存储的任何内存。它没有说明您的程序在运行时需要多少 RAM。您还可以告诉您的编译器优化空间,并使用不同的运行时库 - 供应商提供的运行时库通常没有它们应该的那么快或那么小。

【讨论】:

  • 我的软件在对 -O1 进行任何优化时停止工作,软件(管理程序)处理大量上下文切换和中断(使用内联汇编程序),我认为优化与内存位置等混淆。
  • 我很不确定您如何使用不同的运行时库,这是您必须在 makefile 中安装和指定的东西吗?我使用 arm-elf-gcc,我猜它使用自己的标准库?我也使用 Windows 7。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多