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

下載本文檔

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

文檔簡介

1、§ 4.2.1.1 中斷向量表VectorsLDRLDRLDRLDRLDRDCDLDRLDRResetAddrUnde巾nedAddrSWI_AddrPrefetchAddrDCDPrefetchAbortARM啟動代碼詳解(Vectors.c、Init.s 、Target.c、Target.h ) 2010-05-15 16:03啟動代碼是芯片復(fù)位后進入 C語言的main ()函數(shù)前執(zhí)行的一段代碼,主要是 為運行C語言程序提供基本運行環(huán)境,如初始化存儲器系統(tǒng)等。AR泌司只設(shè)計核,不自己生產(chǎn)芯片,只是把核授權(quán)給其它廠商,其它廠商購買了授權(quán)且加入自 己的外設(shè)后生產(chǎn)出各具特色的芯片。這樣

2、就促進了基于ARMt理器核的芯片多元 化,但也使得每一種芯片的啟動代碼差別很大,不易編寫出統(tǒng)一的啟動代碼。ADS(針對ARMt理器核的C語言編譯器)的策略是不提供完整的啟動代碼,啟動代 碼不足部分或者由廠商提供,或者自己編寫。啟動代碼劃分為4個文件:Vectors.c、Init.s 、Target.c、Target.h 。Vectors.c 包含異常向量表、堆棧 初始化及中斷服務(wù)程序與C程序的接口。Init.s 包含統(tǒng)初始化代碼,并跳轉(zhuǎn)到 ADSB1供的初始化代碼。Target.c和Target.h包含目標板特殊的代碼,包括異 常處理程序和目標板初始化程序。這樣做的目的是為了盡量減少匯編代碼,

3、同時把不需要修改的代碼獨立出來以減少錯誤。§ 4.2. 1 Vectors.c 文件的編寫PC, ResetAddrPC, UndefinedAddrPC, SWI_AddrPC, PrefetchAddrPC, DataAbortAddr0xb9205f80PC, PC, #-0xff0PC, FIQ_AddrDCDResetDCDUndefinedDCDSoftwareInterruptDataAbortAddrDCDDataAbortnouseDCDIRQAddrDCDIRQHandlerFIQAddrDCDFIQHandler異常是由部或外部源產(chǎn)生的以引起處理器處理的一個事件

4、。ARMt理器核支持7種類型的異常。異常出現(xiàn)后,CPU雖制從異常類型對應(yīng)的固定存儲地址開始 執(zhí)行程序。這個固定的地址就是異常向量。向量從上到下依次為復(fù)位、未定義指 令異常、軟件中斷、預(yù)取指令中止、預(yù)取數(shù)據(jù)中止、保留的異常、 IRQ和FIQ 0 IRQ向量“LDR PC, PC, #-0xff0” 使用的指令與其它向量不同。在正常情況下這條指令所在地址為0X00000018當CPLM行這條指令但還沒有跳轉(zhuǎn)時, PC的值為 0X00000020, 0X00000020減去 0X00000FF0 為 0XFFFFF030 這是向量 中斷控制器(VIC)的特殊寄存器VICVectAddr。這個寄存器保

5、存當前將要服務(wù) 的IRQ的中斷服務(wù)程序的入口,用這一條指令就可以直接跳轉(zhuǎn)到需要的中斷服務(wù) 程序中。至于在保留的異常向量“ DCD0xb9205f80”位置填數(shù)據(jù)0xb9205f8是為 了使向量表中所有的數(shù)據(jù)32位累加和為00§421.2 初始化CPU!棧InitStackMOVR0, LRMSRCPSR_c, #0xd2 ;設(shè)置中斷模式堆棧LDRSP, StackIrqMSRCPSR_c, #0xd1 ;設(shè)置快速中斷模式堆棧LDRSP, StackFiqMSRCPSR_c, #0xd7 ;設(shè)置中止模式堆棧LDRSP, StackAbtMSRCPSR_c, #0xdb ;設(shè)置未定義模式

6、堆棧LDRSP, StackUndMSRCPSR_c, #0xdf ;設(shè)置系統(tǒng)模式堆棧LDRSP, StackSysStackIrq DCDStackFiq DCDStackAbt DCDMOVPC, R0(IrqStackSpace + IRQ_STACK_LEGTH * 4 - 4) (FiqStackSpace + FIQ_STACK_LEGTH * 4 - 4) (AbtStackSpace + ABT_STACK_LEGT H - 4)StackUnd DCD(UndtStackSpace + UND_STACK_LEGTH * 4 - 4)StackSys DCD (SysStac

7、kSpace + SYS_STACK_LEGTH * 4 -4 );/*分配堆棧空間*/AREA MyStacks, DATA, NOINITIrqStackSpace SPACE IRQ_STACK_LEGTH * 4中斷模式堆棧FiqStackSpaceSPACE FIQ_STACK_LEGTH * 4快速中斷模式堆棧AbtStackSpaceSPACE ABT_STACK_LEGTH * 4中止義模式堆棧UndtStackSpace SPACE UND_STACK_LEGTH * 你定義模式堆棧SysStackSpaceSPACE SYS_STACK_LEGTH * 4 系統(tǒng)模式堆棧因為

