- 相關(guān)推薦
嵌入式arm實(shí)習(xí)報(bào)告
嵌入式系統(tǒng)開發(fā)與應(yīng)用概述
在今日,嵌入式ARM 技術(shù)已經(jīng)成為了一門比較熱門的學(xué)科,無論是在電子類的什么領(lǐng)域,你都可以看到嵌入式ARM 的影子。如果你還停留在單片機(jī)級別的學(xué)習(xí),那么實(shí)際上你已經(jīng)落下時代腳步了,ARM 嵌入式技術(shù)正以幾何的倍數(shù)高速發(fā)展,它幾乎滲透到了幾乎你所想到的領(lǐng)域。由于嵌入式系統(tǒng)具有體積小、性能強(qiáng)、功耗低、可靠性高以及面向行業(yè)具體應(yīng)用等突出特征, 目前已經(jīng)廣泛地應(yīng)用于軍事國防、消費(fèi)電子、信息家電、網(wǎng)絡(luò)通信、工業(yè)控制等各個領(lǐng)域。嵌入式的廣泛應(yīng)用可以說是無所不在。
linux系統(tǒng)
linux系統(tǒng)主要是由用戶空間和內(nèi)核空間再加上外部的硬件平臺構(gòu)成,用戶空間就是用戶應(yīng)用程序的運(yùn)行空間,主要包括兩方面的內(nèi)容:用戶應(yīng)用程序和GNU C Library(glibc)。而內(nèi)核空間有三方面的內(nèi)容,一是系統(tǒng)調(diào)用接口,它作為用戶空間和內(nèi)核空間相互轉(zhuǎn)移的一種方式,二是內(nèi)核空間,三是體系相關(guān)內(nèi)核代碼,在linux內(nèi)核代碼中,可以看到arch目錄下有許多子目錄,其中每一個子目錄代表一種硬件平臺。
而為什么要把linux系統(tǒng)劃分為用戶空間和內(nèi)核空間呢?主要是一旦用戶空間和內(nèi)核空間沒有分開,那用戶將擁有很大的權(quán)限去操控內(nèi)核或用戶應(yīng)用程序的崩潰將會造成系統(tǒng)的崩潰,而linux系統(tǒng)是利用cpu的模式分級來分別運(yùn)行用戶空間和內(nèi)核空間,這樣就可以使操作系統(tǒng)得到充分的保護(hù)。而現(xiàn)代的cpu通常實(shí)現(xiàn)了不同的工作模式,以ARM處理器為例實(shí)現(xiàn)了7種運(yùn)行模式,分別為:
1)用戶模式(usr):ARM微處理器正常程序執(zhí)行模式
2)系統(tǒng)模式(sys):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)
3)中斷模式(irq):用于通用的中斷處理
4)外部中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理
5)數(shù)據(jù)訪問終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時進(jìn)入該模式,可用于虛擬存儲及存儲保護(hù)
6)管理模式(svc):操作系統(tǒng)使用的保護(hù)模式
7)未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真ARM微處理器的運(yùn)行模式可以通過軟件改變,也可以通過外部中斷或異常處理改變,除用戶模式外,其他模式都是非用戶模式或特權(quán)模式,除用戶模式和系統(tǒng)模式外,其他模式都是異常模式,常用于處理異常或中斷,以及需要訪問受保護(hù)的系統(tǒng)資源等情況。
同時用戶空間和內(nèi)核空間是程序執(zhí)行的兩種不同狀態(tài),通過系統(tǒng)調(diào)用和硬件中斷去實(shí)現(xiàn)用戶空間到內(nèi)核空間的轉(zhuǎn)移,系統(tǒng)調(diào)用是主動的,硬件中斷是被動的,比如鍵盤按下或者串口中斷。
接下來說說linux的內(nèi)核架構(gòu),它主要是包含7大組成部分
1.內(nèi)存管理 內(nèi)存管理的主要作用是使多個進(jìn)程能安全高效的共享內(nèi)存區(qū)域,通常使用以下兩個手段:
①內(nèi)存映射:將物理內(nèi)存映射到虛擬內(nèi)存中,變有限為無限
②有效管理:使用各種內(nèi)存管理算法(如伙伴算法),減少內(nèi)存浪費(fèi)
2.虛擬文件系統(tǒng) vfs隱藏了各種文件系統(tǒng)的具體細(xì)節(jié),為文件操作提供統(tǒng)一的接口
3.網(wǎng)絡(luò)協(xié)議棧 它為linux提供了完善豐富的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)
4.進(jìn)程管理 進(jìn)程管理的重點(diǎn)是創(chuàng)建進(jìn)程、停止進(jìn)程,并控制它們之間的通信。進(jìn)程管理還包括控制活動進(jìn)程如何共享cpu,即進(jìn)程調(diào)度。
5.設(shè)備驅(qū)動 設(shè)備驅(qū)動也是內(nèi)核的一部分,它不同于內(nèi)核的其他部件,并且獨(dú)立于內(nèi)核的其他部件,同時它是與設(shè)備交互的唯一模塊,通常由第三方廠商開發(fā),一個驅(qū)動程序不與其他驅(qū)動程序交互;內(nèi)核與驅(qū)動程序之間也僅通過一個嚴(yán)格定義的接口-交互。
6.系統(tǒng)調(diào)用接口 SCI層為用戶空間提供了一套標(biāo)準(zhǔn)的系統(tǒng)調(diào)用函數(shù)來訪問Linux內(nèi)核,搭起了用戶空間到內(nèi)核空間的橋梁。
7.體系相關(guān)部分
Linux內(nèi)核源代碼采用樹形結(jié)構(gòu)進(jìn)行組織,非常合理地把功能相關(guān)的文件都放在同一個子目錄下,使得程序更具可讀性。
下面介紹下這些目錄的組成
arch目錄
arch是architecture的縮寫。內(nèi)核所支持的每種CPU體系,在該目錄下都有對應(yīng)的子目錄。每個CPU的子目錄,又進(jìn)一步分解為boot,mm,kernel等子目錄,分別包含控制系統(tǒng)引導(dǎo),內(nèi)存管理,系統(tǒng)調(diào)用等。其下子目錄有
| --x86 /*英特爾cpu及與之相兼容體系結(jié)構(gòu)的子目錄*/
| |--boot /*引導(dǎo)程序*/
| | |--compressed /*內(nèi)核解壓縮*/
| |--tools /*生成壓縮內(nèi)核映像的程序*/
| |--kernel /*相關(guān)內(nèi)核特性實(shí)現(xiàn)方式,如信號處理、時鐘處理*/ | |--lib /*硬件相關(guān)工具函數(shù)*/
block目錄
部分塊設(shè)備驅(qū)動程序
crypto目錄
加密、壓縮、CRC校驗(yàn)算法
documentation
內(nèi)核的文檔
drivers目錄(重點(diǎn))
設(shè)備驅(qū)動程序
fs目錄
存放各種文件系統(tǒng)的實(shí)現(xiàn)代碼。每個子目錄對應(yīng)一種文件系統(tǒng)的實(shí)現(xiàn),公用的源程序用于實(shí)現(xiàn)虛擬文件系統(tǒng)vfs。
| |--devpts /* /dev/pts虛擬文件系統(tǒng)*/
| |--ext2 /*第二擴(kuò)展文件系統(tǒng)*/
| |--fat /*MS的fat32文件系統(tǒng)*/
| |--isofs /*ISO9660光盤cd-rom上的文件系統(tǒng)*/
include目錄
內(nèi)核所需要的頭文件。與平臺無關(guān)的頭文件在include/linux 子目錄下,與平臺相關(guān)的頭文件則放在相應(yīng)的子目錄中。
init目錄
內(nèi)核初始化代碼
ipc目錄
進(jìn)程間通信的實(shí)現(xiàn)代碼
kernel目錄
Linux大多數(shù)關(guān)鍵的核心功能都是在這個目錄實(shí)現(xiàn)。(調(diào)度程序,進(jìn)程控制,模塊化)
lib目錄
庫文件代碼
mm目錄
mm目錄中的文件用于實(shí)現(xiàn)內(nèi)存管理中與體系結(jié)構(gòu)無關(guān)的部分(與體系結(jié)構(gòu)相關(guān)的部分在哪里實(shí)現(xiàn)?arch)
net目錄
網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)代碼
| |--802 /*802無線通訊協(xié)議核心支持代碼*/
| |--appletalk /*與蘋果系統(tǒng)連網(wǎng)的協(xié)議*/
| |--ax25 /*AX25無線INTERNET協(xié)議*/
| |--bridge /*橋接設(shè)備*/
| |--ipv4 /*IP協(xié)議族V4版32位尋址模式*/
| |--ipv6 /*IP協(xié)議族V6版*/
samples
一些內(nèi)核編程的范例
scripts
配置內(nèi)核的腳本
security
SElinux的模塊
sound
音頻設(shè)備的驅(qū)動程序
usr
cpio命令實(shí)現(xiàn)
virt
內(nèi)核虛擬機(jī)
Linux內(nèi)核的配置與編譯
Linux內(nèi)核具有可定制的優(yōu)點(diǎn),配置內(nèi)核的目的是裁剪掉不必要的文件和目錄,獲得一個最簡單的又能滿足用戶開發(fā)的操作系統(tǒng),以解除嵌入式開發(fā)過程中所遇到的存儲空間有限的困擾。內(nèi)核配置與編譯的具體步驟如下:
1.清除臨時文件、中間文件和配置文件
1)make clean
Remove most generated files but keep the config即清除大部分生成的文件但保留配置文件
2)make mrproper
Remove all generated files + config files即清除所有生成的文件還有配置文件
3)make distclean
Mrproper + remove editor backup and patch files即實(shí)現(xiàn)
make mrproper命令的同時刪除編輯器備份文件和補(bǔ)丁文件
2.確定目標(biāo)系統(tǒng)的軟硬件配置情況,比如cpu類型,網(wǎng)卡型號,所需支持的網(wǎng)絡(luò)協(xié)議等。
3.使用如下命令之一配置內(nèi)核:
1) make config:基于文本模式的交互式配置
2)make menuconfig:基于文本模式的菜單型配置
3)make oldconfig:使用已有的配置文件(.config),但是會詢問新增的配置選項(xiàng)
4)make xconfig:圖形化的配置(需安裝圖形化系統(tǒng))
Make menuconfig是最為常用的內(nèi)核配置方式 如果一個.config文件已經(jīng)存在,它將使用該文件設(shè)置那些默認(rèn)的值
4.編譯內(nèi)核
編譯內(nèi)核通常也需要幾個步驟,一是清除以前編譯通過的殘留文件;二是編譯內(nèi)核image文件和可加載模塊;三是安裝模塊。
下面是編譯內(nèi)核的具體步驟。
①make dep 命令用在內(nèi)核2.4或之前,用于建立源文件之間的依賴關(guān)系,在執(zhí)行內(nèi)核配置命令之后使用,不過在2.6內(nèi)核中已經(jīng)取消該命令,該功能由內(nèi)核配置命令實(shí)現(xiàn)。
②make clean 命令用于刪除前面留下來的中間文件,該命令不會刪除.config等配置文件。這個步驟是可選的,它的目的是清除原先編譯過而殘留的.com和.o(obj文件)。如果是剛下載的源代碼,那么這一步就可以省略了,但是如果已經(jīng)編譯多次內(nèi)核,這一步是必要的,不然后面可能會出現(xiàn)很多莫名其妙的小問題。
③make zImage命令用于編譯生成壓縮形式的內(nèi)核鏡像,當(dāng)編譯成功后,就會在arch\arm\boot\目錄下生成zImage文件,大小一般為幾百KB。對于嵌入式Linux內(nèi)核而言,直接將生成的zImage下載到嵌入式目標(biāo)板的flash中即可。對于較大的內(nèi)核,如果用make zImage編譯,系統(tǒng)會提示使用make bzImage命令來編譯,bzImage是big zImage的縮寫,可用于生成較大的壓縮內(nèi)核,比如桌面Linux系統(tǒng)內(nèi)核。
④在配置菜單的過程中,有些選項(xiàng)被選擇為模塊的,即選項(xiàng)前為[M],并且在回答Enable loadable module support(CONFIG_MODULES)時選了Yes的,則接下來就還要用命令make modules 來編譯這些可加載模塊,并用
make modules_install將make modules生成的模塊文件復(fù)制到相應(yīng)目錄,桌面Linux內(nèi)核一般是在/lib/modules目錄下。
⑤制作init ramdisk
mkinitrd initrd-$version $version
例:
mkinitrd initrd-2.6.29 2.6.29
$version 可以通過查詢/lib/modules下的目錄得到Ramdisk是將一部分固定大小的內(nèi)存當(dāng)做分區(qū)來使用。它并非一個實(shí)際的文件系統(tǒng),二是一種將實(shí)際的文件系統(tǒng)裝入內(nèi)存的機(jī)制,并且可以作為根文件系統(tǒng)。將一些經(jīng)常被訪問而又不會更改的文件(如只讀的根文件系統(tǒng))通過ramdisk放在內(nèi)存中,可以明顯的提高系統(tǒng)的性能。在linux的啟動階段,initrd提供了一套機(jī)制,可以將內(nèi)核映像和根文件系統(tǒng)一起載入內(nèi)存。
⑥cp arch/x86/boot/bzImage
/boot/vmlinuz-$version
$version 為所編譯的內(nèi)核版本號
(拷貝initrd-2.6.29到/boot下,將arch/x86/boot/bzImage更名為vmlinuz-2.6.29移動到/boot下)
⑦修改/etc/http://m.emrowgh.comnf 或者/etc/http://m.emrowgh.comnf
(GNU GRUB(簡稱 GRUB )是一個來自GNU項(xiàng)目的多操作系統(tǒng)啟動程序。GRUB是多啟動規(guī)范的實(shí)現(xiàn),它允許用戶可以在計(jì)算機(jī)內(nèi)同時擁有多個操作系統(tǒng),并在計(jì)算機(jī)啟動時選擇希望運(yùn)行的操作系統(tǒng)。GRUB可用于選擇操作系統(tǒng)分區(qū)上的不同內(nèi)核,也可用于向這些內(nèi)核傳遞啟動參數(shù)。)
這時重啟Linux操作系統(tǒng),在進(jìn)入內(nèi)核時按下回車鍵進(jìn)入內(nèi)核選擇界面,選擇自己編譯的內(nèi)核,即可進(jìn)入自己編譯的內(nèi)核的操作系統(tǒng),用uname -r 可以查看當(dāng)前內(nèi)核版本。
嵌入式linux文件系統(tǒng)的制作與移植
文件系統(tǒng)包含兩個層次的含義:
1.按照固定格式組織的目錄與文件
2.在特定的存儲介質(zhì)上管理這些目錄和文件需要的數(shù)據(jù)
當(dāng)我們在linux下輸入ls / 的時候,見到的目錄結(jié)構(gòu)以及這些目錄下的內(nèi)容都大同小異,這是因?yàn)樗械膌inux發(fā)行版在對根文件系統(tǒng)的布局上都遵循FHS(Filesystem Hierarchy Standard)標(biāo)準(zhǔn)的建議規(guī)定。
各個目錄名稱及其存放的內(nèi)容:
/bin 必備的用戶命令,例如ls、cp等
/sbin 必備的系統(tǒng)管理員命令,例如ifconfig、reboot等
/dev 設(shè)備文件,例如mtdblock0、tty1等
/etc 系統(tǒng)配置文件,包括啟動文件,例如inittab等
/lib 必要的鏈接庫,例如C鏈接庫、內(nèi)核模塊
/home 普通用戶主目錄
/root root用戶主目錄
/usr/bin 非必備的用戶程序,例如find、du等
/usr/sbin 非必備的管理員程序,例如chroot、inetd等
/usr/lib 庫文件
/var 守護(hù)程序和工具程序所存放的可變,例如日志文件
/proc 用來提供內(nèi)核與進(jìn)程信息的虛擬文件系統(tǒng),由內(nèi)核自動生成目錄下的內(nèi)容
/sys 用來提供內(nèi)核與設(shè)備信息的虛擬文件系統(tǒng),由內(nèi)核自動生成目錄下的內(nèi)容
/mnt 文件系統(tǒng)掛接點(diǎn),用于臨時安裝文件系統(tǒng)
/tmp 臨時性的文件,重啟后將自動清除
根文件系統(tǒng)是Linux啟動時使用的第一個文件系統(tǒng)。沒有根文件系統(tǒng),Linux將無法正常啟動。根文件系統(tǒng)由一系列目錄組成,目錄中包含了應(yīng)用程序、C庫、以及相關(guān)的配置文件。
那如何制作一個根文件系統(tǒng)呢?主要包括以下步驟:
1、創(chuàng)建根文件系統(tǒng)的目錄
如:mkdir bin sbin lib etc dev proc sys usr mnt tmp var
2、創(chuàng)建設(shè)備文件
cd dev
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
cd ..
3、安裝/etc
tar -xzvf etc.tar.gz /xx-x/rootfs/etc
4、配置busybox
進(jìn)入busybox目錄執(zhí)行
make menuconfig
進(jìn)入 Busybox Settings
build Options->
選中 “Build busybox as a static binary”, 靜態(tài)鏈接
Cross Compiler prefix (arm-linux-)
Installation Options->
選中 “Don‘t use /usr”, 選中該項(xiàng)可以避免busybox被安裝到
宿主系統(tǒng)的/usr目錄下,破壞宿主系統(tǒng)
Busybox Installation Prefix (/nfsroot/rootfs)該選項(xiàng)表明編
譯后的busybox的安裝位置
7、編譯、安裝busybox
make ARCH=arm CROSS_COMPILE=arm-linux-
make install
前提是系統(tǒng)中安裝好了交叉編譯工具arm-linux-gcc
至此一個粗略的根文件系統(tǒng)制作完成,下面就需要移植到開發(fā)板中。 我們知道ARM嵌入式系統(tǒng)的組成為:
1)bootloader 引導(dǎo)加載器
2)kernel 操作系統(tǒng)內(nèi)核
3)rootfs 根文件系統(tǒng) (帶GUI,QTopia)
在系統(tǒng)加載完內(nèi)核后就會去啟動根文件系統(tǒng),而啟動根文件系統(tǒng)這個過程被bootargs這個參數(shù)控制,所以我們需要修改這個參數(shù)以使系統(tǒng)運(yùn)行我們的根文件系統(tǒng),但這之前我們需要在宿主機(jī)上將根文件系統(tǒng)共享出來。我們先在linux系統(tǒng)中配置好nfs服務(wù)器,并且在設(shè)置配置文件exports將根文件系統(tǒng)所在路徑共享出來,接下來在ARM開發(fā)板啟動時控制超級終端進(jìn)入shell界面,在這里輸入命令print會顯示開發(fā)板啟動的配置信息,通過set命令我們可以設(shè)置bootargs 參數(shù)為:
console=ttySAC0
root=/dev/nfs
nfsroot=192.168.0.113:/mynfs/rootfs ip=http://m.emrowgh.com:eth0:off
設(shè)置完成后用save命令保存設(shè)置,輸入reset復(fù)位命令,ARM系統(tǒng)重啟,重啟完成后我們看到ARM系統(tǒng)的根文件系統(tǒng)就是我們自己制作的根文件系統(tǒng)。
實(shí)習(xí)體會
在嵌入式系統(tǒng)中,除了課本上的基礎(chǔ)知識外,還學(xué)會了軟件編程的基本思路,掌握了液晶屏的使用及其電路設(shè)計(jì)方法;掌握有關(guān)音頻處理的基礎(chǔ)知識;掌握液晶顯示文本及圖形的方法與程序設(shè)計(jì)。
通過這次設(shè)計(jì),掌握了液晶顯示實(shí)驗(yàn)、μC/OS-II移植、μC/OS-IILCD顯示的工作原理及串口通信實(shí)驗(yàn)的工作過程,學(xué)會了使用仿真軟件Embest EduKit-IV實(shí)驗(yàn)平臺及ULINK2仿真器套件,并學(xué)會通過應(yīng)用軟件仿真來實(shí)現(xiàn)各種通信系統(tǒng)的設(shè)計(jì),對以后的學(xué)習(xí)和工作都起到了一定的作用,加強(qiáng)了動手能力和學(xué)業(yè)技能。雖然花了很長時間編寫軟件程序設(shè)計(jì),但這一切還是理論上的。希望學(xué)校能提供機(jī)會和條件,讓我們能夠去真正地將理論和實(shí)踐相結(jié)合。通過這次程序,感覺自己所掌握的知識是那么的有限,還有許多需要改進(jìn)和不足的地方,同時也幫助了我怎樣學(xué)好這門課程,增加了我對這門學(xué)科的興趣?傮w來說,這次實(shí)習(xí)我受益匪淺。在摸索該如何設(shè)計(jì)電路使之實(shí)現(xiàn)所需功能的過程中特別有趣,培養(yǎng)了我的設(shè)計(jì)思維,增加了實(shí)際操作能力。在讓我體會到了設(shè)計(jì)電路的艱辛的同時,更讓我體會到成功的喜悅和快樂。通過這次實(shí)習(xí)通信系統(tǒng)的設(shè)計(jì),使我更加清楚以后的發(fā)展及學(xué)習(xí)的方向。
【嵌入式arm實(shí)習(xí)報(bào)告】相關(guān)文章:
ARM嵌入式教學(xué)實(shí)驗(yàn)系統(tǒng)項(xiàng)目合作意向書10-14
嵌入式系統(tǒng)實(shí)習(xí)報(bào)告03-08
嵌入式實(shí)習(xí)報(bào)告(精選5篇)10-16
關(guān)于嵌入式系統(tǒng)實(shí)習(xí)報(bào)告3篇10-30
嵌入式研發(fā)崗位職責(zé)05-12
嵌入式C語言優(yōu)化技巧11-10
什么是嵌入式操作系統(tǒng)10-28
嵌入式操作系統(tǒng)的區(qū)別04-17
嵌入式操作系統(tǒng)是什么10-28
嵌入式C語言編程小知識12-20