無操作系統(tǒng)的應(yīng)用程序開發(fā)精編課件_第1頁
無操作系統(tǒng)的應(yīng)用程序開發(fā)精編課件_第2頁
無操作系統(tǒng)的應(yīng)用程序開發(fā)精編課件_第3頁
無操作系統(tǒng)的應(yīng)用程序開發(fā)精編課件_第4頁
無操作系統(tǒng)的應(yīng)用程序開發(fā)精編課件_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第4章無操作系統(tǒng)的應(yīng)用軟件開發(fā)第4章無操作系統(tǒng)的應(yīng)用軟件開發(fā)1嵌入式軟件系統(tǒng)分為無操作系統(tǒng)和有操作系統(tǒng)。前者包括引導(dǎo)程序和應(yīng)用程序,后者則在引導(dǎo)程序結(jié)束后運行操作系統(tǒng),并將應(yīng)用程序作為任務(wù)添加到操作系統(tǒng)中。NOTE:運行操作系統(tǒng)會占用大量寶貴的硬件資源,因此很多硬件資源有限、任務(wù)簡單的嵌入式應(yīng)用并不使用操作系統(tǒng)。嵌入式軟件系統(tǒng)分為無操作系統(tǒng)和有操作系統(tǒng)。2嵌入式系統(tǒng)不管是否使用操作系統(tǒng),都需要一段引導(dǎo)程序BootLoader來初始化硬件,為操作系統(tǒng)或應(yīng)用程序的運行做準(zhǔn)備。BootLoader是硬件與軟件的橋梁,其作用就是初始化硬件設(shè)備、編址空間映射,建立系統(tǒng)軟、硬件的正常工作狀態(tài)。BootLoader的開發(fā)已經(jīng)成為嵌入式系統(tǒng)教學(xué)和工程中的技術(shù)瓶頸。本章的內(nèi)容:*介紹BootLoader的功能*分析s3c4510b的編址空間映射*分析BootLoader的啟動過程*提出工程中BootLoader的解決方案。*用實例介紹不使用嵌入式操作系統(tǒng)的軟件開發(fā)流程和代碼固化方法。本章的目標(biāo):讓讀者能使用ADS開發(fā)一個完整的不使用操作系統(tǒng)的嵌入式系統(tǒng)。嵌入式系統(tǒng)不管是否使用操作系統(tǒng),都需要一段引導(dǎo)程序BootL34.1軟件開發(fā)數(shù)據(jù)流向圖在不使用嵌入式操作系統(tǒng)的情況下,在ADS上能完成從BootLoader到應(yīng)用程序的整個開發(fā)流程,使用JTAG仿真器進(jìn)行調(diào)試,RS-232串口作為標(biāo)準(zhǔn)輸入/輸出,數(shù)據(jù)流向如P120圖4.1所示。在調(diào)試階段:使用ADS開發(fā)應(yīng)用程序,編譯生成帶調(diào)試信息的.axf文件;用JTAG仿真器連接實驗板和PC,將實驗板上電,打開調(diào)試代理軟件檢測到ARM核處理器在AXD中使用setmem或obey命令設(shè)置CPU特殊功能寄存器配置存儲空間;加載.axf文件到SDRAM存儲器就可以調(diào)試運行了;利用AXD提供的單步、斷點等調(diào)試手段,可以方便地查看CPU寄存器、存儲器內(nèi)容。

4.1軟件開發(fā)數(shù)據(jù)流向圖在不使用嵌入式操作系統(tǒng)的情況下,在4NOTE:*程序是在SDRAM里運行的,因此掉電后不能保存;*應(yīng)用程序調(diào)試完畢后,將其加入BootLoader,編譯生成不帶調(diào)試信息的.bin文件,bin格式的映象文件只能全速運行;*燒寫.bin文件需要一個專門的Flash燒寫程序(擴(kuò)展名為.axf)。*先采用上述調(diào)試軟件的方法將燒寫程序.axf文件加載到SDRAM,然后選擇AXD的File菜單里面的LoadImage命令,將應(yīng)用程序.bin文件加載到SDRAM的合適地址上,運行燒寫程序,就能將.bin文件燒寫到Flash存儲器了。*在調(diào)試或燒寫過程中,可以將必要信息通過RS-232串口輸出到PC超級終端進(jìn)行顯示。NOTE:54.2無操作系統(tǒng)的軟件運行模式不使用操作系統(tǒng)時,嵌入式軟件系統(tǒng)包含引導(dǎo)程序和應(yīng)用程序兩個部分:(1)引導(dǎo)程序是嵌入式軟件系統(tǒng)中必不可少的部分,完成硬件初始化、存儲器空間映射和設(shè)置系統(tǒng)工作狀態(tài)等工作。(2)應(yīng)用程序則根據(jù)不同應(yīng)用目的而編寫。無操作系統(tǒng)下的各種軟件運行模式的主要區(qū)別在于:引導(dǎo)程序和應(yīng)用程序的各種組成方式。NOTE:

下面介紹的四種模式中采用的編址空間是經(jīng)過二次存儲器映射后的空間,在沒有了解存儲器的二次映射之前,只需要了解此圖中各個部分的邏輯關(guān)系即可,不用去考慮物理地址。4.2無操作系統(tǒng)的軟件運行模式不使用操作系統(tǒng)時,嵌入式軟件系6

無操作系統(tǒng)的嵌入式軟件運行模式:

1、應(yīng)用程序和引導(dǎo)程序在一個工程中一起編譯為一個.bin文件,燒寫到Flash存儲器地址0x0,引導(dǎo)程序運行結(jié)束后直接跳轉(zhuǎn)到應(yīng)用程序的入口處:(1)BootLoader啟動后,F(xiàn)lash中的所有程序被復(fù)制到SDRAM存儲器中,如圖4.2P121(2)引導(dǎo)程序結(jié)束后就進(jìn)入應(yīng)用程序,這種跳轉(zhuǎn)方式通過在引導(dǎo)程序中導(dǎo)入應(yīng)用程序主函數(shù)名稱來實現(xiàn)。(3)從匯編程序跳轉(zhuǎn)到應(yīng)用程序時,編譯器會自動計算跳轉(zhuǎn)的目的地址。。

7(4)跳轉(zhuǎn)的代碼如下:IMPORTC_Entry;導(dǎo)入應(yīng)用程序的C_Entry函數(shù)BLC_Entry;跳轉(zhuǎn)到該函數(shù),跳轉(zhuǎn)地址由編譯器在編譯時計算NOTE:應(yīng)用程序存放到SDRAM的引導(dǎo)程序后,但其起始地址并不固定,在編譯時,應(yīng)用程序的起始地址隨著引導(dǎo)程序的大小而變化。(4)跳轉(zhuǎn)的代碼如下:8

2、應(yīng)用程序和引導(dǎo)程序分別編譯為兩個.bin文件,引導(dǎo)程序燒寫到Flash存儲器地址0x0,應(yīng)用程序則燒寫到存儲器中的某個地址,引導(dǎo)程序運行結(jié)束后跳轉(zhuǎn)到該地址運行應(yīng)用程序

(1)BootLoader啟動后,F(xiàn)lash中的所有程序被復(fù)制到SDRAM存儲器中,如圖4.3P121(2)引導(dǎo)程序結(jié)束后就進(jìn)入應(yīng)用程序,即將PC指針跳轉(zhuǎn)到應(yīng)用程序的起始地址,跳轉(zhuǎn)的代碼如下:LDRR1,=0X10000MOVPC,R1NOTE:

