ARM 4510開(kāi)發(fā)板移植uclinux手記
三、 建立交叉編譯環(huán)境
1、 體系結(jié)構(gòu)的概念
大部分宿主機(jī)的cpu都是建立在X86體系結(jié)構(gòu)上的,如intel或賽揚(yáng)的cpu,也有其它體系結(jié)構(gòu)的,但沒(méi)有arm體系的,因?yàn)閍rm幾乎是嵌入式設(shè)備專(zhuān)用的處理器體系結(jié)構(gòu)了。三星4510微控制器是建立在arm體系結(jié)構(gòu)之上的。體系結(jié)構(gòu)的不同,確立了不同的指令系統(tǒng),就像cpu使用不同的語(yǔ)言一樣。無(wú)法想象英國(guó)人可以讀懂俄文小說(shuō),同樣,為X86體系的cpu編譯的程序,也無(wú)法運(yùn)行在arm體系結(jié)構(gòu)的微控制器之中了。
宿主機(jī)上運(yùn)行的linux 操作系統(tǒng),是建立在X86體系結(jié)構(gòu)上的。在linux操作系統(tǒng)上編譯的程序,一般也是建立在X86體系上的。可以編寫(xiě)幾個(gè)程序,用linux操作系統(tǒng)自帶的編譯工具gcc編譯它們,如果沒(méi)有語(yǔ)法錯(cuò)誤,它們就都可以在宿主機(jī)上運(yùn)行了。但要實(shí)現(xiàn)在宿主機(jī)上編寫(xiě)程序,編譯后程序能在arm體系結(jié)構(gòu)的嵌入式設(shè)備上運(yùn)行,就需要一套特殊的“交叉”編譯工具,如arm-elf-gcc等。所以,在linux操作系統(tǒng)的宿主機(jī)上編寫(xiě)程序,通過(guò)選用交叉編譯工具arm- elf-gcc編譯后,生成的可執(zhí)行文件,就可以在arm體系結(jié)構(gòu)的微控制器上運(yùn)行了。這就是交叉編譯的概念。
2、 建立交叉編譯環(huán)境
通過(guò)引入arm-elf-gcc等交叉編譯工具,可以在宿主機(jī)上建立交叉編譯環(huán)境。這樣,在宿主機(jī)上編譯的程序,就可以在arm體系結(jié)構(gòu)的嵌入式設(shè)備上運(yùn)行了。恒堅(jiān)開(kāi)發(fā)板自帶的文件arm-elf-tools-20030314.sh,只要在linux環(huán)境下執(zhí)行它,就可以建立起完整的交叉編譯環(huán)境。
四、 編譯和下載uclinux操作系統(tǒng)
uclinux 操作系統(tǒng)已經(jīng)被成功移植到許多微控制器上,其中也包括三星4510微控制器。移植后的uclinux操作系統(tǒng)源代碼中含有微控制器外圍電路的設(shè)置,如 SDRAM數(shù)據(jù)線的位數(shù)。有些嵌入式設(shè)備,同樣是使用三星4510微控制器,卻用一片現(xiàn)代公司的8Mx16bits的SDRAM,這樣微控制器與 SDRAM的數(shù)據(jù)交換,就只用微控制器的低16位數(shù)據(jù)線。微控制器中的寄存器EXTDBWTH,用于配置每組(FLASH、SDRAM和外部I/O芯片等)的數(shù)據(jù)線的寬度。恒堅(jiān)開(kāi)發(fā)板上是用兩塊8Mx16bits的SDRAM拼成了32位數(shù)據(jù)線寬。
恒堅(jiān)開(kāi)發(fā)板自帶一套移植后的和壓縮了的 uclinux操作系統(tǒng)源代碼文件uClinux-dist-20030522.tar.gz,把它拷貝到宿主機(jī)linux操作系統(tǒng)的/home目錄下,進(jìn)入/home目錄,并用tar xzvf uClinux-dist-20030522.tar.gz命令解壓縮源代碼文件,產(chǎn)生/home目錄下的 /uClinux-dist子目錄,此目錄中含有編譯uclinux操作系統(tǒng)的全部源文件。把恒堅(jiān)開(kāi)發(fā)板自帶的壓縮的補(bǔ)丁文件uClinux-dist- patch.tar.gz拷貝到/uClinux-dist子目錄下。進(jìn)入/uClinux-dist子目錄,并用tar xzvf uClinux- dist-patch.tar.gz命令解壓縮補(bǔ)丁文件,可釋放出兩個(gè)文件:mkpatch和uClinux-dist-20030522- helloworld.patch,執(zhí)行./ mkpatch,既可對(duì)uclinux操作系統(tǒng)的源代碼打補(bǔ)丁。打補(bǔ)丁的根本原因,是為了修正源代碼中的硬件參數(shù)設(shè)置,如原移植源代碼是為一片SDRAM、16位數(shù)據(jù)線寬做的,而恒堅(jiān)的板子上是兩片SDRAM,并通過(guò)高、低16位數(shù)據(jù)線的組合,構(gòu)成32位的數(shù)據(jù)線寬度。這就需要改變寄存器EXTDBWTH的賦值。還有原移植源代碼是為8M字節(jié)的SDRAM作的,而恒堅(jiān)板上是16M字節(jié)的SDRAM,這又要改變寄存器SDRAMCON0的賦值了。
打完補(bǔ)丁后,就可以在/uClinux-dist子目錄下配置uclinux操作系統(tǒng)內(nèi)核了。執(zhí)行 make menuconfig,彈出的配置框中有四項(xiàng)內(nèi)容。在第一項(xiàng)中配置設(shè)備(vendors)為Samsung/4510B,配置函數(shù)庫(kù)為uC- lib,配置內(nèi)核為linux-2.4.x。另三項(xiàng)可不動(dòng),保存后退出。然后順序執(zhí)行如下命令:make dep;make lib_only; make user_only;make romfs;make image;make。如果沒(méi)有報(bào)告錯(cuò)誤,在../uClinux- dist/linux-2.4.x/image子目錄下,就會(huì)有三個(gè)文件。其中,image.ram是非壓縮的uclinux操作系統(tǒng)內(nèi)核,可以利用恒堅(jiān)開(kāi)發(fā)板自帶的boot.bin(也就是一般所說(shuō)的bootloader程序),通過(guò)網(wǎng)口傳送到SDRAM中。這樣,uclinux操作系統(tǒng)即可在 SDRAM中跑起來(lái)了。image.rom則是壓縮的uclinux操作系統(tǒng)內(nèi)核,并包含硬件相關(guān)的頭文件等。利用恒堅(jiān)的集成開(kāi)發(fā)環(huán)境,可以下載 image.rom到開(kāi)發(fā)板的FLASH中,下載需要很長(zhǎng)的時(shí)間。再次上電后,uclinux操作系統(tǒng)就在開(kāi)發(fā)板上跑起來(lái)了。當(dāng)然,通過(guò)開(kāi)發(fā)板串口與宿主機(jī)串口聯(lián)接,在宿主機(jī)上建立控制臺(tái),是觀察和操控開(kāi)發(fā)板上uclinux操作系統(tǒng)的首要條件。
五、 遇到的問(wèn)題和解決的辦法
1、 曾經(jīng)想用cygwin代替linux操作系統(tǒng),花費(fèi)了不少的時(shí)間,但沒(méi)有成功。
2、 linux操作系統(tǒng)可以安裝在大多數(shù)的微機(jī)上,但它無(wú)法識(shí)別我的一臺(tái)三星顯示器,那臺(tái)機(jī)子上就一直沒(méi)有再安裝linux操作系統(tǒng)。我還有一臺(tái)配有賽揚(yáng) 500處理器的組裝機(jī),用它編譯uclinux操作系統(tǒng)內(nèi)核,有時(shí)會(huì)出現(xiàn)錯(cuò)誤。有人說(shuō),linux操作系統(tǒng)對(duì)機(jī)器要求較高,所以我現(xiàn)在用一臺(tái)標(biāo)準(zhǔn)配置的聯(lián)想微機(jī)。
3、 由于我用的恒堅(jiān)開(kāi)發(fā)板上的FLASH芯片地址線17、18腳連焊了,我編譯的內(nèi)核文件image.rom,用恒堅(jiān)的集成開(kāi)發(fā)環(huán)境下載后,總無(wú)法從FLASH中運(yùn)行起來(lái)。我先分析了uclinux操作系統(tǒng)的源代碼,沒(méi)有找到問(wèn)題;又做了一塊Jtag接口板,來(lái)替代恒堅(jiān)的接口板,還是不行;用了其它的FLASH寫(xiě)工具,才把問(wèn)題定位在FLASH芯片上,前后用了兩周的時(shí)間,才解決了問(wèn)題。
評(píng)論