ARM 啟動代碼詳解_第1頁
ARM 啟動代碼詳解_第2頁
ARM 啟動代碼詳解_第3頁
ARM 啟動代碼詳解_第4頁
ARM 啟動代碼詳解_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、ARM 啟動代碼詳解(Vectors.c、Init.s、Target.c、 Target.h)2010-05-15 16:03啟動代碼是芯片片復(fù)位后進入入C語言的mmain()函函數(shù)前執(zhí)行的的一段代碼,主主要是為運行行C語言程序序提供基本運運行環(huán)境,如如初始化存儲儲器系統(tǒng)等。AARM公司只只設(shè)計內(nèi)核,不不自己生產(chǎn)芯芯片,只是把把內(nèi)核授權(quán)給給其它廠商,其其它廠商購買買了授權(quán)且加加入自己的外外設(shè)后生產(chǎn)出出各具特色的的芯片。這樣樣就促進了基基于ARM處處理器核的芯芯片多元化,但但也使得每一一種芯片的啟啟動代碼差別別很大,不易易編寫出統(tǒng)一一的啟動代碼碼。ADS(針針對ARM處處理器核的CC語言編譯器器

2、)的策略是是不提供完整整的啟動代碼碼,啟動代碼碼不足部分或或者由廠商提提供,或者自自己編寫。啟啟動代碼劃分分為4個文件件:Vecttors.cc、Initt.s、Taarget.c、 Taarget.h。Vecctors.c包含異常常向量表、堆堆棧初始化及及中斷服務(wù)程程序與C程序序的接口。IInit.ss包含統(tǒng)初始始化代碼,并并跳轉(zhuǎn)到ADDS提供的初初始化代碼。TTargett.c和 TTargett.h包含目目標板特殊的的代碼,包括括異常處理程程序和目標板板初始化程序序。這樣做的的目的是為了了盡量減少匯匯編代碼,同同時把不需要要修改的代碼碼獨立出來以以減少錯誤。 4.2.1 Vectoors

3、.c文文件的編寫4.2.1.1 中斷向向量表Vectorss LDR PPC, ReesetAdddr LDR PCC, UnddefineedAddrr LDR PPC, SWWI_Adddr LDR PPC, PrrefetcchAddrr LDR PPC, DaataAboortAdddr DCD 00 xb92005f80 LDR PPC, PPC, #-0 xff00 LDR PPC, FIIQ_AdddrResetAdddr DCCD ReseetUndefinnedAdddr DDCD UnddefineedSWI_Adddr DCDD SoftwwareInnterruuptP

4、refetcchAddrr DCCD PreffetchAAbortDataAboortAdddr DCCD DataaAborttnouse DCCD 0IRQ_Adddr DCDD IRQ_HHandleerFIQ_Adddr DCDD FIQ_HHandleer異常是由內(nèi)部或或外部源產(chǎn)生生的以引起處處理器處理的的一個事件。AARM處理器器核支持7種種類型的異常常。異常出現(xiàn)現(xiàn)后,CPUU強制從異常常類型對應(yīng)的的固定存儲地地址開始執(zhí)行行程序。這個個固定的地址址就是異常向向量。向量從從上到下依次次為復(fù)位、未未定義指令異異常、軟件中中斷、預(yù)取指指令中止、預(yù)預(yù)取數(shù)據(jù)中止止、保留的異異常、IRQQ和

5、 FIQQ。IRQ向向量“LDRR PCC, PCC, #-00 xff0” 使用的的指令與其它它向量不同。在在正常情況下下這條指令所所在地址為00X000000018。當當CPU執(zhí)行行這條指令但但還沒有跳轉(zhuǎn)轉(zhuǎn)時,PC的的值為0X0000000020,0XX000000020減去去 0X000000FFF0為 0XXFFFFFF030,這這是向量中斷斷控制器(VVIC)的特特殊寄存器VVICVecctAddrr。這個寄存存器保存當前前將要服務(wù)的的IRQ的中中斷服務(wù)程序序的入口,用用這一條指令令就可以直接接跳轉(zhuǎn)到需要要的中斷服務(wù)務(wù)程序中。至至于在保留的的異常向量“DDCD 0 xxb92055f