這種模式下,應(yīng)用程序和引導(dǎo)程序被單獨編譯為兩個.bin文件,因此應(yīng)用程序可以靈活地?zé)龑懙饺我獾刂诽?。本例中?yīng)用程序被燒寫到0x10000為例。

2、應(yīng)用程序和引導(dǎo)程序分別編譯為兩個.bin文件,引9

3、擴(kuò)展引導(dǎo)程序,使其初始化功能結(jié)束后即可跳轉(zhuǎn)到一個函數(shù)入口,也可以跳轉(zhuǎn)到指定地址在此模式下,引導(dǎo)程序和其擴(kuò)展的部分在一個工程中,編譯為.bin文件,最后燒寫到Flash存儲器的地址0x0處,應(yīng)用程序既可以隨引導(dǎo)程序一起編譯,也可以單獨編譯并下載到指定地址。如P122圖4.4所示,引導(dǎo)程序完成后跳轉(zhuǎn)到擴(kuò)展程序中,可以進(jìn)行串口初始化、人-機(jī)交互、按鍵判斷、硬件電路自檢、操作系統(tǒng)升級等功能,也可以根據(jù)輸入命令跳轉(zhuǎn)到相應(yīng)程序或引導(dǎo)操作系統(tǒng)運行。這種模式集合了前兩種模式的特點,啟動過程較為靈活,并可以提供豐富的擴(kuò)展功能,在實際工程中得到了廣泛應(yīng)用。常用的通用引導(dǎo)程序,如U-Boot等都是采用這種模式。3、擴(kuò)展引導(dǎo)程序,使其初始化功能結(jié)束后即可跳轉(zhuǎn)到一個104、應(yīng)用程序編譯為.axf文件,下載到SDRAM存儲器中運行在此模式下,工程文件僅由應(yīng)用程序組成,不需要包含引導(dǎo)程序,程序編譯完畢后由AXD調(diào)試軟件通過JTAG口下載到SDRAM中,下載地址由ADS在程序編譯前指定,其地址信息附加在編譯后生成的.axf文件中。4、應(yīng)用程序編譯為.axf文件,下載到SDRAM存儲器中運114.3軟件系統(tǒng)開發(fā)概述嵌入式系統(tǒng)的BootLoader

BootLoader類似于PC上的BIOS,是系統(tǒng)上電復(fù)位后,首先執(zhí)行的一段程序,用以完成整個系統(tǒng)的啟動和加載任務(wù)。其功能主要是:(1)初始化CPU、堆棧指針;(2)配置存儲映射,建立系統(tǒng)的編址空間映射(3) 跳轉(zhuǎn)到應(yīng)用程序或操作4.3軟件系統(tǒng)開發(fā)概述嵌入式系統(tǒng)的BootLoader122.BootLoader的開發(fā)模板seealsoP123圖4.6定義異常向量初始化系統(tǒng)配置寄存器第一次存儲器映射從Flash復(fù)制程序到ADRAM第二次存儲器映射初始化堆棧指針跳轉(zhuǎn)到程序入口2.BootLoader的開發(fā)模板定義異常向量初始化系統(tǒng)配133.關(guān)于BootLoader開發(fā)模板的解釋

1)定義異常向量ARM處理器的硬件決定了處理器出現(xiàn)異常時PC指針會自動跳轉(zhuǎn)到從0x0到0x1C的地址處運行,因此BootLoader應(yīng)在這些地址放置跳轉(zhuǎn)指令,使異常產(chǎn)生后程序能跳轉(zhuǎn)到相應(yīng)的異常處理程序。2)初始化系統(tǒng)配置寄存器系統(tǒng)配置寄存器SYSCFG決定了編址空間中特殊功能寄存器組的起始地址,以及片內(nèi)SRAM的使用方式和起始地址,應(yīng)首先對其初始化。3.關(guān)于BootLoader開發(fā)模板的解釋143)進(jìn)行第一次存儲器映射(將SDRAM存儲器映射到0X400000-0X1400000)系統(tǒng)復(fù)位后編址空間還沒有進(jìn)行初始化,只有Flash能夠被訪問,暫時無法讀/寫SDRAM,應(yīng)首先通過對相關(guān)寄存器賦值,在編址空間和實際SDRAM物理設(shè)備之間建立映射關(guān)系,通過第一次存儲器映射,將SDRAM存儲器映射到0X400000-0X1400000,使得SDRAM處于正常讀/寫狀態(tài)。4)從Flash復(fù)制程序到SDRAM第一次映射中已經(jīng)將SDRAM映射到了地址0x400000-0x1400000處,由于SDRAM具有更快的讀/寫速度,在嵌入式系統(tǒng)中通常將程序從Flash復(fù)制到SDRAM中執(zhí)行,這個工作由BootLoader完成。3)進(jìn)行第一次存儲器映射(將SDRAM存儲器映射到0X400155)進(jìn)行第二次存儲器映射和SDRAM相比,F(xiàn)lash讀/寫速度較慢,而ARM芯片的硬件構(gòu)成決定了異常向量表必須放在0x0處,如果將Flash映射到0x0,將明顯地減慢系統(tǒng)對異常的處理時間,另外,因為無法在Flash修改異常向量表,因此通常將異常向量表存放在SDRAM中,并把SDRAM的起始地址映射到0x0處。所以第二次存儲器映射就是將SDRAM存儲器從原地址0x400000-0x1400000處映射到0x000000-0x100000;將Flash存儲器從原地址0x0-0x200000處映射到0x1000000-0x1200000。6)初始化堆棧指針對堆棧指針進(jìn)行初始化,應(yīng)首先確定堆棧指針工作方式,如滿遞減等,再根據(jù)應(yīng)用程序中實際需要使用的堆棧大小進(jìn)行設(shè)置。5)進(jìn)行第二次存儲器映射167)跳轉(zhuǎn)到應(yīng)用程序或操作系統(tǒng)入口

對于應(yīng)用程序:

在匯編程序中導(dǎo)入應(yīng)用程序中的函數(shù)標(biāo)號,通過跳轉(zhuǎn)指令可直接跳轉(zhuǎn)到應(yīng)用程序;對于操作系統(tǒng):操作系統(tǒng)通常被燒寫到Flash的固定地址處,初始化過程完成后跳轉(zhuǎn)到操作系統(tǒng)的指定地址處即可。NOTE:在編寫B(tài)ootLoader程序時,可根據(jù)具體硬件配置,對圖4.6中文件進(jìn)行相應(yīng)修改;在使用BootLoader引導(dǎo)不同應(yīng)用程序時,只需在main.c文件中添加相應(yīng)的應(yīng)用程序源代碼即可。

7)跳轉(zhuǎn)到應(yīng)用程序或操作系統(tǒng)入口174.開發(fā)BootLoader的主要方案(1)獲得相同型號CPU在其他開發(fā)板上的BootLoader,在此基礎(chǔ)上修改;(2)使用U-Boot、Redboot等通用BootLoader進(jìn)行移植;(3)根據(jù)功能需求自行編寫B(tài)ootLoader。NOTE:(1)如果硬件平臺使用了常見的處理器型號,方案一、二能夠高效、快捷地完成BootLoader設(shè)計。因為ARM內(nèi)核處理器應(yīng)用廣泛,在網(wǎng)絡(luò)上即可下載到大多數(shù)型號的BootLoader,只需針對硬件參數(shù)進(jìn)行修改即可。(2)自行編寫B(tài)ootLoader程序需要熟練掌握處理器的中斷方式、編址空間、寄存器配置等,且對匯編語言應(yīng)用能力要求較高,因此方案三難度較大、采用較少。(3)U-Boot(UniversalBootLoader)具有源碼開放、支持的處理器廣泛(PowerPC、ARM、X86等),可靠性和穩(wěn)定性好、設(shè)備驅(qū)動豐富(串口、以太網(wǎng)、SDRAM、Flash等)等特點,本書附錄介紹了U-Boot的移植方法。4.開發(fā)BootLoader的主要方案(1)獲得相同型號CP184.4嵌入式系統(tǒng)引導(dǎo)程序4.4.1BootLoader概述BootLoader是在系統(tǒng)啟動初始化硬件設(shè)備、建立存儲器映射,從而將系統(tǒng)的軟、硬件環(huán)境帶到一個合適狀態(tài)的一段程序,類似于PC上的BIOS,是嵌入式軟件系統(tǒng)的底層。

