自己動手打造嵌入式Linux軟硬體開發環境
--------------------------------------------------------------------------------
2005-01-13 10:55:22 來自:linux先生
Linux和uClinux
1991年8月,芬蘭的一個學生在comp.os.minix新聞群組貼上了以下這段話:
你好所有使用minix的人-我正在為386(486)AT做一個免費的作業系統(只是為了愛好,不會象gnu那樣很大很專業.
這名學生就是Linus Torvalds, 而他所說的'愛好'就變成我們今天知道的Linux。
由於Linux的原始碼公布在互連網上,可以免費得到,因此從一開始就吸引了世界各地的UNIX 行家為Linux
編寫了大量的驅動程式和應用軟體,在短短几年時間裡,Linux
就發展成為一個相當完善的作業系統,而且Linux支援的硬體平台是所有作業系統中最多的,目前Linux支援硬體平台:Intel的IA64、
Compaq的Alpha、Sun的Sparc/Sparc64、SGI的Mips、IBM的S396、ARM、PowerPC等。Linux更大的影響在於它正逐漸地應
用於嵌入式裝置,uClinux正是在這種氛圍下產生的。uClinux就是Micro-Control-Linux,它也是一個開放源碼的項目,uClinux的原始碼
和開發工具可以免費從http://www.uclinux.org上下載得到。uClinux是專為那些沒有MMU(記憶體管理單元)的嵌入式處理器開發的,和主流的Li
nux相比,uClinux有以下的特點:
1.簡化了核心載入方式,uClinux
的核心可以在Flash上直接運行:就是把uClinux的核心的可執行映象燒寫到flash上,系統啟動時從Flash的某個地址開始逐句執行;也可以載入到記憶體中運行
:把核心的壓縮檔存放在Flash上,系統啟動時讀取壓縮檔在記憶體裡解壓,然後開始執行。
2.採用了romfs檔案系統作為root檔案系統:這種檔案系統相對於一般的ext2檔案系統要求更少的空間,首先核心支援romfs檔案系統比支援
ext2檔案系統需要更少的代碼,其次romfs檔案系統相對簡單,建立檔案系統superblock需要更少的儲存空間。Romfs檔案系統不支援動態擦寫,對於系統需
要動態儲存的資料採用RAM盤的方法處理,RAM盤採用ext2檔案系統。
3.使用了Flat可執行檔格式:elf格式有很大的檔案頭,flat檔案對檔案頭和一些段資訊做了簡化。
4.重寫了應用程式庫:
uClibc對libc做了精簡,uClinux對使用者程式採用靜態串連的形式。uClinux的開發環境
www.uclinux.org為uClinux提供了GNU的交叉編譯器,包括以下組件:Gcc交叉編譯器,即在宿主機上開發編譯目標上可啟動並執行二進位檔案;Binut
ils協助工具輔助,包括objdump、as、ld等;Gdb調試器。以在ARM7上開發uClinux為例:
1.獲得uClinux-dist的源碼包,www.uclinux.org上定期為新推出的Linux核心推出相應的源碼包,最新的版本為Kernel-2.4.21,
可以從http: //www.uclinux.org/pub/uClinux/dist/
上免費下載得到。這個源碼包裡包含了uCLinux-2.4.21、uClibc和已經移植到uClinux下的使用者應用程式。下載完後,會得到一個
uClinux-dist-20030522.tar.gz的檔案,把它儲存到/home目錄下,然後執行:tar zxvf
uClinux-dist-20030522.tar.gz,當tar程式運行完畢後,在/home目錄下會有一個/home/uClinux-dist
的新目錄,這個目錄就是uClinux的源碼根目錄,裡面有進行uClinux開發的所有的原始碼。
2.獲得ARM開發工具,www.uclinux.org提供uClinux源碼的同時還提供相應的交叉編譯工具。要在開發主機上為ARM7目標系統編譯uClinux,
還需要從http://http: //www.uclinux.org/pub/.../arm-elf-tools/
上下載ARM交叉編譯器:arm-elf-tools-20030314.sh。得到這個檔案以後,執行以下命令:sh
arm-elf-tools-20030314.sh,這個命令會在開發主機上自動建立一個uClinux-ARM的交叉編譯環境。鍵入arm-elf- gcc,
如果能看到下面的輸出資訊:Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specsgcc
version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux XIP and shared lib patchesfrom
http://www.snapgear.com/)表示uClinux-ARM的交叉編譯環境已經建立起來了。
現在開發主機裡已經有了uClinux的原始碼和編譯這些原始碼的工具,也可以用make menuconfig,
make等命令來編譯uClinux和使用者程式,為ARM目標板編譯了一個核心映像檔案,接下來要做得是需要一塊ARM7的開發板來運行這個映像檔案(關於如何編譯uCl
inux和使用者程式請參考www.uClinux.org 上得相關文檔)。構建ARM7-uClinux開發板
uClinux只需要極少的硬體資源就可運行起來,以ARM7TDMI為例,只需要以下硬體: 1.CPU ? Samsung S3C4510B
2.SDRAM 8M以上 3.一個簡易的串口 4.2M Flash 5.一個乙太網路介面(可選)
目前各嵌入式微處理器的廠商在推出每款處理器的同時都會提供一個Demo板,供使用者來測試微處理器的效能。Samsung公司對S3C4510B處理器提供了一款SNDS
100的Demo板。Demo板的原理圖可以從Samsung公司的網站上免費下載,對這個原理圖作一些修改,只保留上面列出的5個部分,去掉其他多餘的部分。修改以後的
原理圖就是一個能夠運行uClinux的ARM7目標板原理圖,然後根據這個原理圖去加工幾張PCB板,焊上相應的元件,一塊能運行uClinux的ARM7開發板就做成
了(這款開發板相應得原理圖、PCB圖可以從http://www.dailzh.net上免費下載得到)。
慢著,雖然這塊開發板已經焊接完成,但目前它只是一堆電子零件的簡單組合,要在它上面跑uClinux,還需要相應的軟體來管理這些硬體。
前面提到uClinux可以從Flash中直接運行,就是說可以將uClinux的映像檔案直接燒寫到Flash中,然後上電,uClinux會從
Flash中啟動嗎?是的,確實如此。現在要做的就是如何將uClinux的核心映像燒寫到Flash中。用寫入器將uClinux核心映像寫入到
Flash中,然後將Flash焊接到pcb板上或插到開發板的flash的插座上可以嗎?當然可以,如果你有寫入器的話。不過,很少有人手裡能有這種寫入器。我們需要的
是一個廉價的Flash寫入方案。用JTAG,S3C4510B上整合了一個JTAG,通過JTAG我們可以控制S3C4510B上所有管腳,這樣可以通過向JTAG介面
輸入相應的指令和資料,用軟體的方法在S3C4510B的資料、地址和控制匯流排上產生出Flash器件的讀寫操作時序,將uClinux的核心映像檔案燒寫到Flash中
(關於S3C4510B的JTAG介面電纜的製作和下載燒寫uClinux映像檔案到Flash中的程式可執行檔和原始碼請參閱http://www.dailzh.net
上相關內容)。
終於將uClinux的映像檔案燒寫到Flash中了,用一根串口電纜將ARM7開發板和開發主機的Com1口串連起來,從網上下載一個tip程式,執行這個命令:tip
?l /dev/ttyS0 ?s 19200等螢幕上顯示
connected.以後,將ARM7開發板的電源接通。如果夠幸運的話,你應該看到下面的資訊:>>Linux version 2.4.20-uc0
(root@dailzh) (gcc version 2.95.3>>20010315 (release)(ColdFire patches -
20010318 from http://fiddes.net/coldfire/)>>(uClinux XIP and shared lib patches
from http://www.snapgear.com/)) 一 5月19 23:44:11 CST 2003>>Processor: Samsung
S3C4510B revision 6>>Architecture: SNDS100>>On node 0 totalpages: 4096>>zone(0):
0 pages.>>zone(1): 4096 pages.>>zone(2): 0 pages.>>Kernel command line:
root=/dev/rom0>>Calibrating delay loop... 49.76 BogoMIPS…>>Command: cat
/etc/motd>>Welcome to uClinux.org>>For further information check:
http://www.uclinux.org/>>/>uClinux在ARM7目標板上已經運行起來了,鍵入熟悉的ls命令,看有什麼輸出。
通過JTAG介面燒寫uClinux映像檔案到Flash中速度太慢,調試uClinux核心非常不方便,有沒有其他的方法?有,uClinux除了可以從Flash中直
接運行外,還可以載入到記憶體中運行。我們來為ARM7開發板寫一個Bootloader,Bootloader的作用是初始化ARM7開發板,然後通過乙太網路介面將uCl
inux映像下載到記憶體中,然後從記憶體中運行uClinux。這種方法下載uClinux核心映像只需要10幾秒,適合於開發階段經常修改uClinux核心時使用(Bo
otloader for ARM7的原始碼可以從http://www.dailzh.net
上下載得到)。調試完uClinux的核心以後,可以再通過JTAG介面燒寫uClinux映像檔案到Flash中,這樣又可以直接從Flash中運行調試好的uClin
ux了。uClinux下使用者程式的開發和調試
現在ARM7開發板可以運行uClinux了,如何開發uClinux下的應用程式呢?和在普通電腦上開發Linux程式一樣,首先編寫應用程式的原始碼,只不過編譯的
時候不能用gcc編譯,需要用arm-elf-gcc編譯。編譯以後的可執行檔必須下載到ARM7開發板上才能運行,下載程式到目標板上可以通過在uClinux中啟用
tftpd程式,在開發主機端用tftpcmd
程式來下載,然後在uClinux的控制台視窗鍵入可執行檔名的方法來運行。如果想要應用程式在uClinux啟動時自動運行,可以修改uClinux
系統中/etc/rc檔案的內容來來實現。如果要用gdb來調試使用者程式,可以參考www.uclinux.org上的相關文檔。關於作者dai lizhou ,
愛好嵌入式系統和Linux開發, 如果你對嵌入式Linux開發有興趣請訪問我們的網站http://www.dailzh.net, 誠邀你的加盟。