6、80”位位置填數(shù)據(jù)00 xb92005f8是為為了使向量表表中所有的數(shù)數(shù)據(jù)32位累累加和為0。4.2.1.2 初始化化CPU堆棧棧InitStaack MOV RR0, LRR MSR CCPSR_cc, #0 xxd2 ;設(shè)設(shè)置中斷模式式堆棧 LDR SSP, SttackIrrq MSR CCPSR_cc, #0 xxd1 ;設(shè)設(shè)置快速中斷斷模式堆棧 LDR SSP, SttackFiiq MSR CCPSR_cc, #0 xxd7 ;設(shè)設(shè)置中止模式式堆棧 LDR SSP, SttackAbbt MSR CCPSR_cc, #0 xxdb ;設(shè)設(shè)置未定義模模式堆棧 LDR SSP, Stt

7、ackUnnd MSR CCPSR_cc, #0 xxdf ;設(shè)設(shè)置系統(tǒng)模式式堆棧 LDR SSP, SttackSyys MOV PPC, R00StackIrrq DDCD (IrrqStacckSpacce + IIRQ_STTACK_LLEGTH * 4 - 4)StackFiiq DDCD (FiiqStacckSpacce + FFIQ_STTACK_LLEGTH * 4 - 4)StackAbbt DCD (AAbtStaackSpaace + ABT_SSTACK_LEGTHH * 4 - 4)StackUnnd DCDD (UndttStackkSpacee + UNND_S

8、TAACK_LEEGTH * 4 - 4)StackSyys DCD (SyysStacckSpacce + SSYS_STTACK_LLEGTH * 4 -4 );/* 分配堆堆棧空間 */ AREAA MMyStaccks, DDATA, NOINIITIrqStacckSpacce SSPACE IRQ_SSTACK_LEGTHH * 4 ;中斷模式式堆棧FiqStacckSpacce SSPACE FIQ_SSTACK_LEGTHH * 4 ;快速中斷斷模式堆棧AbtStacckSpacce SSPACE ABT_SSTACK_LEGTHH * 4 ;中止義模模式堆棧UndtStaac

9、kSpaace SPPACE UUND_STTACK_LLEGTH * 4 ;未定義模式式堆棧SysStacckSpacce SSPACE SYS_SSTACK_LEGTHH * 4 ; 系統(tǒng)模模式堆棧因為程序需要切切換模式,而而且程序退出出時CPU的的模式已經(jīng)不不再是管理模模式而是系統(tǒng)統(tǒng)模式LR已已經(jīng)不再保存存返回程序地地址,所以程程序首先把返返回地址保存存到 R0中中,同時使用用R0返回。然然后程序把處處理器模式轉(zhuǎn)轉(zhuǎn)化為IRQQ模式,并設(shè)設(shè)置IRQ模模式的堆棧指指針。其中變變量Staccklrq保保存著IRQQ模式的堆棧棧指針的初始始值,Irqqstackkspacee是分配給 IRQ模式

10、式的堆??臻g間的開始地址址,IRQ_STACKK_LEGTTH是用戶定定義的常量,用用于設(shè)置 IIRQ模式的的堆??臻g的的大小。程序序使用同樣的的方法設(shè)置FFIQ模式堆堆棧指針、中中止模式堆棧棧指針、未定定義堆棧指針針和系統(tǒng)模式式堆棧指針。程序使用編譯器器分配的空間間作為堆棧,而而不是按照通通常的做法把把堆棧分配到到 RAM的的頂端,之所所以這樣是因因為這樣做不不必知道RAAM頂端位置置,移植更加加方便;編譯譯器給出的占占用RAM空空間的大小就就是實際占用用的大小,便便于控制RAAM的分配。對對于 LPCC2106來來說,中止模模式是不需要要分配堆棧空空間的,這是是因為 LPPC21066沒有

