1.嵌入式作業系統結構
一般情況下分為硬體子系統和軟體子系統;
硬體子系統主要包括:CPU小系統,電源模組,調試模組,時鐘模組,介面模組,複位和配置模組;
軟體子系統主要包括:驅動層,中介層,應用程式層
2.即時作業系統
即時的本質是任務的處理是可預測的,也就說在確定的時間內完成任務的處理;即時作業系統是指在規定的時間內完成任務的處理。
即時作業系統分為兩類:硬即時和軟即時:通常是從精度上講,軟即時一般大於千分之一秒;硬即時一般都是微秒級的。
3.嵌入式處理器分類
主要分為MCU(C51,AVR),MPU(ARM,MIPS,PPC,X86),SOC,DSP。
4.嵌入式作業系統
按照即時性來分,強即時的有Vxworks,uc/OS, OSE;弱即時的有WinCE,Linux。
5.make
主要作用是讀入所有的makefile檔案,初始設定變數,推匯出變數的隱晦規則,並分析規則,為所有的檔案產生依賴關係鏈,根據依賴關係和檔案修改情況,決定什麼檔案重建,然後執行產生命令。
6.makefle的作用
在通常的IDEIntegration Environment中,不需要makefile,只需要建立好工程就可以了,因此IDE環境簡單一些;開發中使用makefile的很大程度上是指定編譯連結規則, 實現自動化編譯,由於makefile在開發中需要自己指定,所以相對於IDE要靈活。
7.GCC開發工具
由於Linux下是沒有圖形介面的,因此提供了相應的開發工具;
- GCC:編譯工具,主要參數如下:
- -v:查看編譯器的版本;
- -c:只編譯不連結;
- -o:連結,適合c檔案;
- -g:編譯時間產生調試資訊;
- -gdwarf-2:附帶宏調試資訊;
- -fomit-frame-pointer:
- -o1/2/3:編譯最佳化選項;
- -l:指定標頭檔目錄;
- ld:與makefile結合使用連結目標檔案;
- objdump:反組譯碼;
- strip:剝離符號資訊,減少目標或lib的大小;
- gdb:命令列方式調試,-g參數編譯elf可執行檔
- ddd:圖形介面
8.交叉編譯
什麼是交叉編譯?在一個平台上編譯出來可在另一個平台上啟動並執行可執行代碼,這個過程叫做交叉編譯,這個過程要關注一下平台使用的硬體架構和作業系統。
為什麼要使用交叉編譯?主要原因有兩點:1.當我們的目標機尚未建立起來,必須藉助交叉編譯產生需要的bootloader和核心;2.目標機上有限的資源,主要表現在CPU的低效能和非常小的記憶體空間,對於編譯來說,不可能在目標機上構建編譯環境(只工具鏈就會佔用很大的空間),因此,就在我們的PC上建立交叉編譯的環境,以產生在目標機上可執行檔。
我們經常在windows下面利用VC++編譯和調試C代碼,最終產生可以在windows下可執行檔程式;同樣的道理,我們也可以在PC上(不論是windows還是linux)編譯可在目標機上啟動並執行可執行程式,唯一不同的是我們需要安裝相對應的交叉編譯工具鏈(cross complication tool chain)。舉例如下:
- 在Windows PC上,利用ADS(ARM 開發環境),使用armcc編譯器,則可編譯出針對ARM CPU的可執行代碼。
- 在Linux PC上,利用arm-linux-gcc編譯器,可編譯出針對Linux ARM平台的可執行代碼。
- 在Windows PC上,利用cygwin環境,運行arm-elf-gcc編譯器,可編譯出針對ARM CPU的可執行代碼。
交叉開發環境可以自己建立,也可以採用廠家封裝好的整合式開發環境,比較典型的整合交叉開發環境如下:
- ARM ADS or SDT
- MS E-VC or Windows Mobile
- WindRiver Tornado,用於Vxworks
- TI的CSS,用於DSP;
- Freescale的Codewarrior,用於PPC;
- GCC用於Linux的開發;
這裡注意,建立交叉編譯器的時候要注意版本匹配問題,特別是Linux,要注意軟體包、Kernel、編譯器三者版本要match;設定交叉環境時,要把Tools和代碼路徑、makefile相關項目都設定正確。
如何建立交叉開發環境呢?
1.開啟目標板上的NFS,要求核心支援NFS,開啟相應選項;
2.建立Gdb和Gdb Server;
基於GDB進行APP的調試,調試命令主要有:
- File:載入elf檔案;
- Run:啟動運行;
- List:顯示當前的程式和函數;
- Break:設定斷點;
- Delete b:刪除斷點;
- Next,step:單步運行;
- Continue:斷點停止後繼續執行;
- Bt,backtrace,顯示調用棧;
- Print,查看變數;
- Display:動態監視變數;
9.模組編程
什麼是模組?模組可以動態改變核心的功能,這樣做可以提高靈活性,主要用於前期調試代碼時添加的調試模組;
工具主要有:1. insmod
2.lsmod
3.rmmod
模組的組成主要包括:核心標頭檔,模組載入和卸載的方法,裝置的節點,File操作資料結構,open/close/write/read的方法,makefie
10.Bootloader
含義,boot是與硬體強相關的,主要是初始化硬體,為kernel的運行創造條件;loader是把kernel拷貝到記憶體中,並且跳轉到相應地址開始運行;bootloader由於和硬體是強相關的,因此不同的CPU架構對應著不同類型的bootloader,主要有以下幾種不同的bootloader,如下所示:
Bootloader CPU OS
Grub X86 linux,windows
Lilo X86 Linux
U-boot ARM,PPC,MIPS Linux,Vxworks,PSOS
Redboot ARM eCos
Vivi 三星ARM Linux
Bootrom PPC Vxworks
Blob Intel PXA系列 Linux
與主機通訊協定:1.串口:kermit,xmodem,ymodem,速率較慢,適用於網口未初始化,相關工具主要有SecureCRT,putty;
2.網口:TFTP,NFS,速度很快;
不管是什麼樣的架構,bootloader遵循“stage1+stage2”原則:
- 與體系架構強相關,與體系架構無關;
- Flash+RAM;
- 彙編+C;
Stage1:通常使用彙編,初始化CPU的核心寄存器,RAM檢查和初始化,拷貝代碼到RAM中,設定堆棧,跳轉到C入口處執行;
Stage2:通常是C語言,初始化CPU非核心寄存器,初始化相關外設,等待使用者輸入,如果使用者在設定時間內無輸入就拷貝核心和檔案系統到記憶體中,然後跳轉到核心入口;