典型的BootLoader程序通常需要完成的任務(wù):

(1)定義入口地址;(2)建立異常中斷處理向量;(3)初始化堆棧指針;(4)跳轉(zhuǎn)到應(yīng)用程序的主函數(shù)中或跳轉(zhuǎn)到操作系統(tǒng)的啟動地址。4.4嵌入式系統(tǒng)引導(dǎo)程序4.4.1BootLoader概194.4.2s3c4510B編址空間和存儲器映射

1.s3c4510b編址空間2.S3c4510b存儲器映射常用的5個系統(tǒng)管理寄存器:1)ROM/SRAM/Flash控制寄存器ROMCONn2)DRAM/SDRAM控制寄存器DRAMCONn3)系統(tǒng)配置寄存器SYSCFG4)數(shù)據(jù)總線寬度寄存器EXTDBWTH5)DRAMA刷新與外部I/O控制寄存器REFEXTCON4.4.2s3c4510B編址空間和存儲器映射204.4.3BootLoader啟動過程分析

1、BootLoader是高度依賴于硬件的,針對不同的硬件配置,其實現(xiàn)方式也各不相同。2、以一段s3c4510b的初始化代碼為例進(jìn)行分析,其啟動過程分為7個步驟:(1)定義異常向量;(2)初始化系統(tǒng)配置寄存器;(3)進(jìn)行第一次存儲器映射(將SDRAM存儲器映射到0x400000-0x1400000);(4)從Flash復(fù)制程序到SDRAM;(5)進(jìn)行第二次存儲器映射(將SDRAM存儲器從原地址0x400000-0x1400000處映射到0x0-0x1000000;將Flash存儲器從原地址0x0-0x200000處映射到0x1200000-0x1400000);(6)初始化堆棧指針;(7)跳轉(zhuǎn)到C語言程序(應(yīng)用程序或操作系統(tǒng)入口)

4.4.3BootLoader啟動過程分析

1、Boo213、系統(tǒng)上電后的映射關(guān)系:圖4.10P1323、系統(tǒng)上電后的映射關(guān)系:224、BootLoader啟動過程分析

補(bǔ)充:關(guān)于偽指令EQU語法格式:名稱EQU表達(dá)式{,類型}EQU偽指令用于為程序中的常量、標(biāo)號等定義一個等效的字符名稱,類似于C語言中的#define。其中EQU可用“*”代替?!懊Q”為EQU偽指令定義的字符名稱,當(dāng)“表達(dá)式”為32位的常量時,可以指定表達(dá)式的數(shù)據(jù)類型,有以下三種類型:CODE16、CODE32和DATA使用示例:(1)TestEQU50;定義標(biāo)號Test的值為50(2)AddrEQU0x55,CODE32;定義Addr的值為0x55,且該處為32位的ARM指令。

4、BootLoader啟動過程分析230)系統(tǒng)默認(rèn)從Flash的0x0地址處開始執(zhí)行程序,因此首先要進(jìn)行SDRAM映射SYSCFGEQU0X3FF0000;系統(tǒng)配置寄存器地址EXTDBWTHEQUOX3FF3010;數(shù)據(jù)寬度寄存器地址ROMCON0EQUOX3FF3014;Flash配置寄存器地址SDRAMCON0EQUOX3FF302C;SDRAM配置寄存器地址REFEXTCONEQUOX3FF303C;刷新和外部I/O寄存器地址0)系統(tǒng)默認(rèn)從Flash的0x0地址處開始執(zhí)行程序,因此首24

rSYSCFGEQU0XE7FFFF90;系統(tǒng)配置寄存器的賦值

rEXTDBWTHEQUOX00003002;數(shù)據(jù)寬度寄存器的賦值

rREFEXTCONEQUOXCE338360;刷新和外部I/O寄存器的賦值;第一次映射時,F(xiàn)lash和SDRAM配置寄存器的賦值

rfROMCON0EQUOX02000060

rfSDRAMCON0EQUOX14010380;第二次映射時,F(xiàn)lash和SDRAM配置寄存器的賦值

rsROMCON0EQUOX14048060

rsSDRAMCON0EQUOX10000380

無操作系統(tǒng)的應(yīng)用程序開發(fā)精編課件25;沒有使用的存儲器組,賦值為0rROMCON1EQU0X0rROMCON2EQU0X0rROMCON3EQU0X0rROMCON4EQU0X0rROMCON5EQU0X0rSDRAMCON1EQU0X0rSDRAMCON2EQU0X0rSDRAMCON3EQU0X0;沒有使用的存儲器組,賦值為026IOPMODEQU0X3FF5000;GPIO模式寄存器IOPCONEQU0X3FF5004;GPIO配置寄存器IOPDATAEQU0X3FF5008;GPIO數(shù)據(jù)寄存器IOPMODEQU0X3FF5000;27;1)定義異常向量CODE32AREAInit,CODE,READONLY;定義為代碼段ENTRY;程序入口BReset_Handler;啟動后跳轉(zhuǎn)到標(biāo)號Reset_Handler處;以下7條NOP語句分別對應(yīng)7個中斷向量,因為不使用中斷,此處定義異常向量表為空。NOP;未定義指令中斷NOP;軟件中斷NOP;預(yù)取指令終止NOP;數(shù)據(jù)終止NOP;保留BIRQHandler;IRQ中斷NOP;FIQ中斷NOTE:

沒有使用中斷時,在中斷向量表處可存放NOP指令,需要使用中斷向量,如IRQ中斷時,在相應(yīng)的中斷向量地址處存放一條跳轉(zhuǎn)到中斷服務(wù)程序的跳轉(zhuǎn)指令即可。

