S3C2440啟動(dòng)代碼經(jīng)驗(yàn)總結(jié)_第1頁(yè)
S3C2440啟動(dòng)代碼經(jīng)驗(yàn)總結(jié)_第2頁(yè)
S3C2440啟動(dòng)代碼經(jīng)驗(yàn)總結(jié)_第3頁(yè)
S3C2440啟動(dòng)代碼經(jīng)驗(yàn)總結(jié)_第4頁(yè)
S3C2440啟動(dòng)代碼經(jīng)驗(yàn)總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1、引言2、匯編基礎(chǔ)2.1、偽操作GET 偽操作類(lèi)似于C 語(yǔ)言里面的include,是將一個(gè)源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。IMPORT偽操作相當(dāng)于C 語(yǔ)言中的extern 聲明,它告訴編譯器當(dāng)前的符號(hào)不再本源文件中定義,而是在其他源文件中定義,在本源文件中可能引用該符號(hào)。AERA 偽操作用于定義一個(gè)代碼或者數(shù)據(jù)段。ASSERT在匯編編譯器對(duì)匯編程序的掃描中,如果ASSERT 中條件不成立,ASSERT 偽操作將報(bào)告錯(cuò)誤信息。2.2、匯編指令LDR偽指令將一個(gè)32 位的常數(shù)或者一個(gè)地址值讀取到寄存器中。 BL跳轉(zhuǎn)指令,L 決定是否保存返回地址。MRS用于將狀

2、態(tài)寄存器的內(nèi)容傳送到通用寄存器中。MSR用于將通用寄存器的內(nèi)容或一個(gè)立即數(shù)傳送到狀態(tài)寄存器中。 LDM和STM分別為批量Load/Store內(nèi)存訪問(wèn)指令。FD為滿遞減數(shù)據(jù)棧。3、啟動(dòng)代碼功能模塊分解啟動(dòng)代碼主要是在主程序運(yùn)行之前初始化系統(tǒng)硬件及軟件的運(yùn)行環(huán)境,它的主要功能包括以下的幾個(gè)方面:* 建立中斷向量表* 初始化系統(tǒng)堆棧* 應(yīng)用程序執(zhí)行環(huán)境初始化* 跳轉(zhuǎn)至主函數(shù)3.1、系統(tǒng)堆棧初始化ARM有7種模式:* 用戶模式* 快速中斷模式* 中斷模式* 管理模式* 中止模式* 未定義模式* 系統(tǒng)模式系統(tǒng)堆棧的初始化主要是給各個(gè)處理器模式分配堆棧空間。堆棧是為中斷或程序跳轉(zhuǎn)服務(wù)的,當(dāng)發(fā)生中斷或程序跳

3、轉(zhuǎn)時(shí),需要將當(dāng)前處理器的狀態(tài)及一些參數(shù)保持在堆棧中,當(dāng)中斷處理完畢以后或程序執(zhí)行完后返回時(shí),再將堆棧保存的現(xiàn)場(chǎng)數(shù)據(jù)進(jìn)行恢復(fù),以保證原來(lái)的程序正確運(yùn)行。USERMODE EQU 0x10 ;用戶模式FIQMODE EQU 0x11 ;快速中斷模式IRQMODE EQU 0x12 ;中斷模式SVCMODE EQU 0x13 ;監(jiān)管模式ABORTMODE EQU 0x17 ;異常中斷模式UNDEFMODE EQU 0x1b ;未定義模式MODEMASK EQU 0x1f ;模式掩碼NOINT EQU 0xc0 ;取消中斷;設(shè)置工作模式的堆棧的起始地址;在option.inc 中定義了_STACK_B

