嵌入式的基础知识
1.嵌入式操作系統(tǒng)結(jié)構(gòu)
一般情況下分為硬件子系統(tǒng)和軟件子系統(tǒng);
硬件子系統(tǒng)主要包括:CPU小系統(tǒng),電源模塊,調(diào)試模塊,時(shí)鐘模塊,接口模塊,復(fù)位和配置模塊;
軟件子系統(tǒng)主要包括:驅(qū)動層,中間層,應(yīng)用層
?
2.實(shí)時(shí)操作系統(tǒng)
實(shí)時(shí)的本質(zhì)是任務(wù)的處理是可預(yù)測的,也就說在確定的時(shí)間內(nèi)完成任務(wù)的處理;實(shí)時(shí)操作系統(tǒng)是指在規(guī)定的時(shí)間內(nèi)完成任務(wù)的處理。
實(shí)時(shí)操作系統(tǒng)分為兩類:硬實(shí)時(shí)和軟實(shí)時(shí):通常是從精度上講,軟實(shí)時(shí)一般大于千分之一秒;硬實(shí)時(shí)一般都是微秒級的。
?
3.嵌入式處理器分類
主要分為MCU(C51,AVR),MPU(ARM,MIPS,PPC,X86),SOC,DSP。
?
4.嵌入式操作系統(tǒng)
按照實(shí)時(shí)性來分,強(qiáng)實(shí)時(shí)的有Vxworks,uc/OS, OSE;弱實(shí)時(shí)的有WinCE,Linux。
?
5.make
主要作用是讀入所有的makefile文件,初始化變量,推導(dǎo)出變量的隱晦規(guī)則,并分析規(guī)則,為所有的文件生成依賴關(guān)系鏈,根據(jù)依賴關(guān)系和文件修改情況,決定什么文件重新生成,然后執(zhí)行生成命令。
?
6.makefle的作用
在通常的IDE集成環(huán)境中,不需要makefile,只需要建立好工程就可以了,因此IDE環(huán)境簡單一些;開發(fā)中使用makefile的很大程度上是指定編譯鏈接規(guī)則, 實(shí)現(xiàn)自動化編譯,由于makefile在開發(fā)中需要自己指定,所以相對于IDE要靈活。
?
7.GCC開發(fā)工具
由于Linux下是沒有圖形界面的,因此提供了相應(yīng)的開發(fā)工具;
- GCC:編譯工具,主要參數(shù)如下:
- -v:查看編譯器的版本;
- -c:只編譯不鏈接;
- -o:鏈接,適合c文件;
- -g:編譯時(shí)生成調(diào)試信息;
- -gdwarf-2:附帶宏調(diào)試信息;
- -fomit-frame-pointer:
- -o1/2/3:編譯優(yōu)化選項(xiàng);
- -l:指定頭文件目錄;?
- ld:與makefile結(jié)合使用鏈接目標(biāo)文件;
- objdump:反匯編;
- strip:剝離符號信息,減少目標(biāo)或lib的大小;
- gdb:命令行方式調(diào)試,-g參數(shù)編譯elf可執(zhí)行文件
- ddd:圖形界面
?
8.交叉編譯
什么是交叉編譯?在一個(gè)平臺上編譯出來可在另一個(gè)平臺上運(yùn)行的可執(zhí)行代碼,這個(gè)過程叫做交叉編譯,這個(gè)過程要關(guān)注一下平臺使用的硬件架構(gòu)和操作系統(tǒng)。
為什么要使用交叉編譯?主要原因有兩點(diǎn):1.當(dāng)我們的目標(biāo)機(jī)尚未建立起來,必須借助交叉編譯生成需要的bootloader和內(nèi)核;2.目標(biāo)機(jī)上有限的資源,主要表現(xiàn)在CPU的低性能和非常小的內(nèi)存空間,對于編譯來說,不可能在目標(biāo)機(jī)上構(gòu)建編譯環(huán)境(只工具鏈就會占用很大的空間),因此,就在我們的PC上建立交叉編譯的環(huán)境,以生成在目標(biāo)機(jī)上可執(zhí)行文件。
我們經(jīng)常在windows下面利用VC++編譯和調(diào)試C代碼,最終生成可以在windows下可執(zhí)行的程序;同樣的道理,我們也可以在PC上(不論是windows還是linux)編譯可在目標(biāo)機(jī)上運(yùn)行的可執(zhí)行程序,唯一不同的是我們需要安裝相對應(yīng)的交叉編譯工具鏈(cross complication tool chain)。舉例如下:
- 在Windows PC上,利用ADS(ARM 開發(fā)環(huán)境),使用armcc編譯器,則可編譯出針對ARM CPU的可執(zhí)行代碼。
- 在Linux PC上,利用arm-linux-gcc編譯器,可編譯出針對Linux ARM平臺的可執(zhí)行代碼。
- 在Windows PC上,利用cygwin環(huán)境,運(yùn)行arm-elf-gcc編譯器,可編譯出針對ARM CPU的可執(zhí)行代碼。
交叉開發(fā)環(huán)境可以自己建立,也可以采用廠家封裝好的集成開發(fā)環(huán)境,比較典型的集成交叉開發(fā)環(huán)境如下:
- ARM ADS or SDT
- MS E-VC or Windows Mobile
- WindRiver Tornado,用于Vxworks
- TI的CSS,用于DSP;
- Freescale的Codewarrior,用于PPC;
- GCC用于Linux的開發(fā);
這里注意,創(chuàng)建交叉編譯器的時(shí)候要注意版本匹配問題,特別是Linux,要注意軟件包、Kernel、編譯器三者版本要match;設(shè)置交叉環(huán)境時(shí),要把Tools和代碼路徑、makefile相關(guān)項(xiàng)都設(shè)置正確。
?
如何創(chuàng)建交叉開發(fā)環(huán)境呢?
1.打開目標(biāo)板上的NFS,要求內(nèi)核支持NFS,打開相應(yīng)選項(xiàng);
2.建立Gdb和Gdb Server;
基于GDB進(jìn)行APP的調(diào)試,調(diào)試命令主要有:?
- File:載入elf文件;
- Run:啟動運(yùn)行;
- List:顯示當(dāng)前的程序和函數(shù);
- Break:設(shè)置斷點(diǎn);
- Delete b:刪除斷點(diǎn);
- Next,step:單步運(yùn)行;
- Continue:斷點(diǎn)停止后繼續(xù)執(zhí)行;
- Bt,backtrace,顯示調(diào)用棧;
- Print,查看變量;
- Display:動態(tài)監(jiān)視變量;
?
?
9.模塊編程
什么是模塊?模塊可以動態(tài)的改變內(nèi)核的功能,這樣做可以提高靈活性,主要用于前期調(diào)試代碼時(shí)添加的調(diào)試模塊;
工具主要有:1. insmod
2.lsmod
3.rmmod
模塊的組成主要包括:內(nèi)核頭文件,模塊加載和卸載的方法,設(shè)備的節(jié)點(diǎn),File操作數(shù)據(jù)結(jié)構(gòu),open/close/write/read的方法,makefie
?
10.Bootloader
含義,boot是與硬件強(qiáng)相關(guān)的,主要是初始化硬件,為kernel的運(yùn)行創(chuàng)造條件;loader是把kernel拷貝到內(nèi)存中,并且跳轉(zhuǎn)到相應(yīng)地址開始運(yùn)行;bootloader由于和硬件是強(qiáng)相關(guān)的,因此不同的CPU架構(gòu)對應(yīng)著不同類型的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
?
與主機(jī)通信協(xié)議:1.串口:kermit,xmodem,ymodem,速率較慢,適用于網(wǎng)口未初始化,相關(guān)工具主要有SecureCRT,putty;
2.網(wǎng)口:TFTP,NFS,速度很快;
?
不管是什么樣的架構(gòu),bootloader遵循“stage1+stage2”原則:
- 與體系架構(gòu)強(qiáng)相關(guān),與體系架構(gòu)無關(guān);
- Flash+RAM;
- 匯編+C;
Stage1:通常使用匯編,初始化CPU的核心寄存器,RAM檢查和初始化,拷貝代碼到RAM中,設(shè)置堆棧,跳轉(zhuǎn)到C入口處執(zhí)行;
Stage2:通常是C語言,初始化CPU非核心寄存器,初始化相關(guān)外設(shè),等待用戶輸入,如果用戶在設(shè)定時(shí)間內(nèi)無輸入就拷貝內(nèi)核和文件系統(tǒng)到內(nèi)存中,然后跳轉(zhuǎn)到內(nèi)核入口;
總結(jié)
- 上一篇: Intel Arc A730M高端显卡跑
- 下一篇: socket 编程入门教程(一)TCP