;1)定義異常向量282)初始化系統(tǒng)配置寄存器、數(shù)據(jù)寬度寄存器Reset_Handler;初始化syscfg寄存器;[5:4]Cache模式01=0KBSRAM,8KBCache;[25:16]特殊功能寄存器組的基指針1111111111=0x3ffLDRR1,=SYSCFG;代表什么?觀察寄存器、存儲器的內(nèi)容LDRR0,=rSYSCFG;STRR0,[R1];R0->[R1];初始化EXTDBWTH寄存器,Rextdbwth=0x00003002;[1:0]Flash組0的數(shù)據(jù)總線寬度=1016位;[13:12]DRAM組0的數(shù)據(jù)總線寬度=1132位LDRR1,=EXTDBWTH;LDRR0,=rEXTDBWTH;STRR0,[R1];R0->[R1]NOTE:系統(tǒng)配置寄存器SYSCFG的地址為0x3FF0000;數(shù)據(jù)寬度寄存器EXTDBWTH的地址為0x3FF3010。SYSCFG的作用主要是定義怎樣使用處理器的片內(nèi)資源;EXTDBWTH的作用是定義外部資源的數(shù)據(jù)寬度,同時也讓系統(tǒng)了解了外部硬件連接情況。2)初始化系統(tǒng)配置寄存器、數(shù)據(jù)寬度寄存器293)進(jìn)行第一次存儲器映射映射的作用就是將外部物理設(shè)備映射到相應(yīng)的地址范圍。bootloader中使用了兩次映射,其本質(zhì)就是給兩個相應(yīng)的寄存器賦值,它們是:Flash控制寄存器ROMCON,地址為0x3FF3014;SDRAM控制寄存器DRAMCON,地址為0x3FF302C。LDRr0,=ROMCON0;r0中存放STMIA指令的目的地址;rfROMCON0=0x02000060;[19:10]Flash組基指針0x0;[29:20]Flash組尾指針0x200000LDRr1,=rfROMCON0;將頭文件中定義的寄存器賦值寫入寄存器LDRr2,=rROMCON1LDRr3,=rROMCON2LDRr4,=rROMCON3LDRr5,=rROMCON4LDRr6,=rROMCON53)進(jìn)行第一次存儲器映射30;rfSDRAMCON0=0x14010380;[19:10]DRAM組基指針=01000000,即地址為0x400000;[29:20]DRAM組尾指針=0101000000,即地址為0x1400000LDRr7,=rSDRAMCON0

LDRr8,=rSDRAMCON1LDRr9,=rSDRAMCON2LDRr10,=rSDRAMCON3LDRr11,=rREFEXTCON;將r1-r11的賦值一次性寫入以r0為開始地址的存儲單元STMIAr0,{r1-r11}

NOTE:(1)這段程序執(zhí)行完后,系統(tǒng)的地址空間映射如P135圖4.11所示。(2)此段程序中蘭色標(biāo)注的兩小段的作用是?它們好象屬于沒有使用的存儲器組,那能刪掉嗎?;rfSDRAMCON0=0從Flash復(fù)制程序到SDRAM原因:當(dāng)程序在SDRAM中運行時速度快,但不能掉電保護(hù);程序在flash中運行時,可以掉電保護(hù),但運行速度慢,且中斷無法修改;該步驟集二者之長,既可以在SDRAM中運行,又可以進(jìn)行掉電保護(hù)。LDRr0,=0x0;初始化復(fù)制數(shù)據(jù)的源地址LDRr1,=0x200000;初始化循環(huán)次數(shù)LDRr2,=0x400000;初始化復(fù)制數(shù)據(jù)的目的地址rom2ram_copy_loop;子程序標(biāo)號,此子程序作用就是把程序從Flash復(fù)制到SDRAMLDRr3,[r0],#4;加載指令,將以[r0]為地址的存儲單元的數(shù)據(jù)送到寄存器r3,修改r0的值即r0+4->r0,讓它指向下一個存儲單元。STRr3,[r2],#4;存儲指令,將寄存器r3存放的數(shù)據(jù)送到以[r2]為地址的存儲單元,修改r2的值即r2+4->r2,讓它指向下一個存儲單元。SUBSr1,r1,#4BNErom2ram_copy_loop4)從Flash復(fù)制程序到SDRAM32

執(zhí)行完這段程序后,可以暫停BootLoader程序,打開AXD調(diào)試程序觀察系統(tǒng)存儲器窗口,如P136圖4.13所示,可以看到地址為0x0處為Flash存儲器,其中保存著BootLoader程序,而地址0x400000處為SDRAM存儲器,其中也保存著和Flash完全相同的程序。5)進(jìn)行第二次存儲器映射

seealsoP136問題:第一、二次存儲器映射的相同與不同?

執(zhí)行完這段程序后,可以暫停BootLo336)初始化堆棧指針

在引導(dǎo)程序運行前,堆棧指針必須被初始化。堆棧指針的初始化涉及到CPSR_C和SP兩個寄存器。通過對CPSR_C的賦值來實現(xiàn)處理器模式的轉(zhuǎn)換;而對SP賦值來實現(xiàn)在不同模式下對堆棧指針的初始化。

;設(shè)置IRQ堆棧指針MOVr0,#0x12MSRcpsr_c,r0;MSR-通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令;傳送r0的內(nèi)容到cpsr,但僅修改cpsr中的控制位域;切換到IRQ模式

MOVsp,=0x700000;為堆棧指針寄存器賦值

;設(shè)置FIQ堆棧指針MOVr0,#0x11MSRcpsr_c,r0;切換到FIQ模式

LDRsp,=0x7f0000;為堆棧指針寄存器賦值;設(shè)置SVC堆棧指針MOVr0,#0x13MSRcpsr_c,r0;切換到SVC模式

LDRsp,=0x800000;為堆棧指針寄存器賦值問題:(1)程序中紅色標(biāo)注指令都是為堆棧指針寄存器賦值,它們有啥異同?(2)從圖4.17可以看出:堆棧是用什么來充當(dāng)?shù)模?/p>

6)初始化堆棧指針347)引導(dǎo)應(yīng)用程序時,跳轉(zhuǎn)到應(yīng)用程序中的主函數(shù)中:IMPORTC_Entry;跳轉(zhuǎn)到main函數(shù)BLC_EntryEND引導(dǎo)操作系統(tǒng)時,跳轉(zhuǎn)到操作系統(tǒng)的啟動地址處(uClinux為0x10000)LDRpc,=0x10000END7)引導(dǎo)應(yīng)用程序時,跳轉(zhuǎn)到應(yīng)用程序中的主函數(shù)中:354.5無操作系統(tǒng)下單任務(wù)應(yīng)用程序的開發(fā)1、無操作系統(tǒng)的優(yōu)、缺點無操作系統(tǒng)相當(dāng)于裸機(jī),資源利用少,運行速度快;無操作系統(tǒng)只適合單任務(wù)或簡單多任務(wù)的應(yīng)用程序的開發(fā);而對于復(fù)雜多任務(wù)的嵌入式系統(tǒng),無操作系統(tǒng)會大大增加開發(fā)難度。4.5無操作系統(tǒng)下單任務(wù)應(yīng)用程序的開發(fā)1、無操作系統(tǒng)的優(yōu)、362、開發(fā)流程:編寫.s、.c文件編譯,生成.axf文件硬件調(diào)試按復(fù)位鍵,實現(xiàn)上電自啟動通過H-flash將.bin文件添加到flash中編譯,生成.bin文件添加Bootloader到.s源文件中2、開發(fā)流程:編寫.s、.c文件編譯,生成.axf文件硬件37也可以說,開發(fā)應(yīng)用程序可分為兩個階段:(1)在調(diào)試階段,將應(yīng)用程序編譯為.axf文件,下載到SDRAM運行,在此過程中可對應(yīng)用程序使用單步、斷點等調(diào)試手段進(jìn)行調(diào)試;(2)將BootLoader引導(dǎo)程序添加到工程中,編譯工程生成.bin文件,燒寫到Flash存儲器中,完成應(yīng)用程序開發(fā)。也可以說,開發(fā)應(yīng)用程序可分為兩個階段:383、.s文件中添加Bootloader關(guān)于硬件調(diào)試前面已經(jīng)講過,這里不再復(fù)述。調(diào)試成功后,添加Bootloader的目的是將程序固化,實現(xiàn)上電自啟動。簡單的說,就是刪除先前.s文件中的代碼段和入口點定義兩行,再將它放到Bootloader的堆棧初始化之后。3、.s文件中添加Bootloader394、編譯編譯的過程跟硬件調(diào)試的一樣,只是設(shè)置有所區(qū)別,主要別如下:在DebugRelSettings->ARMLinker中:Output選項卡的R0Base下面一欄中填“0x0”;Layout選項卡的Object/SYmbol下面一欄中填“Init.o”;Section下面一欄中填“Init”。4、編譯405、.bin下載到Flash首先要對H-Flash進(jìn)行相應(yīng)的設(shè)置,書上已有詳細(xì)的講解,為了避免每次實驗重復(fù)設(shè)置,可將設(shè)置保存到一個.hfc文件中,以后需要設(shè)置時加載此文件即可。HOW?在加載前,還需要對programming->Type進(jìn)行下載文件類型的選擇;programming->DstAddr一欄中填寫下載的目標(biāo)地址。5、.bin下載到Flash414.6固化程序到Flash存儲器兩種方法:(1)使用H-JTAG燒寫Flash(第三章已講)(2)編寫Flash燒寫程序燒寫Flash要求:熟練掌握兩種方法4.6固化程序到Flash存儲器兩種方法:42編寫Flash燒寫程序燒寫Flash