11、外部總總線,也沒有有虛擬內(nèi)存機機制,如果出出現(xiàn)取數(shù)據(jù)中中止或取指令令中止肯定是是程序有問題題。而一般情情況下也不需需要模擬協(xié)處處理器指令或或擴充指令,未未定義中止也也就意味著程程序有錯誤,也也不需要分配配堆棧空間。4.2.1.3 異異常處理代碼碼與C語言的的接口程序C/OS-中斷服務(wù)子子程序流程圖圖如圖4-11所示:圖4-1 中斷斷服務(wù)子程序序流程圖異常處理代碼與與C語言的接接口程序如下下:MACRO$IRQ_Laabel HHANDLEER $IRRQ_Excceptioon EXPOORT $IIRQ_Laabel ;輸出的標標號 IMPOORT $IIRQ_Exxceptiion ;引用

12、的外外部標號$IRQ_Laabel SUB LLR, LRR, #4 ;計計算返回地址址 STMFFD SSP!, R0-R33, R122, LR ;保存存任務(wù)環(huán)境 MRS RR3, SPPSR ;保存狀狀態(tài) STMFFD SSP!, R3 LDR RR2, =OOSIntNNestinng ;OSInntNestting+ LDRBB RR1, RR2 ADD RR1, R11, #1 STRBB RR1, RR2 BL $IRQ_EExcepttion ;調(diào)調(diào)用c語言的的中斷處理程程序 MSR CPPSR_c, #0 x992 ;關(guān)關(guān)中斷 BL OOSIntEExit LDR RR0,

13、=OOSTCBHHighRddy LDR RR0, RR0 LDR RR1, =OOSTCBCCur LDR RR1, RR1 CMP RR0, R11 LDMFFD SSP!, R3 MSR SSPSR_ccxsf, R3 LDMEEQFD SSP!, R0-R33, R122, PC ;不進行行任務(wù)切換 LDR PPC, =OOSIntCCtxSw ;進行任任務(wù)切換 MENNDUndefinned ;未定義指指令 b UUndefiinedPrefetcchAborrt ;取指令令中止 b PPrefettchAboortDataAboort ;取數(shù)據(jù)中中止 b DDataAbbortIR

14、Q_Hanndler HANDLLER IRRQ_Excceptioon ;中斷FIQ_Hanndler ;快速中斷斷 b FFIQ_HaandlerrTimer0_Handller HAANDLERR Timeer0 ;定時器器0中斷未定義指令異常常、取指令中中止異常、取取數(shù)據(jù)中止異異常均是死循循環(huán),其中原原因在上一小小節(jié)已經(jīng)說明明。而快速中中斷在本應(yīng)用用中并未使用用,所以也設(shè)設(shè)置為死循環(huán)環(huán)。LPC22106使用用向量中斷控控制器,各個個 IRQ中中斷的人口不不一樣,所以以使用了一個個宏來簡化中中斷服務(wù)程序序與C語言的的接口編寫。由由ARM處理理器核的文檔檔可知,處理理器進入IRRQ中斷服務(wù)

15、務(wù)程序時(LLR4)的的值為中斷返返回地址,為為了使任務(wù)無無論在主動放放棄CPU時時還是中斷時時堆棧結(jié)構(gòu)都都一樣,在這這里先把LRR減4。其它它的部分與C/OS-要求的基基本一致。AARM處理核核在進入中斷斷服務(wù)程序時時處理器模式式變?yōu)镮RQQ模式,與任任務(wù)的模式不不同,它們的的堆棧指針SSP也不一樣樣,而寄存器器應(yīng)當保存到到用戶的堆棧棧中,為了減減少不必要的的CPU時間間和RAM空空間的浪費,本本移植僅在必必要時將處理理器的寄存器器保存到用戶戶的堆棧中,其其它時候還是是保存到IRRQ模式的堆堆棧中。同時時,從編譯器器的函數(shù)調(diào)用用規(guī)范可知,CC語言函數(shù)返返回時,寄存存器R4RR11、SPP不會

