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