嵌入式的基础知识
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非核心寄存器,初始化相關外設,等待用戶輸入,如果用戶在設定時間內無輸入就拷貝內核和文件系統到內存中,然后跳轉到內核入口;
總結
- 上一篇: Intel Arc A730M高端显卡跑
- 下一篇: socket 编程入门教程(一)TCP