8、程序需要切換模式,而且程序退出時CPU的模式已經(jīng)不再是管理模式而 是系統(tǒng)模式LR已經(jīng)不再保存返回程序地址,所以程序首先把返回地址保存到 R0 中,同時使用R0返回。然后程序把處理器模式轉(zhuǎn)化為IRQ模式,并設(shè)置IRQ模 式的堆棧指針。其中變量Stacklrq保存著IRQ模式的堆棧指針的初始值, Irqstackspace 是分配給IRQ模式的堆??臻g的開始地址,IRQ_STACK_LEGTH 用戶定義的常量,用于設(shè)置IRQ模式的堆棧空間的大小。程序使而同樣的方法 設(shè)置FIQ模式堆棧指針、中止模式堆棧指針、未定義堆棧指針和系統(tǒng)模式堆棧指 針。程序使用編譯器分配的空間作為堆棧,而不是按照通常的做法把

9、堆棧分配到 RAM勺頂端,之所以這樣是因為這樣做不必知道 RAMK端位置,移植更加方便; 編譯器給出的占用RAMS句的大小就是實際占用的大小,便于控制 RAM勺分配。 對于LPC2106來說,中止模式是不需要分配堆棧空間的,這是因為LPC2106沒有外部總線,也沒有虛擬存機制,如果出現(xiàn)取數(shù)據(jù)中止或取指令中止肯定是程序 有問題。而一般情況下也不需要模擬協(xié)處理器指令或擴充指令,未定義中止也就意味著程序有錯誤,也不需要分配堆??臻g。§ 4.2,1.3異常處理代碼與C語言的接口程序C C/OS n中斷服務(wù)子程序流程圖如圖4-1所示:51kaiFa+com工返回)圖4-1中斷服務(wù)子程序流程圖異

10、常處理代碼與C語言的接口程序如下:MACRO$IRQ_Label HANDLER $IRQ_ExceptionEXPORT$IRQ Label;輸出的標號IMPORT$IRQ_Exception;引用的外部標號#4$IRQ LabelSUBLR, LR,;計算返回地址STMFD SP!, R0-R3, R12,PC,LR);保存任務(wù)環(huán)境SPSRMRSR3,;保存狀態(tài)STMFDSP!, R3=OSIntNestingLDRR2,;OSIntNesting+LDRBR1, R2ADDR1, R1, #1STRBR1, R2BL用c語百的中斷處理程序$IRQ_Exception;調(diào)中斷MSRCPSR

11、_c, #0x92;關(guān)BLOSIntExitLDRR0, =OSTCBHighRdyLDRR0, R0LDRR1, =OSTCBCurLDRR1, R1CMPR0, R1LDMFDSP!, R3MSRSPSR_cxsf, R3LDMEQFD SP!, R0-R3, R12, PCA;不進行任務(wù)切換LDR;進行任務(wù)切換=OSIntCtxSwMENDUndefined;未定義指令bUndefinedPrefetchAbort;取指令中止bPrefetchAbortDataAbort;取數(shù)據(jù)中止bDataAbortIRQ_HandlerHANDLERRQ_Exception;中斷FIQ_Handle

12、r;快速中斷bFIQ_HandlerTimer0_Handler HANDLER Timer。;定時器 0中斷未定義指令異常、取指令中止異常、取數(shù)據(jù)中止異常均是死循環(huán),其中原因 在上一小節(jié)已經(jīng)說明。而快速中斷在本應(yīng)用中并未使用,所以也設(shè)置為死循環(huán)。 LPC210瞅用向量中斷控制器,各個IRQ中斷的人口不一樣,所以使用了一個宏 來簡化中斷服務(wù)程序與C語言的接口編寫。由ARMt理器核的文檔可知,處理器 進入IRQ中斷服務(wù)程序時(LR 4)的值為中斷返回地址,為了使任務(wù)無論在主 動放棄CPLM還是中斷時堆棧結(jié)構(gòu)都一樣,在這里先把 LR減4。其它的部分與 叱C/OS n要求的基本一致。ARMfct理核

13、在進入中斷服務(wù)程序時處理器模式變?yōu)?IRQ模式,與任務(wù)的模式不同,它們的堆棧指針SP也不一樣,而寄存器應(yīng)當保存到用戶的堆棧中,為了減少不必要的CPU寸間和RAMS句的浪費,本移植僅在 必要時將處理器的寄存器保存到用戶的堆棧中,其它時候還是保存到IRQ模式的堆棧中。同時,從編譯器的函數(shù)調(diào)用規(guī)可知,C語言函數(shù)返回時,寄存器R4-R11、 SP不會改變,所以只需要保存CPSRR0- R3 R12和返回地址LR,在后面保存CPSR 是為了必要時將寄存器保存到用戶堆棧比較方便。在異常處理代碼與C語言的接口程序中沒有與中斷服務(wù)子程序流程圖中的 判斷語句對應(yīng)的語句。判斷語句是為了避免在函數(shù)OSIntCtxs

