2011-05-31 73 views
5

我是新来的嵌入式系统,并想了解更多信息,嵌入式系统头功能

我目前优化软件对足迹的ARM嵌入式系统的问候,并正在琢磨,头文件,你包括在你的源文件中。他们放在哪里?

现在我只是使用软件(OVP)来模拟ARM硬件平台,但在真实硬件中,您必须将头文件放在正确的位置?就像在gcc上的高清标准库一样。我们是否也必须将这个库插入到嵌入式机器中?空间有限!有什么办法可以最小化图书馆的大小?谢谢!

#include <stdio.h>

#include <stdlib.h>

我使用的交叉编译器臂ELF-GCC

问候

先生Gigu

+0

那些不是图书馆。 – 2011-05-31 07:02:51

+0

这些是什么? – MrGigu 2011-05-31 07:03:14

+0

这些是头文件。 – 2011-05-31 07:05:17

回答

11

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

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

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

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

关于仅包含声明性代码的头文件的例外情况是,它们包含宏中的内嵌代码或可执行代码。但是,如果应用程序明确调用,则这些代码只占用应用程序中的空间。

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

+0

感谢您的解释!如果我想找到更多关于此的信息,我应该搜索什么?链接器和编译器? – MrGigu 2011-05-31 09:11:54

+0

我在这里是否正确,如果我使用中的printf函数,那么只有该函数会被编译到可执行的elf文件中?所以如果我发现其他图书馆有一个较小的printf函数(如在其他答案中的饮食libc),我可以将c文件复制到相同的文件夹,并用“”代替<>来包含它? – MrGigu 2011-05-31 11:39:13

+0

如果您使用'printf()'包含其实现的对象文件并且包含任何进一步的依赖关系的对象文件将被包括在内,否则不会。根据库的粒度和内聚性,可能包括您可能不需要的东西。在某些情况下,C运行时可能是共享库或DLL(如Windows/VC++和MinGW中MSVCRT.DLL的情况),在这种情况下,它对可执行文件大小的影响很小,但仍会有运行时内存占用。 – Clifford 2011-05-31 22:09:43

1

该库indee d必须包含在烧入嵌入式系统内存的映像中。通常你会告诉链接器去掉未使用的函数,这对保存内存有很大的帮助。但是这个内存是你的程序在闪存中使用的内存,或者你用于非易失性代码存储的内存。它没有提到你的程序在运行时需要多少内存。您还可以告诉编译器优化空间,并使用不同的运行时库 - 供应商提供的库通常不会像它们那样快或小。

+0

当对-O1进行任何优化时,我的软件停止工作,软件(管理程序)处理大量的上下文切换和中断汇编语言),我认为与内存位置等优化混乱 – MrGigu 2011-05-31 08:01:42

+0

我很不确定你如何使用不同的运行时库,是你必须安装和指定的生成文件?我使用arm-elf-gcc,它使用自己的标准库,我猜?我也使用Windows 7. – MrGigu 2011-05-31 08:05:37