16、改變,所所以只需要保保存CPSRR、R0RR3、R122和返回地址址LR,在后后面保存 CCPSR是為為了必要時將將寄存器保存存到用戶堆棧棧比較方便。在異常處理代碼碼與C語言的的接口程序中中沒有與中斷斷服務(wù)子程序序流程圖中的的判斷語句對對應(yīng)的語句。判判斷語句是為為了避免在函函數(shù)OSInntCtxssw()調(diào)整整堆棧指針,這這個調(diào)整量是是與編譯器、編編譯器選項、C/OS -配置選選項都相關(guān)的的變量。在這這里進行這些些處理相對其其它處理器結(jié)結(jié)構(gòu)可能增加加的處理器時時間很少,但但對于ARMM來說,由于于中斷(IRRQ)有獨立立的堆棧,在在這里這樣做做就需要把所所有寄存器從從中斷的堆棧??截惖饺蝿?wù)務(wù)的

17、堆棧,需需要花費比較較多的額外時時間。而變量量OSInttNestiing為0時時,并不一定定會進行任務(wù)務(wù)切換,所以以本移植沒有有與之對應(yīng)的的程序,而在在函數(shù)OSIIntCtxxsw()中中做這一項工工作。這樣,僅僅在需要時才才處理這些事事物,程序效效率得以提高高。在中斷調(diào)用后,如如果需要任務(wù)務(wù)切換,則變變量OSTCCBHighhRdy和變變量OSTCCBCur的的值不同;如如果不需要任任務(wù)切換這兩兩個變量則相相同。本移植植通過判斷這這兩個變量來來決定是進行行任務(wù)切換,還還是不進行任任務(wù)切換。通通過比較,如如果需要任務(wù)務(wù)切換則執(zhí)行行“LDR PC, =OSInttCtxSww”跳轉(zhuǎn)到OOSIn

18、tCCtxSw處處進行任務(wù)切切換;如果不不需要任務(wù)切切換則執(zhí)行“LLDMEQFFD SP!, R00-R3, R12, PC”中中斷返回。這里需要對“MMSR CPSRR_c, #0 x92”說說明下,這條條指令的作用用是關(guān)IRQQ中斷。因為為中斷(IRRQ)模式的的LR寄存器器在處理器響響應(yīng)中斷時用用于保存中斷斷返回地址,所所以在處理器器響應(yīng)中斷時時中斷(IRRQ)模式的的LR寄存器器不能保存有有效數(shù)據(jù)。而而BL指令要要用LR寄存存器保存BLL下一條指令令的位置,所所以在中斷(IIRQ)模式式時,在BLL指令之前必必須關(guān)中斷,在在保存LR后后才能開中斷斷。4.2.2 Targeet.c文件件

19、的編寫為了使系統(tǒng)基本本能夠工作,必必須在進人 main()函函數(shù)前對系統(tǒng)統(tǒng)進行一些基基本的初始化化工作,這些些工作由函數(shù)數(shù)TargeetReseetInitt()完成。void TaargetRResetIInit(vvoid) uinnt32 ii; uinnt32 *cp1; uinnt32 *cp2; exttern vvoid VVectorrs(voiid) ; /* 拷貝向量表表,保證在fflash和和ram中程程序均可正確確運行 */ cp11 = (uuint322 *)Veectorss; cp22 = (uuint322 *)0 xx400000000; forr (i =

20、 0; ii 2 * 8; i+) *cp22+ = *cp1+; MEMMMAP = 0 x2;PINSEL00 = (PPINSELL0 & 00 xFFFFF0000) | UAART0_PPCB_PIINSEL_CFG | 0 x500;PLLCON = 1; /* 設(shè)設(shè)置系統(tǒng)各部部分時鐘 */ VPBDDIV = 0; PLLCCFG =00 x23; PLLFFEED = 0 xaaa; PLLFFEED = 0 x555; whille(PLLLSTATT & (11 110) = = 0) ; PLLCCON = 3; PLLLFEED = 0 xaaa; PLLLFEED =

