- 論壇徽章:
- 0
|
Linux驅(qū)動(dòng)在PC機(jī)器上運(yùn)行之后,接著的工作就是交叉編譯驅(qū)動(dòng),使其能在嵌入式環(huán)境下運(yùn)行。
理論上的辦法就是通過交叉編譯工具:arm-linux直接交叉編譯,生成于平臺(tái)相關(guān)的機(jī)器代碼。經(jīng)過兩次交叉編譯驅(qū)動(dòng)的實(shí)踐,分析arm-linux交叉編譯的過程,可以總結(jié)出交叉編譯的基本原理及過程:
當(dāng)程序采用arm-linux實(shí)現(xiàn)編譯的時(shí)候,首先要使程序的編譯工具指向arm-linux,這里有三種方式:
(1) 對(duì)小而簡單的程序,實(shí)現(xiàn)直接編譯,采用如下例子命令:
./usr/local/arm/2.95.3/arm-linux/bin/arm-linux-gcc hello.c
(2) 對(duì)一般的內(nèi)核級(jí)驅(qū)動(dòng)程序,一般情況,它所包含的文件不多,代碼量不大,Makefile文件相對(duì)簡單,直接修改其Makefile文件,使其所采用的編譯工具為arm-linux,并所連接的庫文件為arm-linux庫。
如:修改Makefile文件的特定幾行:
CC=/usr/local/arm/2.95.3/arm-linux/bin/arm-linux-gcc
Kinclude=/usr/local/arm/2.95.3/arm-linux/include
(3) 對(duì)于較復(fù)雜的程序,一般情況,包含的文件多,所要求的庫種類多,代碼量大,這樣的程序編譯起來比較復(fù)雜,面對(duì)這樣的程序:
一種方法是在閱讀幫助文檔,以此獲取信息,是不是程序本身就對(duì)交叉編譯有所考慮,如(CUPS),可以采用如下命令:
./configure –host=arm-linux (它本身就為交叉編譯做了考慮,由./configure命令生成對(duì)應(yīng)的Makefile文件,采用如上的命令,它自動(dòng)使用交叉編譯工具實(shí)現(xiàn)編譯)
另一種辦法是常用的辦法,修改Makefile文件,在比較大的程序,這種辦法,需要閱讀Makefile文件和配置文件,工作量較大。
交叉編譯過程中,所面對(duì)的最大問題就是程序所需要的庫找不到,或是版本不一致,如此在Make過程中就會(huì)出錯(cuò),面對(duì)這種情況,搞清楚arm-linux的編譯連接過程,是十分重要的,特別是弄清楚,編譯器在哪里找?guī),在什么地方有?/strong>。
編譯器在哪里找?guī)?/strong>:
所有的庫文件和頭文件都放在交叉編譯工具包的arm-linux/lib,include文件夾,當(dāng)交叉編譯開始之后,編譯器會(huì)自動(dòng)的在這兩個(gè)文件夾里尋找頭文件和庫。
在什么地方有庫:
在交叉編譯過程中,最常見和令人頭痛的問題就是找不到需要的庫文件,而庫的來源有兩個(gè)地方:
1. 如上所述,在arm-linux文件夾里自帶了庫,這里的庫對(duì)一般的應(yīng)用程序已經(jīng)足夠,編譯普通程序,足夠應(yīng)付。
2. 對(duì)于需要庫比較多,比較復(fù)雜的程序,往往編譯器自帶的庫是不足夠的,比如gutenprint的編譯。如此,查找第二個(gè)庫中的文件成為唯一的途徑,即查找開發(fā)板自帶的文件系統(tǒng)中的庫,然后將需要的庫和頭文件,copy到arm-linux對(duì)應(yīng)目錄下,如此就解決了庫不足的問題,通常情況下,文件系統(tǒng)所帶的庫遠(yuǎn)比編譯器所帶的庫多。
采用第二種方法,gutenprint的編譯通過。另外:即使在以上兩個(gè)地方都找不到庫,那么在報(bào)錯(cuò)之后,確定程序所缺少的庫文件和頭文件,然后在網(wǎng)上下載源代碼,交叉編譯成項(xiàng)目所需要的庫,也能解決交叉編譯的問題,只是工作量會(huì)大一些。
一. 關(guān)于Nandflash空間的問題:
1. 項(xiàng)目產(chǎn)品的發(fā)布:
我所考慮的:最后的項(xiàng)目產(chǎn)品發(fā)布形式應(yīng)該是:硬件部分——六層電路板,軟件部分——系統(tǒng)核心zImage,文件系統(tǒng)XXX.cramfs(文件系統(tǒng)中包含了項(xiàng)目開發(fā)發(fā)布的驅(qū)動(dòng)程序和應(yīng)用程序)。
硬件的nandflash決定了最大的硬件空間64M,通過分析現(xiàn)有的優(yōu)龍文件系統(tǒng),其壓縮后的格式Y(jié)L2410_camare_demo.cramfs, 其具體大小為27M。但在系統(tǒng)中解壓縮之后,已經(jīng)大到57M左右,基本上將硬件空間占滿,但仔細(xì)觀察其內(nèi)部文件夾的結(jié)構(gòu),系統(tǒng)運(yùn)行必須要的文件夾只有10M左右,而且還有再裁減的空間。而最多的Nanndflash空間,為優(yōu)龍所開發(fā)的QT應(yīng)用和庫所占據(jù),有50M左右,同時(shí)在其中QT庫只占了10M左右。
可見,最后裁取優(yōu)龍開發(fā)的QT程序,核心所必需的系統(tǒng)文件與QT程序必需的庫文件總共需要20M左右的空間,剩余的44M左右空間,應(yīng)該能夠滿足驅(qū)動(dòng)移植和QT應(yīng)用程序的空間需要。
另:在Linux下掛接目標(biāo)機(jī)文件系統(tǒng)的命令如下:
mount YL2410_camare_demo.cramfs /root/filesystem –o loop
掛接之后進(jìn)入filesystem文件夾就可以看到文件系統(tǒng)所有文件。
另:程序的自加載和自運(yùn)行問題:
對(duì)于驅(qū)動(dòng)程序的自加載,通過閱讀資料和跟蹤啟動(dòng)過程,已經(jīng)找到一種方法:
可以通過修改根目錄下的Linuxrc文件,在其中加入一條語句,就可以實(shí)現(xiàn)驅(qū)動(dòng)的自加載運(yùn)行:
/bin/insmod /usr/spca5xx.o (假定攝相頭驅(qū)動(dòng)放在了 /usr目錄下)
這樣,系統(tǒng)啟動(dòng)之后就會(huì)加載此驅(qū)動(dòng)(此方法已通過實(shí)驗(yàn),自加載成功)。
對(duì)于QT程序的自加載方法,用戶手冊(cè)有詳細(xì)的描述,不在此敘述。
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/24981/showart_190417.html |
|