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的作用
在通常的IDE集成環境中,不需要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非核心寄存器,初始化相關外設,等待用戶輸入,如果用戶在設定時間內無輸入就拷貝內核和文件系統到內存中,然後跳轉到內核入口;