14、w ()調(diào)整堆棧指針,這個調(diào)整量是與編譯器、編譯器選項、C C/OS - II配置選項都相關(guān)的變量 在這里進行這些處理相對其它處理器結(jié)構(gòu)可能增加的處理器時間很少,但對于 AR豚說,由于中斷(IRQ)有獨立的堆棧,在這里這樣做就需要把所有寄存器 從中斷的堆??截惖饺蝿?wù)的堆棧,需要花費比較多的額外時間。而變量 OSIntNesting為0時,并不一定會進行任務(wù)切換,所以本移植沒有與之對應(yīng)的 程序,而在函數(shù)OSIntCtxsw ()中做這一項工作。這樣,僅在需要時才處理這 些事物,程序效率得以提高。在中斷調(diào)用后,如果需要任務(wù)切換,則變量 OSTCBHighRdy變量OSTCBCur 的值不同;如果不

15、需要任務(wù)切換這兩個變量則相同。 本移植通過判斷這兩個變量 來決定是進行任務(wù)切換,還是不進行任務(wù)切換。通過比較,如果需要任務(wù)切換則 執(zhí)行“LDRPC, =OSIntCtxSw”跳*到OSIntCtxSw處進行任務(wù)切換;如果不需要 任務(wù)切換則執(zhí)行“ LDMEQFD SP!, R0R3, R12, PCA”中斷返回。這里需要對“ MSRCPSR_c,#0x92”說明下,這條指令的作用是關(guān)IRQ中斷。因為中斷(IRQ)模式的LR寄石器在處理器響應(yīng)中斷時用于保存中斷返回 地址,所以在處理器響應(yīng)中斷時中斷(IRQ)模式的LR寄存器不能保存有效數(shù)據(jù)。 而BL指令要用LR寄存器保存BL下一條指令的位置,所以在

16、中斷(IRQ)模式時, 在BL指令之前必須關(guān)中斷,在保存 LR后才能開中斷。§ 4.2.2 Target.c 文件的編寫為了使系統(tǒng)基本能夠工作,必須在進人main ()函數(shù)前對系統(tǒng)進行一些基本的初始化工作,這些工作由函數(shù) TargetResetInit ()完成。void TargetResetInit(void)uint32 i ;uint32 *cp1;uint32 *cp2;extern void Vectors(void) ;/* 拷貝向量表,保證在flash和ram中程序均可正確運行*/cp1 = (uint32 *)Vectors ;cp2 = (uint32 *)0x4

17、0000000;for (i = 0; i < 2 * 8; i+)*cp2+ = *cp1+ ;)MEMMAP = 0x2PINSEL0 = (PINSEL0 & 0xFFFF0000) | UART0_PCB_PINSEL_CFG | 0x50;PLLCO悖1;/*設(shè)置系統(tǒng)各部分時鐘*/VPBDIV = 0 ;PLLCFG =0x23;PLLFEED = 0xaa;PLLFEED = 0x55;while(PLLSTAT & (1 << 10) = = 0);PLLCON = 3;PLLFEED = 0xaa;PLLFEED = 0x55MAMCR = 2

18、/*設(shè)置存儲器加速模塊*/#if Fcclk < 20000000MAMTIM = 1;#else#if Fcclk < 40000000MAMTIM = 2#elseMAMTIM = 3;#endif#endif首先向量表拷貝到RA既部,加上這部分是為了代碼無論從 Flash基地址開 始編譯還是從RAM1地址開始編譯程序均運行正確。而把RAMK部映射到向量表 “MEMMAP = 0X2也是為了同一個目的。至于復(fù)制 16個字而不是8個字,是因 為后8個字存儲跳轉(zhuǎn)的地址是通過 PC指針間接尋址的,它們與對應(yīng)指令(在向 量表中)相對位置是不能變化的。因為在進入多任務(wù)環(huán)境前使用了一些外設(shè)

19、,部分外設(shè)使用了芯片的引腳,而LPC2106勺所有引腳都是多功能的,所以需要設(shè)置引腳功能。同時用口也進行了 設(shè)置。時鐘是芯片各部分正常工作的基礎(chǔ),雖然時鐘可以在任何時候設(shè)置,但為 了避免混亂,最好在進入main ()函數(shù)前設(shè)置。程序首先使能PLL但不連接PLL, 然后設(shè)置外設(shè)時鐘(VPB寸鐘pclk )與系統(tǒng)時鐘(cclk )的分頻比。接著設(shè)置 PLL的乘因子和除因子。設(shè)置完成后,使用“PLLFEE# 0xaa; PLLFEE修0x55;” 的訪問序列把數(shù)據(jù)正確寫人硬件,并等待 PLL跟蹤完成。最后,使能PLL,并使 PLL聯(lián)上系統(tǒng)。本應(yīng)用外接的晶振頻率(Fosc)為11.0592MHz倍增器的值M=4 所以處理器時鐘(Fcclk )為44.2368 MHz為了使電流控制振蕩器頻率(Fcco) 滿足 156-320MHz 所以分頻器的值 P=2,使得 Fcco= Fccl

溫馨提示

  • 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

提交評論