嵌入式軟件工(gong)程師(shi)自學筆記以及體(ti)會(hui)
來源:華清遠見教育科技集團 針對初學嵌入式的(de)廣大朋友們,以(yi)下是我(wo)在初學接(jie)觸嵌入式的(de)過(guo)程中整理處(chu)的(de)一些資料信息,希(xi)望能為大家有(you)所幫助。 一個典型的桌面 Linux 系(xi)統包括 3 個主要的軟件層---linux 內核、C 庫和應(ying)用程序代碼。 內(nei)(nei)核是唯(wei)一可以完全控制硬件的(de)(de)層(ceng),內(nei)(nei)核驅(qu)動(dong)程(cheng)序(xu)(xu)代(dai)表應用(yong)程(cheng)序(xu)(xu)與(yu)硬件之間進行會話。內(nei)(nei)核之上是 C 庫,負責把 POSIX API 轉換為內(nei)(nei)核可以識別的(de)(de)形(xing)式,然(ran)后調(diao)用(yong)內(nei)(nei)核,從應用(yong)程(cheng)序(xu)(xu)向內(nei)(nei)核傳遞參數。應用(yong)程(cheng)序(xu)(xu)依靠驅(qu)動(dong)內(nei)(nei)核來完成特(te)定(ding)的(de)(de)任(ren)務(wu)。 在(zai)設計嵌入式(shi)應(ying)(ying)用(yong)的時候,可(ke)(ke)以不按(an)照這(zhe)種層(ceng)次,應(ying)(ying)用(yong)程序(xu)越過(guo)(guo) C 庫直接和內核(he)(he)會(hui)話,或者把應(ying)(ying)用(yong)和內核(he)(he)捆(kun)綁在(zai)一起,甚至(zhi)可(ke)(ke)以把應(ying)(ying)用(yong)寫為內核(he)(he)的一個線程,在(zai)內核(he)(he)中運行,雖然這(zhe)樣在(zai)移植上(shang)帶來了(le)困難,但考慮嵌入式(shi)系統(tong)對尺寸要求小的特點,是完全可(ke)(ke)行的。不過(guo)(guo)我們使(shi)用(yong)三層(ceng)軟件結構的模(mo)式(shi)來學習嵌入式(shi) linux將會(hui)是我們認識更清晰,簡單可(ke)(ke)行并使(shi)應(ying)(ying)用(yong)具有彈(dan)性。 快速入門 簡單的建立嵌(qian)入式 Linux 應(ying)(ying)用的方法就(jiu)是從我們使用的桌(zhuo)面 Linux 入手,安裝一個喜愛的版本(ben),把我們的某(mou)個應(ying)(ying)用作為(wei)初(chu)始化的一部分(fen),框(kuang)架就(jiu)算完成了。 當然,嵌(qian)入式(shi) linux 應用遠(yuan)比我們(men)的(de)(de)桌面(mian)版本功能簡單(dan)專一,它(ta)也許就是一個用于足彩(cai)的(de)(de)終端機,或是一個數碼(ma)音頻播放器,這些系統除了(le)使用嵌(qian)入式(shi) CPU外,僅僅再需(xu)要一個串口,網口等(deng)少(shao)量的(de)(de)輸入輸出(chu)接口就可以完(wan)成它(ta)們(men)特定的(de)(de)應用了(le)。 在(zai)軟(ruan)件(jian)上(shang),它(ta)可(ke)以按照三層的(de)(de)概念(nian)由(you)內核裝載器,定制的(de)(de)內核和較(jiao)少(shao)的(de)(de)為特定任務設計的(de)(de)靜態(tai)連(lian)接(jie)的(de)(de)應(ying)用程(cheng)(cheng)序(xu)組成。之(zhi)所(suo)(suo)以使用靜態(tai)連(lian)接(jie)的(de)(de)應(ying)用程(cheng)(cheng)序(xu),是因為少(shao)量的(de)(de)靜態(tai)連(lian)接(jie)程(cheng)(cheng)序(xu)所(suo)(suo)要的(de)(de)存儲空(kong)間(jian),比同樣數(shu)量的(de)(de)動態(tai)連(lian)接(jie)的(de)(de)程(cheng)(cheng)序(xu)所(suo)(suo)占的(de)(de)空(kong)間(jian)小(xiao),這個(ge)平衡點需要我們在(zai)實際開發中去獲取。也許你(ni)正在(zai)設計的(de)(de)是個(ge) PDA,它(ta)的(de)(de)應(ying)用程(cheng)(cheng)序(xu)較(jiao)多,那么你(ni)很可(ke)能就要使用動態(tai)連(lian)接(jie)程(cheng)(cheng)序(xu)來(lai)減少(shao)存儲空(kong)間(jian)。在(zai)你(ni)的(de)(de)/bin 或者(zhe)/sbin 目(mu)錄下,用廠列表看(kan)看(kan) bash,ifconfig,vi...,也許只用幾十(shi)K,當你(ni)運行(xing) ldd /bin/bash 時(shi),你(ni)會看(kan)到它(ta)們都和好幾個(ge)庫文件(jian)相連(lian)。好了,這樣看(kan)來(lai),我們得把 PC 想像成一個(ge)嵌入(ru)式硬(ying)件(jian)平臺,再重新制作一個(ge)特定功能的(de)(de)嵌入(ru)式 linux。 基礎知識 再(zai)進行實際(ji)操(cao)作(zuo)之前,先來搞清楚幾個基(ji)礎知識。 內(nei)(nei)(nei)(nei)核(he)裝載器(qi) Loader,它(ta)的作(zuo)用(yong)(yong)是把內(nei)(nei)(nei)(nei)核(he)從(cong)外部存儲器(qi),移動(dong)到(dao)內(nei)(nei)(nei)(nei)存中(zhong)。它(ta)只作(zuo)這(zhe)個事情(qing),一旦(dan)完成了(le)調(diao)入內(nei)(nei)(nei)(nei)核(he)的工作(zuo),Loader 就跳轉到(dao)內(nei)(nei)(nei)(nei)核(he)位置開始(shi)執行。不(bu)同(tong)架(jia)構有(you)(you)(you)不(bu)同(tong)的 Loader,在 x86 結構的 PC 上,通(tong)常使(shi)用(yong)(yong)的 loader 有(you)(you)(you)LILO,GRUB,syslinux,syslinux 在嵌入式 linux 中(zhong)也同(tong)樣工作(zuo)。其他非(fei) x86 架(jia)構的應用(yong)(yong)中(zhong),你必須(xu)使(shi)用(yong)(yong)專(zhuan)門的 loader,或(huo)者自(zi)己編寫 loader 來裝入內(nei)(nei)(nei)(nei)核(he)。也有(you)(you)(you)不(bu)使(shi)用(yong)(yong) loader 的情(qing)況,系統加電以后,內(nei)(nei)(nei)(nei)核(he)直(zhi)接(jie)從(cong)燒錄有(you)(you)(you)映象的 Flash 上開始(shi)執行。 內(nei)核(he),一旦內(nei)核(he)開始執行(xing),它(ta)將通(tong)過(guo)驅動程(cheng)序(xu)初始化所有硬(ying)件,這(zhe)可以(yi)從(cong)我(wo)們(men)的(de) pc 機(ji)監(jian)視(shi)器(qi)的(de)輸出(chu)看出(chu)來,每(mei)個驅動程(cheng)序(xu)都打印一些有關它(ta)的(de)信息(xi)。初始化完(wan)(wan)成(cheng)后(hou),計算機(ji)就準備運行(xing)嵌(qian)(qian)入(ru)(ru)式(shi)應用(yong)(yong)。也許(xu)一個,也許(xu)是(shi)多個應用(yong)(yong)程(cheng)序(xu)組成(cheng)了嵌(qian)(qian)入(ru)(ru)式(shi)應用(yong)(yong),但通(tong)常首先(xian)調用(yong)(yong)的(de)是(shi) init(通(tong)過(guo) loader 向核(he)心傳入(ru)(ru)init=/program 可以(yi)定制首先(xian)運行(xing)的(de)程(cheng)序(xu))。桌面 linux 中,init 會讀取/etc/inittab 文件,來決(jue)定執行(xing)級別和哪些腳本和命令。嵌(qian)(qian)入(ru)(ru)式(shi)應用(yong)(yong)中,可以(yi)根據實際的(de)情況決(jue)定是(shi)否(fou)使(shi)用(yong)(yong)標(biao)準的(de) init 執行(xing)方式(shi),也許(xu)這(zhe)個 init 是(shi)個靜態程(cheng)序(xu),它(ta)能夠(gou)完(wan)(wan)成(cheng)我(wo)們(men)的(de)嵌(qian)(qian)入(ru)(ru)應用(yong)(yong)的(de)特定任務,那完(wan)(wan)全不(bu)用(yong)(yong)考(kao)慮 inittab 了。 initrd 文(wen)(wen)(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong),initrd 以一種(zhong)把(ba)內(nei)(nei)(nei)核從存(cun)儲(chu)介質裝入(ru)到內(nei)(nei)(nei)存(cun)的(de)(de)相同的(de)(de)機制來(lai)裝入(ru)一個小型文(wen)(wen)(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)。這(zhe)(zhe)個文(wen)(wen)(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)好(hao)是以壓縮的(de)(de)方式存(cun)儲(chu)在介質上(shang)的(de)(de),解(jie)壓縮到 RAM 盤(pan)上(shang)。通過使用(yong) initrd,包含有(you)核心(xin)驅動(dong)和(he)啟動(dong)腳(jiao)(jiao)本的(de)(de)小文(wen)(wen)(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong),就(jiu)可以直(zhi)接(jie)從介質上(shang)和(he)內(nei)(nei)(nei)核一起啟動(dong)起來(lai),內(nei)(nei)(nei)核屆壓縮這(zhe)(zhe)個文(wen)(wen)(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong),并(bing)執行這(zhe)(zhe)個文(wen)(wen)(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)上(shang)叫做(zuo)/linuxrc 的(de)(de)腳(jiao)(jiao)本文(wen)(wen)(wen)件(jian)(jian)(jian),這(zhe)(zhe)個腳(jiao)(jiao)本通常會把(ba)啟動(dong)過程中(zhong)所需要的(de)(de)驅動(dong)程序(xu)裝入(ru)。腳(jiao)(jiao)本退出以后,initrd 文(wen)(wen)(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)也卸下了,啟動(dong)過程進入(ru)真正初始(shi)化(hua)過程。對于(yu)嵌入(ru)式來(lai)講,可以將需要的(de)(de)應用(yong)軟件(jian)(jian)(jian)都運行在這(zhe)(zhe)個initrd 文(wen)(wen)(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)上(shang),只要/linxrc 文(wen)(wen)(wen)件(jian)(jian)(jian)不(bu)結束,內(nei)(nei)(nei)核啟動(dong)過程的(de)(de)其他部分(fen)就(jiu)不(bu)會繼續。 做個試驗: cp /boot/initrd-2.4.20.img /tmp cd /tmp mv initrd-2.4.2-.img initrd.img.gz gunzip initrd.img.gz mount -o loop initrd.img /mnt cd /mnt ls cat linuxrc 可以(yi)看(kan)到(dao)里面(mian)執行(xing)了(le)加載了(le)兩個模塊的(de)操作,你在啟動 linxu 的(de)時候(hou)會看(kan)見屏(ping)幕打印(yin)信息。 入門試驗,制作一個簡單的應用 我們使用一(yi)(yi)張軟盤啟(qi)動(dong)一(yi)(yi)臺假(jia)象的(de)(de)(de)只(zhi)有(you)一(yi)(yi)個串(chuan)口,鍵盤輸入,顯示輸出(chu)的(de)(de)(de)x86 架構的(de)(de)(de) linux 系統,執(zhi)行的(de)(de)(de)特定(ding)應用就是運行 minicom,通過串(chuan)口撥(bo)號。需要軟件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx 代表(biao)版本號,開始之(zhi)前(qian),在主目(mu)錄(lu)建立(li)一(yi)(yi)個目(mu)錄(lu),來釋放這兩個軟件包: cd mkdir -p project/minilinux cd project/minilinux tar zxvf minicom-xx.src.tar.gz tar zxvf syslinux-xx.tar.gz 1、裁減 linux 內核(he)(需要系統安(an)裝內核(he)文件包) 配置內(nei)核(he)的時候,我們(men)需(xu)要選擇這些:摸塊編(bian)入(ru)內(nei)核(he),386 處理器、物理內(nei)存 off、支持 ELF、標準(zhun) PC 軟盤(pan)、支持 RAM 盤(pan)(4096)、支持 initial RAM disk(initrd)、虛你終端(duan)、虛擬終端(duan)控制(zhi)臺、標準(zhun)串口、ext2 文件(jian)系統、控制(zhi)臺驅動,VGA text console、DOS FAT、MSDOS 文件(jian)系統,其(qi)他的都(dou)可以不要,這樣內(nei)核(he)編(bian)出來較小(xiao)。 步驟: cd /usr/src/linux make mrproper make xconfig make dep && make bzImage 得到(dao) /usr/src/linux/arch/i386/boot/目錄的內核文件 bzIamge。 2、編譯一個靜態的 minicom ,把它(ta)作(zuo)為(wei)將來的 linuxrc cd minicom-xx/src vi Makefile 修改下面這行 minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES) rm -f minicom 下(xia)面的行加上(shang) -static,連接為靜(jing)態程序 (LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS) vi minicom.c 找到 if (real_uid==0 && dosetup==0 ) 刪除這個(ge)判(pan)斷條件語句,主要是用(yong)于(yu)權限判(pan)斷的,因為(wei)這個(ge)嵌(qian)入應用(yong)不(bu)關注權限問題,否則會出錯。 make 得到可執行程序,用 ldd 檢查(cha)一下是不是靜態程序。 3、準(zhun)備 initrd 壓(ya)縮(suo)文件 image.gz dd if=/dev/zero of=image bs=1k count=4096 losetup /dev/loop0 image mke2fs -m 0 /dev/loop0 mounmt -t ext2 /dev/loop0 /mnt/ mkdir -p /mnt/dev mkdir -p /mnt/usr/share/terminfo/l/ cd /dev cp -a consle null tty tty0 zero mem /mnt/dev cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc umount /mnt losetup -d /dev/loop0 sync gzip -9 image 4、制作軟盤(pan)引導,并(bing)拷貝(bei)文件 bzimage image.gz 到(dao)軟盤(pan) A.使用 grub fdformat /dev/fd0 mke2fs /dev/fd0 mount /mnt/fd0 /mnt/floppy mkdir -p /mnt/floppy/boot/grub cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub 執行 grub,在軟盤上(shang)創建引導 grub > root (fd0) grub > setup (fd0) grub > quit cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy cp ~/porject/minilinux/image.gz /mnt/floppy 編輯 /mnt/floppy/boot/grub/grub.conf default =0 timeout-=10 title minilinux root (fd0) kernel /bzImage initrd /image.gz 卸下軟盤 umount /mnt/floppy B. 使用 syslinux fdformat /dev/fd0 mkfs.msdos /dev/fd0 mount -t msdos /dev/fd0 /mnt/floppy cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy cp ~/porject/minilinux/image.gz /mnt/floppy cp syslinux-xx/ldlinxu.sys /mnt/floppy cat > /mnt/floppy/syslinux.cfg LABEL linux KERNEL bzimage APPEND initrd=image.gz umont /mnt/floppy syslinux-xx/syslinux /dev/fd0 sync 5、用軟盤啟動計算機,如果幸運(yun),minicom 的運(yun)行畫(hua)面出現在屏幕上。 到(dao)此,我們的(de)(de)(de)(de)單應用(yong)(yong)嵌入(ru)式 linux 做好(hao)了,但(dan)它還很簡陋,沒(mei)有(you)什么實際用(yong)(yong)途(tu),但(dan)通(tong)過這(zhe)個(ge)實驗,可以了解嵌入(ru)式系統的(de)(de)(de)(de)大(da)致結構(gou)和開(kai)發過程。在(zai)(zai)進(jin)行實際的(de)(de)(de)(de)嵌入(ru)式開(kai)發時(shi),通(tong)常要(yao)在(zai)(zai) PC 機(ji)上借助嵌入(ru)式 linux 開(kai)發工具(ju)包,如:uclinux,bluecat 等,對相應的(de)(de)(de)(de)硬件平臺(目(mu)標(biao)機(ji))進(jin)行軟件編寫(xie)編譯(yi),調(diao)試(shi)成功后(hou),將內(nei)核及應用(yong)(yong)程序寫(xie)入(ru)到(dao)目(mu)標(biao)機(ji)的(de)(de)(de)(de)存(cun)儲器中,從而完成整個(ge)應用(yong)(yong)。 發表評論
|
010-82600385/6
北(bei)京市(shi)海淀區(qu)西三旗悅秀路北(bei)京明園大學校(xiao)內
021-54485127
上海市徐(xu)匯(hui)區漕溪路250號(hao)銀海大(da)樓11層B區
0755-25590506
深圳(zhen)市龍華新區人民(min)北路(lu)美麗AAA大廈(sha)15層
028-85405115
成(cheng)都武(wu)侯(hou)區(qu)科華(hua)北路99號科華(hua)大廈2層
025-86551900
南京市白下區漢中路(lu)185號鴻(hong)運(yun)大廈10層
027-87805288
武漢工程大學(xue)卓刀泉(quan)校區科技孵化器(qi)大樓11層
029-88756251
西(xi)安(an)市高新區高新1路12號天公大廈5層(ceng)
0755-25590506
廣州市(shi)天河軟(ruan)件園柯木塱園5棟(dong)三層
024-24849000
沈(shen)陽市沈(shen)河區(qu)北順城(cheng)路137號錦(jin)峰大廈3層
全國咨詢熱(re)線:400-611-6270,雙休(xiu)日(ri)及節假日(ri)請致電值(zhi)班手(shou)機:15010390966
在線咨(zi)詢: 張老(lao)師(shi)QQ(619366077), 宋(song)老(lao)師(shi)QQ(2814652411), 陳老(lao)師(shi)QQ(1462495461)
企業培訓(xun)洽(qia)談專線(xian)(xian):010-82600901,院校合作洽(qia)談專線(xian)(xian):010-82600350,在線(xian)(xian)咨詢(xun):QQ(248856300)
Copyright 2004-2018 華(hua)清遠見(jian)教育科技(ji)集團 版(ban)權所(suo)有 ,京ICP備16055225號(hao),京公(gong)海網安(an)備11010802025203號(hao)