21、 0 x555; MAMMCR = 2; /* 設(shè)置置存儲器加速速模塊 */#if Fccclk 200000000 MAMMTIM = 1;#else#if Fccclk 400000000 MAMMTIM = 2;#else MAMMTIM = 3;#endif#endif首先向量表拷貝貝到RAM底底部,加上這這部分是為了了代碼無論從從Flashh基地址開始始編譯還是從從RAM基地地址開始編譯譯程序均運行行正確。而把把RAM底部部映射到向量量表“MEMMMAP = 0 x2”也也是為了同一一個目的。至至于復(fù)制166個字而不是是8個字,是是因為后8個個字存儲跳轉(zhuǎn)轉(zhuǎn)的地址是通通過 PC指指針間

22、接尋址址的,它們與與對應(yīng)指令(在在向量表中)相相對位置是不不能變化的。因為在進入多任任務(wù)環(huán)境前使使用了一些外外設(shè),部分外外設(shè)使用了芯芯片的引腳,而而 LPC22106的所所有引腳都是是多功能的,所所以需要設(shè)置置引腳功能。同同時串口也進進行了設(shè)置。時時鐘是芯片各各部分正常工工作的基礎(chǔ),雖雖然時鐘可以以在任何時候候設(shè)置,但為為了避免混亂亂,最好在進進入 maiin()函數(shù)數(shù)前設(shè)置。程程序首先使能能PLL但不不連接PLLL,然后設(shè)置置外設(shè)時鐘(VVPB時鐘ppclk)與與系統(tǒng)時鐘(ccclk)的的分頻比。接接著設(shè)置PLLL的乘因子子和除因子。設(shè)設(shè)置完成后,使使用“PLLLFEED = 0 xaaa;

23、 PLLLFEEDD = 0 xx55;”的的訪問序列把把數(shù)據(jù)正確寫寫人硬件,并并等待PLLL跟蹤完成。最最后,使能PPLL,并使使PLL聯(lián)上上系統(tǒng)。本應(yīng)應(yīng)用外接的晶晶振頻率(FFosc)為為11.05592MHzz,倍增器的的值M=4,所所以處理器時時鐘(Fccclk)為444.23668 MHzz。為了使電電流控制振蕩蕩器頻率(FFcco)滿滿足156-320MHHz,所以分分頻器的值PP=2,使得得Fcco= Fccllk2PP=176.9472 MHz。取取VPB分頻頻器的分頻值值為1/4,所所以外設(shè)時鐘鐘(Fpcllk)= FFcclk/4=11.0592 MHz,則則記數(shù)周期為為0.090042s,定定時0.2mms,則記數(shù)數(shù)值為22112個,這些些時鐘的定義義都在connfig.hh文件中。用戶程序最終是是要在Flaash中運行行的,而系統(tǒng)統(tǒng)復(fù)位時Fllash是以以最低速度運運行,這對發(fā)發(fā)揮芯片的性性能極其不利利。雖然存儲儲器加速模塊塊可以在任何何時候設(shè)置,但但為了避免混混亂,最好在在進入 maain()函函數(shù)前設(shè)置。首首先使存儲器器加速模塊全全速工作,然然后根據(jù)系統(tǒng)統(tǒng)主時鐘利用用條件編譯將將Flashh的訪問時鐘鐘設(shè)置到合適適的值。4.2.3 Init.s文件的編編寫由于LPC21106微控制制器的存儲系系統(tǒng)比較簡

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論