2011-05-31 76 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