4、ASEADDRESS EQU 0x33ff8000UserStack EQU (_STACK_BASEADDRESS-0x3800 ;堆??臻g0x33ff4800 SVCStack EQU (_STACK_BASEADDRESS-0x2800 ;堆??臻g0x33ff5800 UndefStack EQU (_STACK_BASEADDRESS-0x2400 ;堆??臻g0x33ff5c00AbortStack EQU (_STACK_BASEADDRESS-0x2000 ;堆??臻g0x33ff6000IRQStack EQU (_STACK_BASEADDRESS-0x1000 ;堆棧空間0x3

5、3ff7000 FIQStack EQU (_STACK_BASEADDRESS-0x0 ;堆棧空間0x33ff8000 堆棧初始化的順序決定系統(tǒng)最后運(yùn)行在哪種處理器模式,最后初始化哪種模式的堆棧,系統(tǒng)就運(yùn)行在哪種模式。InitStacksmrs r0,cpsrbit r0,r0,#MODEMASK先通過(guò)mrs 指令將狀態(tài)寄存器值讀取到r0,然后將r0 對(duì)應(yīng)的處理器模式為修改成未定義指令中止模式,再寫(xiě)回狀態(tài)寄存器使處理器真正切換到未定義指令中止模式,這就是“讀出-修改-寫(xiě)回”的方式來(lái)修改狀態(tài)寄存器的內(nèi)容。最后將該模式的堆棧指針sp 指向UndefStack 定義的地址,其他的模式操作方式也是一

6、樣的。orr r1,r0,#UNDEFMODE|NOINTmsr cpsr_cxsf,r1 ;UndefModeldr sp, = UndefStack ;UndefStack=0x33FF_5C00orr r1,r0,#ABORTMODE|NOINTmsr cpsr_cxsf,r1 ;AbortModeldr sp,=AbortStack ;AbortStack=0x33FF_60003.2、建立中斷向量表中斷向量表一般位于啟動(dòng)代碼的開(kāi)始部分,它是用戶程序與啟動(dòng)代碼之間以及啟動(dòng)代碼的各部分之間聯(lián)系的紐帶。它由一個(gè)一個(gè)的跳轉(zhuǎn)函數(shù)組成,它就象一個(gè)普通的散轉(zhuǎn)函數(shù),只不過(guò)散轉(zhuǎn)的過(guò)程中有硬件機(jī)制參與,

7、當(dāng)系統(tǒng)發(fā)生異常時(shí),ARM 處理器會(huì)通過(guò)硬件機(jī)制強(qiáng)制將PC 指針指向中斷向量表中對(duì)應(yīng)的異常跳轉(zhuǎn)函數(shù)存儲(chǔ)的地址,然后程序會(huì)跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序去執(zhí)行。b ResetHandler ;復(fù)位異常,開(kāi)發(fā)板上電或復(fù)位時(shí)進(jìn)入0x00b HandlerUndef ;未定義異常,遇到無(wú)法識(shí)別的指令時(shí)0x04b HandlerSWI ;軟中斷異常0x08b HandlerPabort ;指令預(yù)取錯(cuò)誤時(shí)進(jìn)入0x0cb HandlerDabort ;數(shù)據(jù)訪問(wèn)不能完成時(shí)進(jìn)入0x10b . ;保留 0x14b HandlerIRQ ;發(fā)生IRQ 中斷時(shí)進(jìn)入0x18b HandlerFIQ ;發(fā)生FIQ 中斷時(shí)進(jìn)入0x

8、1c這些是從0x0 地址開(kāi)始的連續(xù)32 字節(jié)的各個(gè)中斷入口,每個(gè)中斷占用4 字節(jié)的存儲(chǔ)空間,這些中斷入口地址是固定的,類(lèi)似于51 單片機(jī)的入口。建立異常向量表需要開(kāi)辟一塊大小為8*4 字節(jié)的空間,每個(gè)異常占據(jù)4 個(gè)字節(jié)的空間,這4 個(gè)字節(jié)的空間包含的是一個(gè)跳轉(zhuǎn)指令,通過(guò)這條指令使PC 指向相應(yīng)的異常處理函數(shù)的入口,具體的處理函數(shù)是在別處實(shí)現(xiàn)的。下面這個(gè)宏是用于第一次查表過(guò)程的實(shí)現(xiàn)中斷向量的重定向,比如當(dāng)產(chǎn)生FIQ 的時(shí)候,PC 先指向FIQ 的中斷入口地址0x1c(強(qiáng)制),b HandlerFIQ 執(zhí)行跳轉(zhuǎn)指令到HandlerFIQ 標(biāo)號(hào)處, 展開(kāi)宏命令, 將$HandlerLabel HAN

9、DLER $HandleLabel 替換成HandlerFIQ HANDLER HandleFIQ。MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabelsub sp,sp,#4;減少sp(用于存放轉(zhuǎn)跳地址實(shí)質(zhì)上是在計(jì)算返回地址 stmfd sp!,r0 ;SP 先遞減,再將r0 壓棧ldr r0,=$HandleLabel;將HandleXXX 的標(biāo)號(hào)地址傳給r0ldr r0,r0 ;把HandleXXX 所指向的內(nèi)容(也就是中斷程序的入口放入r0 str r0,sp,#4 ;把中斷服務(wù)程序(ISR壓入棧.ldmfd sp!,r0,pc;用出

10、棧的方式恢復(fù)r0 的原值和為pc 設(shè)定新值(完成了到ISR 的轉(zhuǎn)跳MEND3.3、程序的入口地址初始化程序中必須指明入口地址,因?yàn)樘幚砥鲝?fù)位(仿真時(shí),裝載image)后PC 要找到入口開(kāi)始執(zhí)行代碼,當(dāng)各種異?;蚴侵袛喈a(chǎn)生的時(shí)候也要找到各個(gè)異常的入口開(kāi)始執(zhí)行代碼。從這里開(kāi)始就是真正的代碼入口了!AREA Init,CODE,READONLY ;這表明下面的是一個(gè)名為Init 的代碼段 ENTRY ;定義程序的入口(調(diào)試用ENTRY 只是定義一個(gè)普通的入口點(diǎn),且在程序中可以多處定義,如果要使用它作為整個(gè)映像文件的唯一入口點(diǎn),還需要設(shè)置鏈接器中的相關(guān)選項(xiàng)。ASSERT :DEF:ENDIAN_CHA

11、NGE ENDIAN_CHANGE ;如果已經(jīng)定義了ENDIAN_CHANGE,則判斷FALSEASSERT :DEF:ENTRY_BUS_WIDTH ;判斷ENTRY_BUS_WIDTH 是否已定義 ENTRY_BUS_WIDTH=32 ;若已經(jīng)定義了ENTRY_BUS_WIDTH,則判斷是否為32b ChangeBigEndian ;DCD 0xea000007 ENTRY_BUS_WIDTH=16andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00;也是b ChangeBigEndian 指令,;只是由于總線不一樣而取機(jī)器碼的順序不一樣 ENTRY_BUS_WI

12、DTH=8streq r0,r0,-r10,ror #1 ;DCD 0x070000ea,跟上面一條類(lèi)似 | ;如果沒(méi)有定義總線寬度,則跳轉(zhuǎn)到復(fù)位中斷b ResetHandlerASSERT 是斷言偽指令,語(yǔ)法是:ASSERT +邏輯表達(dá)式 ,def 是邏輯偽操作符,格式為: :DEF:label,作用是:判斷l(xiāng)abel 是否定義過(guò)。這段程序開(kāi)始使用了ASSERT 偽操作判斷ENDIAN_CHANGE 是否被定義,如果沒(méi)有被定義,ASSERT 偽操作將報(bào)告錯(cuò)誤類(lèi)型,并終止匯編。上面的四句指令能且只能執(zhí)行一句,并且前三句若執(zhí)行跳轉(zhuǎn)后處理程序的最后一句也是b ResetHandler?!?” 相當(dāng)

13、于 if ,“ | ”相當(dāng)于else,“ ” 相當(dāng)于endif。這里還要對(duì)大小端做一下解釋,因?yàn)锳RM 的一個(gè)寄存器占用4 個(gè)字節(jié),所以必須要設(shè)定數(shù)據(jù)存放的順序,平常的寫(xiě)10 進(jìn)制的習(xí)慣是高位放高字節(jié),地位放低字節(jié);這也是小端的存放方式。大端的方式是高字節(jié)放在低位,低字節(jié)放在高位。舉例來(lái)看:若將0xffffff 賦值給0x4c000000。Address 0 1 2 3 4 5 6 7 8 9 a b c d e f0x4c000000 FF FF FF 00 -這是小端表示0x4c000000 00 FF FF FF -這是大端表示3.4、看門(mén)狗及中斷的禁止上電和復(fù)位后,程序開(kāi)始從位于0x0

14、 執(zhí)行b ResetHandler 程序跳轉(zhuǎn)到這里執(zhí)行,將看門(mén)狗,中斷之類(lèi)的程序關(guān)掉,省得他們來(lái)打擾初始化程序的進(jìn)行。ResetHandlerldr r0,=WTCON ;禁止看門(mén)狗ldr r1,=0x0str r1,r0WTCON 為看門(mén)狗控制寄存器,此處將其寫(xiě)入0x0,就是禁止它的所有功能,包括定時(shí)器定時(shí),溢出中斷及溢出復(fù)位。ldr r0,=INTMSKldr r1,=0xffffffff ;all interrupt disablestr r1,r0ldr r0,=INTSUBMSKldr r1,=0x7fff ;all sub interrupt disablestr r1,r0INT

15、MSK 為中斷屏蔽寄存器,寫(xiě)入0xffffffff,就是禁止所有的中斷產(chǎn)生,因?yàn)橹袛嘞蛄勘磉€未初始化,如果此時(shí)產(chǎn)生中斷會(huì)使程序進(jìn)入未知的狀態(tài)而跑飛。因?yàn)橥庠O(shè)的中斷太多,INTMSK 不夠用,還需要INTSUBMSK 來(lái)將剩余的中斷源也禁止掉。3.5、系統(tǒng)時(shí)鐘初始化ldr r0,=LOCKTIME ;設(shè)置pll 鎖定時(shí)間ldr r1,=0xffffffff ;將0xffffffff 賦值給r1str r1,r0 ;將r1 寄存器的值保存到r0 指向的內(nèi)存中LOCKTIME 為PLL 鎖定時(shí)間計(jì)數(shù)寄存器,重新設(shè)定分頻值時(shí),PLL 進(jìn)入鎖定,輸出穩(wěn)定頻率的時(shí)鐘需要一定的時(shí)間。這里設(shè)置成默認(rèn)的值,以滿

16、足鎖定的要求。 PLL_ON_STARTldr r0,=CLKDIVN ;用于設(shè)定FCLK,HCLK,PCLK 的比例ldr r1,=CLKDIV_VAL ;CLKDIV_VAL 是在option.inc 里定義的,默認(rèn)為7str r1,r0 ;設(shè)置分頻數(shù)ldr r0,=UPLLCON ;設(shè)置UPLL 的輸出頻率ldr r1,=(U_MDIV<<12+(U_PDIV<<4+U_SDIV ;USB PLL CONFIG str r1,r0nop ;在UPP 設(shè)定之后,必須等待7 個(gè)時(shí)鐘的延遲,設(shè)定才會(huì)有效 nopnopnopnopnopnopldr r0,=MPLLCON

17、 ;設(shè)置主時(shí)鐘鎖相環(huán)寄存器ldr r1,=(M_MDIV<<12+(M_PDIV<<4+M_SDIV ;設(shè)置MPLL 的分頻系數(shù)str r1,r03.6、初始化內(nèi)存控制器初始化內(nèi)存控制器其實(shí)就是對(duì)S3C2440 的memory bank 進(jìn)行設(shè)置,使其擴(kuò)展的存儲(chǔ)器或外部設(shè)備能夠被處理器通過(guò)內(nèi)存控制器正確讀寫(xiě)。由于S3C2440 的最終應(yīng)用程序是在SDRAM(bank6)中運(yùn)行,并與C 語(yǔ)言變量等的用戶數(shù)據(jù),各種模式的堆棧,中斷向量表,都被定位在SDRAM 的空間,所以它必須在涉及這些處理之前完成初始化工作。SMRDATA DATADCD(0+(B1_BWSCON<<4+(B2_BWSCON<<8+(B3_BWSCON<<12+(B4_BWSCON<<16+(B5_BWSCON<<20+(B6_BWSCON<<24+(B7_BWSCON<<28 這段程序的開(kāi)始使用DATA 偽操作指明SMRDATA 標(biāo)號(hào)處作為一段數(shù)據(jù),而非代碼。接下來(lái)就用DCD 分配一個(gè)字的內(nèi)存單元,一共13 個(gè)字?jǐn)?shù)據(jù)。adrl r0, SMRDATAldr r1,=BWSCON ;BWSCON Address, 在2440addr.

溫馨提示

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

評(píng)論

0/150

提交評(píng)論