燒寫程序到Flash的過程是將待燒寫文件和燒寫程序分別下載到SDRAM中,運行燒寫程序。燒寫程序?qū)⒋裏龑懳募徇\到Flash中的指定地址中。編寫Flash燒寫程序燒寫Flash燒寫程43編寫Flash燒寫程序算法思想:(1)整片擦除Flash存儲器;(2)將SDRAM中0x500000地址起始處的內(nèi)容按字復(fù)制到Flash的0x0地址起始處,每復(fù)制一個字,判斷是否有效,如果有效則地址遞增,繼續(xù)復(fù)制下一個字的內(nèi)容,直至所有內(nèi)容復(fù)制完。NOTE:(1)在整個過程中,將指示信息通過串口打印到超級終端顯示;(2)程序中用來標(biāo)志系統(tǒng)中Flash存儲器的起始物理地址FLASH_START_ADDR,在此例中假定Flash存儲器的起始物理地址為0x0,當(dāng)把Flash存儲器映射到其他的地址空間,應(yīng)修改FLASH_START_ADDR的值。編寫Flash燒寫程序算法思想:44燒寫流程(1)將實驗板上電,并連接實驗板和PC,在PC端首先打開調(diào)試代理程序,再打開AXD調(diào)試代理軟件,執(zhí)行obey命令,將SDRAM映射到0X400000-0X1400000,將Flash映射到0X0-0X200000;(2)在AXD中裝載燒寫程序.axf映像文件,執(zhí)行File菜單里的LoadImage命令,加載Flash燒寫程序映像到SDRAM存儲器;(3)在AXD中裝載待燒寫程序的.bin文件到SDRAM中,與.axf文件不同,.bin文件是應(yīng)用程序的二進(jìn)制代碼文件,不含有調(diào)試信息,因此裝載方法和.axf文件不同,裝載.bin文件時還應(yīng)該指定程序下載到SDRAM中的地址,執(zhí)行File菜單里的LoadMemoryFromFile命令,選擇要加載的文件,并填寫裝載地址。(4)在AXD中運行燒寫程序,燒寫程序?qū)?bin文件燒寫到Flash中。燒寫流程(1)將實驗板上電,并連接實驗板和PC,在PC端首先45文件類型總結(jié):.s:匯編語言源文件;.c:c語言源文件;.mcp:工程文件;.bin:二進(jìn)制文件;.axf:映像文件;.o文件:目標(biāo)文件.his:H-JTAG的配置文件;.hfc:H-Flasher的配置文件。文件類型總結(jié):46第4章無操作系統(tǒng)的應(yīng)用軟件開發(fā)第4章無操作系統(tǒng)的應(yīng)用軟件開發(fā)47嵌入式軟件系統(tǒng)分為無操作系統(tǒng)和有操作系統(tǒng)。前者包括引導(dǎo)程序和應(yīng)用程序,后者則在引導(dǎo)程序結(jié)束后運行操作系統(tǒng),并將應(yīng)用程序作為任務(wù)添加到操作系統(tǒng)中。NOTE:運行操作系統(tǒng)會占用大量寶貴的硬件資源,因此很多硬件資源有限、任務(wù)簡單的嵌入式應(yīng)用并不使用操作系統(tǒng)。嵌入式軟件系統(tǒng)分為無操作系統(tǒng)和有操作系統(tǒng)。48嵌入式系統(tǒng)不管是否使用操作系統(tǒng),都需要一段引導(dǎo)程序BootLoader來初始化硬件,為操作系統(tǒng)或應(yīng)用程序的運行做準(zhǔn)備。BootLoader是硬件與軟件的橋梁,其作用就是初始化硬件設(shè)備、編址空間映射,建立系統(tǒng)軟、硬件的正常工作狀態(tài)。BootLoader的開發(fā)已經(jīng)成為嵌入式系統(tǒng)教學(xué)和工程中的技術(shù)瓶頸。本章的內(nèi)容:*介紹BootLoader的功能*分析s3c4510b的編址空間映射*分析BootLoader的啟動過程*提出工程中BootLoader的解決方案。*用實例介紹不使用嵌入式操作系統(tǒng)的軟件開發(fā)流程和代碼固化方法。本章的目標(biāo):讓讀者能使用ADS開發(fā)一個完整的不使用操作系統(tǒng)的嵌入式系統(tǒng)。嵌入式系統(tǒng)不管是否使用操作系統(tǒng),都需要一段引導(dǎo)程序BootL494.1軟件開發(fā)數(shù)據(jù)流向圖在不使用嵌入式操作系統(tǒng)的情況下,在ADS上能完成從BootLoader到應(yīng)用程序的整個開發(fā)流程,使用JTAG仿真器進(jìn)行調(diào)試,RS-232串口作為標(biāo)準(zhǔn)輸入/輸出,數(shù)據(jù)流向如P120圖4.1所示。在調(diào)試階段:使用ADS開發(fā)應(yīng)用程序,編譯生成帶調(diào)試信息的.axf文件;用JTAG仿真器連接實驗板和PC,將實驗板上電,打開調(diào)試代理軟件檢測到ARM核處理器在AXD中使用setmem或obey命令設(shè)置CPU特殊功能寄存器配置存儲空間;加載.axf文件到SDRAM存儲器就可以調(diào)試運行了;利用AXD提供的單步、斷點等調(diào)試手段,可以方便地查看CPU寄存器、存儲器內(nèi)容。

4.1軟件開發(fā)數(shù)據(jù)流向圖在不使用嵌入式操作系統(tǒng)的情況下,在50NOTE:*程序是在SDRAM里運行的,因此掉電后不能保存;*應(yīng)用程序調(diào)試完畢后,將其加入BootLoader,編譯生成不帶調(diào)試信息的.bin文件,bin格式的映象文件只能全速運行;*燒寫.bin文件需要一個專門的Flash燒寫程序(擴(kuò)展名為.axf)。*先采用上述調(diào)試軟件的方法將燒寫程序.axf文件加載到SDRAM,然后選擇AXD的File菜單里面的LoadImage命令,將應(yīng)用程序.bin文件加載到SDRAM的合適地址上,運行燒寫程序,就能將.bin文件燒寫到Flash存儲器了。*在調(diào)試或燒寫過程中,可以將必要信息通過RS-232串口輸出到PC超級終端進(jìn)行顯示。NOTE:514.2無操作系統(tǒng)的軟件運行模式不使用操作系統(tǒng)時,嵌入式軟件系統(tǒng)包含引導(dǎo)程序和應(yīng)用程序兩個部分:(1)引導(dǎo)程序是嵌入式軟件系統(tǒng)中必不可少的部分,完成硬件初始化、存儲器空間映射和設(shè)置系統(tǒng)工作狀態(tài)等工作。(2)應(yīng)用程序則根據(jù)不同應(yīng)用目的而編寫。無操作系統(tǒng)下的各種軟件運行模式的主要區(qū)別在于:引導(dǎo)程序和應(yīng)用程序的各種組成方式。NOTE:

