補充一下嵌入式的基礎知識

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章