下面介紹的四種模式中采用的編址空間是經(jīng)過二次存儲器映射后的空間,在沒有了解存儲器的二次映射之前,只需要了解此圖中各個部分的邏輯關(guān)系即可,不用去考慮物理地址。4.2無操作系統(tǒng)的軟件運行模式不使用操作系統(tǒng)時,嵌入式軟件系52

無操作系統(tǒng)的嵌入式軟件運行模式:

1、應(yīng)用程序和引導(dǎo)程序在一個工程中一起編譯為一個.bin文件,燒寫到Flash存儲器地址0x0,引導(dǎo)程序運行結(jié)束后直接跳轉(zhuǎn)到應(yīng)用程序的入口處:(1)BootLoader啟動后,F(xiàn)lash中的所有程序被復(fù)制到SDRAM存儲器中,如圖4.2P121(2)引導(dǎo)程序結(jié)束后就進(jìn)入應(yīng)用程序,這種跳轉(zhuǎn)方式通過在引導(dǎo)程序中導(dǎo)入應(yīng)用程序主函數(shù)名稱來實現(xiàn)。(3)從匯編程序跳轉(zhuǎn)到應(yīng)用程序時,編譯器會自動計算跳轉(zhuǎn)的目的地址。。

53(4)跳轉(zhuǎn)的代碼如下:IMPORTC_Entry;導(dǎo)入應(yīng)用程序的C_Entry函數(shù)BLC_Entry;跳轉(zhuǎn)到該函數(shù),跳轉(zhuǎn)地址由編譯器在編譯時計算NOTE:應(yīng)用程序存放到SDRAM的引導(dǎo)程序后,但其起始地址并不固定,在編譯時,應(yīng)用程序的起始地址隨著引導(dǎo)程序的大小而變化。(4)跳轉(zhuǎn)的代碼如下:54

2、應(yīng)用程序和引導(dǎo)程序分別編譯為兩個.bin文件,引導(dǎo)程序燒寫到Flash存儲器地址0x0,應(yīng)用程序則燒寫到存儲器中的某個地址,引導(dǎo)程序運行結(jié)束后跳轉(zhuǎn)到該地址運行應(yīng)用程序

(1)BootLoader啟動后,F(xiàn)lash中的所有程序被復(fù)制到SDRAM存儲器中,如圖4.3P121(2)引導(dǎo)程序結(jié)束后就進(jìn)入應(yīng)用程序,即將PC指針跳轉(zhuǎn)到應(yīng)用程序的起始地址,跳轉(zhuǎn)的代碼如下:LDRR1,=0X10000MOVPC,R1NOTE:

這種模式下,應(yīng)用程序和引導(dǎo)程序被單獨編譯為兩個.bin文件,因此應(yīng)用程序可以靈活地?zé)龑懙饺我獾刂诽?。本例中?yīng)用程序被燒寫到0x10000為例。

2、應(yīng)用程序和引導(dǎo)程序分別編譯為兩個.bin文件,引55

3、擴(kuò)展引導(dǎo)程序,使其初始化功能結(jié)束后即可跳轉(zhuǎn)到一個函數(shù)入口,也可以跳轉(zhuǎn)到指定地址在此模式下,引導(dǎo)程序和其擴(kuò)展的部分在一個工程中,編譯為.bin文件,最后燒寫到Flash存儲器的地址0x0處,應(yīng)用程序既可以隨引導(dǎo)程序一起編譯,也可以單獨編譯并下載到指定地址。如P122圖4.4所示,引導(dǎo)程序完成后跳轉(zhuǎn)到擴(kuò)展程序中,可以進(jìn)行串口初始化、人-機(jī)交互、按鍵判斷、硬件電路自檢、操作系統(tǒng)升級等功能,也可以根據(jù)輸入命令跳轉(zhuǎn)到相應(yīng)程序或引導(dǎo)操作系統(tǒng)運行。這種模式集合了前兩種模式的特點,啟動過程較為靈活,并可以提供豐富的擴(kuò)展功能,在實際工程中得到了廣泛應(yīng)用。常用的通用引導(dǎo)程序,如U-Boot等都是采用這種模式。3、擴(kuò)展引導(dǎo)程序,使其初始化功能結(jié)束后即可跳轉(zhuǎn)到一個564、應(yīng)用程序編譯為.axf文件,下載到SDRAM存儲器中運行在此模式下,工程文件僅由應(yīng)用程序組成,不需要包含引導(dǎo)程序,程序編譯完畢后由AXD調(diào)試軟件通過JTAG口下載到SDRAM中,下載地址由ADS在程序編譯前指定,其地址信息附加在編譯后生成的.axf文件中。4、應(yīng)用程序編譯為.axf文件,下載到SDRAM存儲器中運574.3軟件系統(tǒng)開發(fā)概述嵌入式系統(tǒng)的BootLoader

BootLoader類似于PC上的BIOS,是系統(tǒng)上電復(fù)位后,首先執(zhí)行的一段程序,用以完成整個系統(tǒng)的啟動和加載任務(wù)。其功能主要是:(1)初始化CPU、堆棧指針;(2)配置存儲映射,建立系統(tǒng)的編址空間映射(3) 跳轉(zhuǎn)到應(yīng)用程序或操作4.3軟件系統(tǒng)開發(fā)概述嵌入式系統(tǒng)的BootLoader582.BootLoader的開發(fā)模板seealsoP123圖4.6定義異常向量初始化系統(tǒng)配置寄存器第一次存儲器映射從Flash復(fù)制程序到ADRAM第二次存儲器映射初始化堆棧指針跳轉(zhuǎn)到程序入口2.BootLoader的開發(fā)模板定義異常向量初始化系統(tǒng)配593.關(guān)于BootLoader開發(fā)模板的解釋

1)定義異常向量ARM處理器的硬件決定了處理器出現(xiàn)異常時PC指針會自動跳轉(zhuǎn)到從0x0到0x1C的地址處運行,因此BootLoader應(yīng)在這些地址放置跳轉(zhuǎn)指令,使異常產(chǎn)生后程序能跳轉(zhuǎn)到相應(yīng)的異常處理程序。2)初始化系統(tǒng)配置寄存器系統(tǒng)配置寄存器SYSCFG決定了編址空間中特殊功能寄存器組的起始地址,以及片內(nèi)SRAM的使用方式和起始地址,應(yīng)首先對其初始化。3.關(guān)于BootLoader開發(fā)模板的解釋603)進(jìn)行第一次存儲器映射(將SDRAM存儲器映射到0X400000-0X1400000)系統(tǒng)復(fù)位后編址空間還沒有進(jìn)行初始化,只有Flash能夠被訪問,暫時無法讀/寫SDRAM,應(yīng)首先通過對相關(guān)寄存器賦值,在編址空間和實際SDRAM物理設(shè)備之間建立映射關(guān)系,通過第一次存儲器映射,將SDRAM存儲器映射到0X400000-0X1400000,使得SDRAM處于正常讀/寫狀態(tài)。4)從Flash復(fù)制程序到SDRAM第一次映射中已經(jīng)將SDRAM映射到了地址0x400000-0x1400000處,由于SDRAM具有更快的讀/寫速度,在嵌入式系統(tǒng)中通常將程序從Flash復(fù)制到SDRAM中執(zhí)行,這個工作由BootLoader完成。3)進(jìn)行第一次存儲器映射(將SDRAM存儲器映射到0X400615)進(jìn)行第二次存儲器映射和SDRAM相比,F(xiàn)lash讀/寫速度較慢,而ARM芯片的硬件構(gòu)成決定了異常向量表必須放在0x0處,如果將Flash映射到0x0,將明顯地減慢系統(tǒng)對異常的處理時間,另外,因為無法在Flash修改異常向量表,因此通常將異常向量表存放在SDRAM中,并把SDRAM的起始地址映射到0x0處。所以第二次存儲器映射就是將SDRAM存儲器從原地址0x400000-0x1400000處映射到0x000000-0x100000;將Flash存儲器從原地址0x0-0x200000處映射到0x1000000-0x1200000。6)初始化堆棧指針對堆棧指針進(jìn)行初始化,應(yīng)首先確定堆棧指針工作方式,如滿遞減等,再根據(jù)應(yīng)用程序中實際需要使用的堆棧大小進(jìn)行設(shè)置。5)進(jìn)行第二次存儲器映射627)跳轉(zhuǎn)到應(yīng)用程序或操作系統(tǒng)入口

對于應(yīng)用程序:

在匯編程序中導(dǎo)入應(yīng)用程序中的函數(shù)標(biāo)號,通過跳轉(zhuǎn)指令可直接跳轉(zhuǎn)到應(yīng)用程序;對于操作系統(tǒng):操作系統(tǒng)通常被燒寫到Flash的固定地址處,初始化過程完成后跳轉(zhuǎn)到操作系統(tǒng)的指定地址處即可。NOTE:在編寫B(tài)ootLoader程序時,可根據(jù)具體硬件配置,對圖4.6中文件進(jìn)行相應(yīng)修改;在使用BootLoader引導(dǎo)不同應(yīng)用程序時,只需在main.c文件中添加相應(yīng)的應(yīng)用程序源代碼即可。

7)跳轉(zhuǎn)到應(yīng)用程序或操作系統(tǒng)入口634.開發(fā)BootLoader的主要方案(1)獲得相同型號CPU在其他開發(fā)板上的BootLoader,在此基礎(chǔ)上修改;(2)使用U-Boot、Redboot等通用BootLoader進(jìn)行移植;(3)根據(jù)功能需求自行編寫B(tài)ootLoader。NOTE:(1)如果硬件平臺使用了常見的處理器型號,方案一、二能夠高效、快捷地完成BootLoader設(shè)計。因為ARM內(nèi)核處理器應(yīng)用廣泛,在網(wǎng)絡(luò)上即可下載到大多數(shù)型號的BootLoader,只需針對硬件參數(shù)進(jìn)行修改即可。(2)自行編寫B(tài)ootLoader程序需要熟練掌握處理器的中斷方式、編址空間、寄存器配置等,且對匯編語言應(yīng)用能力要求較高,因此方案三難度較大、采用較少。(3)U-Boot(UniversalBootLoader)具有源碼開放、支持的處理器廣泛(PowerPC、ARM、X86等),可靠性和穩(wěn)定性好、設(shè)備驅(qū)動豐富(串口、以太網(wǎng)、SDRAM、Flash等)等特點,本書附錄介紹了U-Boot的移植方法。4.開發(fā)BootLoader的主要方案(1)獲得相同型號CP644.4嵌入式系統(tǒng)引導(dǎo)程序4.4.1BootLoader概述BootLoader是在系統(tǒng)啟動初始化硬件設(shè)備、建立存儲器映射,從而將系統(tǒng)的軟、硬件環(huán)境帶到一個合適狀態(tài)的一段程序,類似于PC上的BIOS,是嵌入式軟件系統(tǒng)的底層。

典型的BootLoader程序通常需要完成的任務(wù):

(1)定義入口地址;(2)建立異常中斷處理向量;(3)初始化堆棧指針;(4)跳轉(zhuǎn)到應(yīng)用程序的主函數(shù)中或跳轉(zhuǎn)到操作系統(tǒng)的啟動地址。4.4嵌入式系統(tǒng)引導(dǎo)程序4.4.1BootLoader概654.4.2s3c4510B編址空間和存儲器映射

1.s3c4510b編址空間2.S3c4510b存儲器映射常用的5個系統(tǒng)管理寄存器:1)ROM/SRAM/Flash控制寄存器ROMCONn2)DRAM/SDRAM控制寄存器DRAMCONn3)系統(tǒng)配置寄存器SYSCFG4)數(shù)據(jù)總線寬度寄存器EXTDBWTH5)DRAMA刷新與外部I/O控制寄存器REFEXTCON4.4.2s3c4510B編址空間和存儲器映射664.4.3BootLoader啟動過程分析

1、BootLoader是高度依賴于硬件的,針對不同的硬件配置,其實現(xiàn)方式也各不相同。2、以一段s3c4510b的初始化代碼為例進(jìn)行分析,其啟動過程分為7個步驟:(1)定義異常向量;(2)初始化系統(tǒng)配置寄存器;(3)進(jìn)行第一次存儲器映射(將SDRAM存儲器映射到0x400000-0x1400000);(4)從Flash復(fù)制程序到SDRAM;(5)進(jìn)行第二次存儲器映射(將SDRAM存儲器從原地址0x400000-0x1400000處映射到0x0-0x1000000;將Flash存儲器從原地址0x0-0x200000處映射到0x1200000-0x1400000);(6)初始化堆棧指針;(7)跳轉(zhuǎn)到C語言程序(應(yīng)用程序或操作系統(tǒng)入口)

4.4.3BootLoader啟動過程分析

1、Boo673、系統(tǒng)上電后的映射關(guān)系:圖4.10P1323、系統(tǒng)上電后的映射關(guān)系:684、BootLoader啟動過程分析

補(bǔ)充:關(guān)于偽指令EQU語法格式:名稱EQU表達(dá)式{,類型}EQU偽指令用于為程序中的常量、標(biāo)號等定義一個等效的字符名稱,類似于C語言中的#define。其中EQU可用“*”代替。“名稱”為EQU偽指令定義的字符名稱,當(dāng)“表達(dá)式”為32位的常量時,可以指定表達(dá)式的數(shù)據(jù)類型,有以下三種類型:CODE16、CODE32和DATA使用示例:(1)TestEQU50;定義標(biāo)號Test的值為50(2)AddrEQU0x55,CODE32;定義Addr的值為0x55,且該處為32位的ARM指令。

4、BootLoader啟動過程分析690)系統(tǒng)默認(rèn)從Flash的0x0地址處開始執(zhí)行程序,因此首先要進(jìn)行SDRAM映射SYSCFGEQU0X3FF0000;系統(tǒng)配置寄存器地址EXTDBWTHEQUOX3FF3010;數(shù)據(jù)寬度寄存器地址ROMCON0EQUOX3FF3014;Flash配置寄存器地址SDRAMCON0EQUOX3FF302C;SDRAM配置寄存器地址REFEXTCONEQUOX3FF303C;刷新和外部I/O寄存器地址0)系統(tǒng)默認(rèn)從Flash的0x0地址處開始執(zhí)行程序,因此首70

rSYSCFGEQU0XE7FFFF90;系統(tǒng)配置寄存器的賦值

rEXTDBWTHEQUOX00003002;數(shù)據(jù)寬度寄存器的賦值

rREFEXTCONEQUOXCE338360;刷新和外部I/O寄存器的賦值;第一次映射時,F(xiàn)lash和SDRAM配置寄存器的賦值

rfROMCON0EQUOX02000060

rfSDRAMCON0EQUOX14010380;第二次映射時,F(xiàn)lash和SDRAM配置寄存器的賦值

rsROMCON0EQUOX14048060

rsSDRAMCON0EQUOX10000380

無操作系統(tǒng)的應(yīng)用程序開發(fā)精編課件71;沒有使用的存儲器組,賦值為0rROMCON1EQU0X0rROMCON2EQU0X0rROMCON3EQU0X0rROMCON4EQU0X0rROMCON5EQU0X0rSDRAMCON1EQU0X0rSDRAMCON2EQU0X0rSDRAMCON3EQU0X0;沒有使用的存儲器組,賦值為072IOPMODEQU0X3FF5000;GPIO模式寄存器IOPCONEQU0X3FF5004;GPIO配置寄存器IOPDATAEQU0X3FF5008;GPIO數(shù)據(jù)寄存器IOPMODEQU0X3FF5000;73;1)定義異常向量CODE32AREAInit,CODE,READONLY;定義為代碼段ENTRY;程序入口BReset_Handler;啟動后跳轉(zhuǎn)到標(biāo)號Reset_Handler處;以下7條NOP語句分別對應(yīng)7個中斷向量,因為不使用中斷,此處定義異常向量表為空。NOP;未定義指令中斷NOP;軟件中斷NOP;預(yù)取指令終止NOP;數(shù)據(jù)終止NOP;保留BIRQHandler;IRQ中斷NOP;FIQ中斷NOTE:

沒有使用中斷時,在中斷向量表處可存放NOP指令,需要使用中斷向量,如IRQ中斷時,在相應(yīng)的中斷向量地址處存放一條跳轉(zhuǎn)到中斷服務(wù)程序的跳轉(zhuǎn)指令即可。

;1)定義異常向量742)初始化系統(tǒng)配置寄存器、數(shù)據(jù)寬度寄存器Reset_Handler;初始化syscfg寄存器;[5:4]Cache模式01=0KBSRAM,8KBCache;[25:16]特殊功能寄存器組的基指針1111111111=0x3ffLDRR1,=SYSCFG;代表什么?觀察寄存器、存儲器的內(nèi)容LDRR0,=rSYSCFG;STRR0,[R1];R0->[R1];初始化EXTDBWTH寄存器,Rextdbwth=0x00003002;[1:0]Flash組0的數(shù)據(jù)總線寬度=1016位;[13:12]DRAM組0的數(shù)據(jù)總線寬度=1132位LDRR1,=EXTDBWTH;LDRR0,=rEXTDBWTH;STRR0,[R1];R0->[R1]NOTE:系統(tǒng)配置寄存器SYSCFG的地址為0x3FF0000;數(shù)據(jù)寬度寄存器EXTDBWTH的地址為0x3FF3010。SYSCFG的作用主要是定義怎樣使用處理器的片內(nèi)資源;EXTDBWTH的作用是定義外部資源的數(shù)據(jù)寬度,同時也讓系統(tǒng)了解了外部硬件連接情況。2)初始化系統(tǒng)配置寄存器、數(shù)據(jù)寬度寄存器753)進(jìn)行第一次存儲器映射映射的作用就是將外部物理設(shè)備映射到相應(yīng)的地址范圍。bootloader中使用了兩次映射,其本質(zhì)就是給兩個相應(yīng)的寄存器賦值,它們是:Flash控制寄存器ROMCON,地址為0x3FF3014;SDRAM控制寄存器DRAMCON,地址為0x3FF302C。LDRr0,=ROMCON0;r0中存放STMIA指令的目的地址;rfROMCON0=0x02000060;[19:10]Flash組基指針0x0;[29:20]Flash組尾指針0x200000LDRr1,=rfROMCON0;將頭文件中定義的寄存器賦值寫入寄存器LDRr2,=rROMCON1LDRr3,=rROMCON2LDRr4,=rROMCON3LDRr5,=rROMCON4LDRr6,=rROMCON53)進(jìn)行第一次存儲器映射76;rfSDRAMCON0=0x14010380;[19:10]DRAM組基指針=01000000,即地址為0x400000;[29:20]DRAM組尾指針=0101000000,即地址為0x1400000LDRr7,=rSDRAMCON0

LDRr8,=rSDRAMCON1LDRr9,=rSDRAMCON2LDRr10,=rSDRAMCON3LDRr11,=rREFEXTCON;將r1-r11的賦值一次性寫入以r0為開始地址的存儲單元STMIAr0,{r1-r11}

NOTE:(1)這段程序執(zhí)行完后,系統(tǒng)的地址空間映射如P135圖4.11所示。(2)此段程序中蘭色標(biāo)注的兩小段的作用是?它們好象屬于沒有使用的存儲器組,那能刪掉嗎?;rfSDRAMCON0=0從Flash復(fù)制程序到SDRAM原因:當(dāng)程序在SDRAM中運行時速度快,但不能掉電保護(hù);程序在flash中運行時,可以掉電保護(hù),但運行速度慢,且中斷無法修改;該步驟集二者之長,既可以在SDRAM中運行,又可以進(jìn)行掉電保護(hù)。LDRr0,=0x0;初始化復(fù)制數(shù)據(jù)的源地址LDRr1,=0x200000;初始化循環(huán)次數(shù)LDRr2,=0x400000;初始化復(fù)制數(shù)據(jù)的目的地址rom2ram_copy_loop;子程序標(biāo)號,此子程序作用就是把程序從Flash復(fù)制到SDRAMLDRr3,[r0],#4;加載指令,將以[r0]為地址的存儲單元的數(shù)據(jù)送到寄存器r3,修改r0的值即r0+4->r0,讓它指向下一個存儲單元。STRr3,[r2],#4;存儲指令,將寄存器r3存放的數(shù)據(jù)送到以[r2]為地址的存儲單元,修改r2的值即r2+4->r2,讓它指向下一個存儲單元。SUBSr1,r1,#4BNErom2ram_copy_loop4)從Flash復(fù)制程序到SDRAM78

執(zhí)行完這段程序后,可以暫停BootLoader程序,打開AXD調(diào)試程序觀察系統(tǒng)存儲器窗口,如P136圖4.13所示,可以看到地址為0x0處為Flash存儲器,其中保存著BootLoader程序,而地址0x400000處為SDRAM存儲器,其中也保存著和Flash完全相同的程序。5)進(jìn)行第二次存儲器映射

seealsoP136問題:第一、二次存儲器映射的相同與不同?

執(zhí)行完這段程序后,可以暫停BootLo796)初始化堆棧指針

在引導(dǎo)程序運行前,堆棧指針必須被初始化。堆棧指針的初始化涉及到CPSR_C和SP兩個寄存器。通過對CPSR_C的賦值來實現(xiàn)處理器模式的轉(zhuǎn)換;而對SP賦值來實現(xiàn)在不同模式下對堆棧指針的初始化。

;設(shè)置IRQ堆棧指針MOVr0,#0x12MSRcpsr_c,r0;MSR-通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令;傳送r0的內(nèi)容到cpsr,但僅修改cpsr中的控制位域;切換到IRQ模式

MOVsp,=0x700000;為堆棧

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論