




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ARM 啟啟動(dòng)代碼詳詳解(Veectorrs.c、Initt.s、TTargeet.c、 Tarrget.h)2010-05-115 166:03啟動(dòng)代碼是是芯片復(fù)位位后進(jìn)入CC語言的mmain()函函數(shù)前執(zhí)行行的一段代代碼,主要要是為運(yùn)行行C語言程程序提供基基本運(yùn)行環(huán)環(huán)境,如初初始化存儲(chǔ)儲(chǔ)器系統(tǒng)等等。ARMM公司只設(shè)設(shè)計(jì)內(nèi)核,不不自己生產(chǎn)產(chǎn)芯片,只只是把內(nèi)核核授權(quán)給其其它廠商,其其它廠商購購買了授權(quán)權(quán)且加入自自己的外設(shè)設(shè)后生產(chǎn)出出各具特色色的芯片。這樣就促促進(jìn)了基于于ARM處處理器核的的芯片多元元化,但也也使得每一一種芯片的的啟動(dòng)代碼碼差別很大大,不易編編寫出統(tǒng)一一的啟動(dòng)代代碼。ADDS(針
2、對(duì)對(duì)ARM處處理器核的的C語言編編譯器)的的策略是不不提供完整整的啟動(dòng)代代碼,啟動(dòng)動(dòng)代碼不足足部分或者者由廠商提提供,或者者自己編寫寫。啟動(dòng)代代碼劃分為為4個(gè)文件件:Vecctorss.c、IInit.s、Taargett.c、 Targget.hh。Vecctorss.c包含含異常向量量表、堆棧棧初始化及及中斷服務(wù)務(wù)程序與CC程序的接接口。Innit.ss包含統(tǒng)初初始化代碼碼,并跳轉(zhuǎn)轉(zhuǎn)到ADSS提供的初初始化代碼碼。Tarrget.c和 TTargeet.h包包含目標(biāo)板板特殊的代代碼,包括括異常處理理程序和目目標(biāo)板初始始化程序。這樣做的的目的是為為了盡量減減少匯編代代碼,同時(shí)時(shí)把不需要要修改
3、的代代碼獨(dú)立出出來以減少少錯(cuò)誤。 4.2.1 Veectorrs.c文文件的編寫寫4.2.1.1 中斷向量量表Vectoors LLDR PPC, RResettAddrr LLDR PCC, UnndefiinedAAddr LLDR PPC, SSWI_AAddr LLDR PPC, PPrefeetchAAddr LLDR PPC, DDataAAborttAddrr DDCD 00 xb92205f880 LLDR PPC, PC, #-0 xxff0 LLDR PPC, FFIQ_AAddrResettAddrr DDCD RResettUndeffineddAddrr DCD Un
4、deefineedSWI_AAddr DCCD SooftwaareInnterrruptPrefeetchAAddr DDCD PPrefeetchAAborttDataAAborttAddrr DDCD DDataAAborttnousee DDCD 00IRQ_AAddr DCCD IRRQ_HaandleerFIQ_AAddr DCCD FIIQ_Haandleer異常是由內(nèi)內(nèi)部或外部部源產(chǎn)生的的以引起處處理器處理理的一個(gè)事事件。ARRM處理器器核支持77種類型的的異常。異異常出現(xiàn)后后,CPUU強(qiáng)制從異異常類型對(duì)對(duì)應(yīng)的固定定存儲(chǔ)地址址開始執(zhí)行行程序。這這個(gè)固定的的地址就是是異常向量量。
5、向量從從上到下依依次為復(fù)位位、未定義義指令異常常、軟件中中斷、預(yù)取取指令中止止、預(yù)取數(shù)數(shù)據(jù)中止、保留的異異常、IRRQ和 FFIQ。IIRQ向量量“LDRR PPC, PC, #-0 xxff0” 使用用的指令與與其它向量量不同。在在正常情況況下這條指指令所在地地址為0XX0000000188。當(dāng)CPPU執(zhí)行這這條指令但但還沒有跳跳轉(zhuǎn)時(shí),PPC的值為為0X0000000020,00X0000000220減去 0X000000FFF0為 0XFFFFFF0030,這這是向量中中斷控制器器(VICC)的特殊殊寄存器VVICVeectAdddr。這這個(gè)寄存器器保存當(dāng)前前將要服務(wù)務(wù)的IRQQ的中斷服服
6、務(wù)程序的的入口,用用這一條指指令就可以以直接跳轉(zhuǎn)轉(zhuǎn)到需要的的中斷服務(wù)務(wù)程序中。至于在保保留的異常常向量“DDCD 00 xb92205f880”位置置填數(shù)據(jù)00 xb92205f88是為了使使向量表中中所有的數(shù)數(shù)據(jù)32位位累加和為為0。4.2.1.2 初始化CCPU堆棧棧InitSStackk MMOV RR0, LLR MMSR CCPSR_c, #0 xd22 ;設(shè)置置中斷模式式堆棧 LLDR SSP, SStackkIrq MMSR CCPSR_c, #0 xd11 ;設(shè)置置快速中斷斷模式堆棧棧 LLDR SSP, SStackkFiq MMSR CCPSR_c, #0 xd77 ;設(shè)置
7、置中止模式式堆棧 LLDR SSP, SStackkAbt MMSR CCPSR_c, #0 xdbb ;設(shè)置置未定義模模式堆棧 LLDR SSP, SStackkUnd MMSR CCPSR_c, #0 xdff ;設(shè)置置系統(tǒng)模式式堆棧 LLDR SSP, SStackkSys MMOV PPC, RR0StackkIrq DCCD (IIrqSttackSSpacee + IIRQ_SSTACKK_LEGGTH * 4 - 4)StackkFiq DCCD (FFiqSttackSSpacee + FFIQ_SSTACKK_LEGGTH * 4 - 4)StackkAbt DDCD (Ab
8、tSStackkSpacce + ABT_STACCK_LEEGTH * 4 - 4)StackkUnd DCD (UnddtStaackSppace + UNND_STTACK_LEGTTH * 4 - 4)StackkSys DDCD (SSysSttackSSpacee + SSYS_SSTACKK_LEGGTH * 4 -4 );/* 分分配堆??湛臻g */ AAREA MMyStaacks, DATTA, NNOINIITIrqSttackSSpacee SSPACEE IRQQ_STAACK_LLEGTHH * 44 ;中斷斷模式堆棧棧FiqSttackSSpacee SSPACE
9、E FIQQ_STAACK_LLEGTHH * 44 ;快速速中斷模式式堆棧AbtSttackSSpacee SSPACEE ABTT_STAACK_LLEGTHH * 44 ;中止止義模式堆堆棧UndtSStackkSpacce SPPACE UND_STACCK_LEEGTH * 4 ;未定義義模式堆棧棧SysSttackSSpacee SSPACEE SYSS_STAACK_LLEGTHH * 44 ; 系系統(tǒng)模式堆堆棧因?yàn)槌绦蛐栊枰袚Q模模式,而且且程序退出出時(shí)CPUU的模式已已經(jīng)不再是是管理模式式而是系統(tǒng)統(tǒng)模式LRR已經(jīng)不再再保存返回回程序地址址,所以程程序首先把把返回地址址保存到
10、R0中,同同時(shí)使用RR0返回。然后程序序把處理器器模式轉(zhuǎn)化化為IRQQ模式,并并設(shè)置IRRQ模式的的堆棧指針針。其中變變量Staacklrrq保存著著IRQ模模式的堆棧棧指針的初初始值,IIrqsttacksspacee是分配給給 IRQQ模式的堆堆??臻g的的開始地址址,IRQQ_STAACK_LLEGTHH是用戶定定義的常量量,用于設(shè)設(shè)置 IRRQ模式的的堆??臻g間的大小。程序使用用同樣的方方法設(shè)置FFIQ模式式堆棧指針針、中止模模式堆棧指指針、未定定義堆棧指指針和系統(tǒng)統(tǒng)模式堆棧棧指針。程序使用編編譯器分配配的空間作作為堆棧,而而不是按照照通常的做做法把堆棧棧分配到 RAM的的頂端,之之所以
11、這樣樣是因?yàn)檫@這樣做不必必知道RAAM頂端位位置,移植植更加方便便;編譯器器給出的占占用RAMM空間的大大小就是實(shí)實(shí)際占用的的大小,便便于控制RRAM的分分配。對(duì)于于 LPCC21066來說,中中止模式是是不需要分分配堆棧空空間的,這這是因?yàn)?LPC22106沒沒有外部總總線,也沒沒有虛擬內(nèi)內(nèi)存機(jī)制,如如果出現(xiàn)取取數(shù)據(jù)中止止或取指令令中止肯定定是程序有有問題。而而一般情況況下也不需需要模擬協(xié)協(xié)處理器指指令或擴(kuò)充充指令,未未定義中止止也就意味味著程序有有錯(cuò)誤,也也不需要分分配堆??湛臻g。4.2.1.3 異常常處理代碼碼與C語言言的接口程程序C/OSS-中斷斷服務(wù)子程程序流程圖圖如圖4-1所示:圖
12、4-1 中斷服務(wù)務(wù)子程序流流程圖異常處理代代碼與C語語言的接口口程序如下下:MACROO$IRQ_Labeel HAANDLEER $IIRQ_EExcepptionn EEXPORRT $IIRQ_LLabell ;輸輸出的標(biāo)號(hào)號(hào) IIMPORRT $IIRQ_EExcepptionn ;引引用的外部部標(biāo)號(hào)$IRQ_Labeel SSUB LLR, LLR, #4 ;計(jì)算算返回地址址 SSTMFDD SSP!, R0-R3, R12, LR ;保存任任務(wù)環(huán)境 MMRS RR3, SSPSR ;保存狀態(tài)態(tài) SSTMFDD SSP!, R3 LLDR RR2, =OSInntNesstingg
13、;OOSInttNestting+ LLDRB RR1, R2 AADD RR1, RR1, #1 SSTRB RR1, R2 BBL $IRQ_Exceeptioon ;調(diào)用c語語言的中斷斷處理程序序 MMSR CPPSR_cc, #00 x92 ;關(guān)中斷 BBL OOSInttExitt LLDR RR0, =OSTCCBHigghRdyy LLDR RR0, R0 LLDR RR1, =OSTCCBCurr LLDR RR1, R1 CCMP RR0, RR1 LLDMFDD SSP!, R3 MMSR SSPSR_cxsff, R33 LLDMEQQFD SSP!, R0-R3, R1
14、2, PC ;不進(jìn)行任任務(wù)切換 LLDR PPC, =OSInntCtxxSw ;進(jìn)行任務(wù)務(wù)切換 MMENDUndeffinedd ;未未定義指令令 bb UUndeffineddPrefeetchAAbortt ;取指令中中止 bb PPrefeetchAAborttDataAAbortt ;取取數(shù)據(jù)中止止 bb DDataAAborttIRQ_HHandller HANDDLER IRQ_Exceeptioon ;中中斷FIQ_HHandller ;快快速中斷 bb FFIQ_HHandllerTimerr0_Haandleer HAANDLEER Tiimer00 ;定定時(shí)器0中中斷未定
15、義指令令異常、取取指令中止止異常、取取數(shù)據(jù)中止止異常均是是死循環(huán),其其中原因在在上一小節(jié)節(jié)已經(jīng)說明明。而快速速中斷在本本應(yīng)用中并并未使用,所所以也設(shè)置置為死循環(huán)環(huán)。LPCC21066使用向量量中斷控制制器,各個(gè)個(gè) IRQQ中斷的人人口不一樣樣,所以使使用了一個(gè)個(gè)宏來簡(jiǎn)化化中斷服務(wù)務(wù)程序與CC語言的接接口編寫。由ARMM處理器核核的文檔可可知,處理理器進(jìn)入IIRQ中斷斷服務(wù)程序序時(shí)(LRR4)的的值為中斷斷返回地址址,為了使使任務(wù)無論論在主動(dòng)放放棄CPUU時(shí)還是中中斷時(shí)堆棧棧結(jié)構(gòu)都一一樣,在這這里先把LLR減4。其它的部部分與CC/OS-要求的的基本一致致。ARMM處理核在在進(jìn)入中斷斷服務(wù)程序序
16、時(shí)處理器器模式變?yōu)闉镮RQ模模式,與任任務(wù)的模式式不同,它它們的堆棧棧指針SPP也不一樣樣,而寄存存器應(yīng)當(dāng)保保存到用戶戶的堆棧中中,為了減減少不必要要的CPUU時(shí)間和RRAM空間間的浪費(fèi),本本移植僅在在必要時(shí)將將處理器的的寄存器保保存到用戶戶的堆棧中中,其它時(shí)時(shí)候還是保保存到IRRQ模式的的堆棧中。同時(shí),從從編譯器的的函數(shù)調(diào)用用規(guī)范可知知,C語言言函數(shù)返回回時(shí),寄存存器R4R11、SP不會(huì)會(huì)改變,所所以只需要要保存CPPSR、RR0R33、R122和返回地地址LR,在在后面保存存 CPSSR是為了了必要時(shí)將將寄存器保保存到用戶戶堆棧比較較方便。在異常處理理代碼與CC語言的接接口程序中中沒有與中
17、中斷服務(wù)子子程序流程程圖中的判判斷語句對(duì)對(duì)應(yīng)的語句句。判斷語語句是為了了避免在函函數(shù)OSIIntCttxsw()調(diào)調(diào)整堆棧指指針,這個(gè)個(gè)調(diào)整量是是與編譯器器、編譯器器選項(xiàng)、C/OSS -配配置選項(xiàng)都都相關(guān)的變變量。在這這里進(jìn)行這這些處理相相對(duì)其它處處理器結(jié)構(gòu)構(gòu)可能增加加的處理器器時(shí)間很少少,但對(duì)于于ARM來來說,由于于中斷(IIRQ)有有獨(dú)立的堆堆棧,在這這里這樣做做就需要把把所有寄存存器從中斷斷的堆棧拷拷貝到任務(wù)務(wù)的堆棧,需需要花費(fèi)比比較多的額額外時(shí)間。而變量OOSInttNestting為為0時(shí),并并不一定會(huì)會(huì)進(jìn)行任務(wù)務(wù)切換,所所以本移植植沒有與之之對(duì)應(yīng)的程程序,而在在函數(shù)OSSIntCC
18、txsww()中做做這一項(xiàng)工工作。這樣樣,僅在需需要時(shí)才處處理這些事事物,程序序效率得以以提高。在中斷調(diào)用用后,如果果需要任務(wù)務(wù)切換,則則變量OSSTCBHHighRRdy和變變量OSTTCBCuur的值不不同;如果果不需要任任務(wù)切換這這兩個(gè)變量量則相同。本移植通通過判斷這這兩個(gè)變量量來決定是是進(jìn)行任務(wù)務(wù)切換,還還是不進(jìn)行行任務(wù)切換換。通過比比較,如果果需要任務(wù)務(wù)切換則執(zhí)執(zhí)行“LDDR PCC, =OOSInttCtxSSw”跳轉(zhuǎn)轉(zhuǎn)到OSIIntCttxSw處處進(jìn)行任務(wù)務(wù)切換;如如果不需要要任務(wù)切換換則執(zhí)行“LDMEEQFD SP!, R00-R3, R122, PCC”中中斷返回。這里需要對(duì)
19、對(duì)“MSRR CPSRR_c, #0 x992”說明明下,這條條指令的作作用是關(guān)IIRQ中斷斷。因?yàn)橹兄袛啵↖RRQ)模式式的LR寄寄存器在處處理器響應(yīng)應(yīng)中斷時(shí)用用于保存中中斷返回地地址,所以以在處理器器響應(yīng)中斷斷時(shí)中斷(IIRQ)模模式的LRR寄存器不不能保存有有效數(shù)據(jù)。而BL指指令要用LLR寄存器器保存BLL下一條指指令的位置置,所以在在中斷(IIRQ)模模式時(shí),在在BL指令令之前必須須關(guān)中斷,在在保存LRR后才能開開中斷。4.2.2 Taargett.c文件件的編寫為了使系統(tǒng)統(tǒng)基本能夠夠工作,必必須在進(jìn)人人 maiin()函函數(shù)前對(duì)系系統(tǒng)進(jìn)行一一些基本的的初始化工工作,這些些工作由函函數(shù)
20、TarrgetRResettInitt()完成成。void TarggetReesetIInit(voidd) uuint332 i; uuint332 *ccp1; uuint332 *ccp2; eexterrn vooid VVectoors(vvoid) ; /* 拷貝貝向量表,保保證在fllash和和ram中中程序均可可正確運(yùn)行行 */ ccp1 = (uiint322 *)VVectoors; ccp2 = (uiint322 *)00 x4000000000; ffor (i = 0; ii 22 * 88; i+) *cp2+ = *cp11+; MEEMMAPP = 00 x
21、2;PINSEEL0 = (PIINSELL0 & 0 xFFFFF00000) | UAART0_PCB_PINSSEL_CCFG | 0 x550;PLLCOON = 1; /* 設(shè)置置系統(tǒng)各部部分時(shí)鐘 */ VPPBDIVV = 00; PLLLCFGG =0 xx23; PLLLFEEED = 0 xaaa; PLLLFEEED = 0 x555; whhile(PLLLSTATT & (1 10) = = 0) ; PLLLCONN = 33; PPLLFEEED = 0 xaaa; PPLLFEEED = 0 x555; MMAMCRR = 22; /* 設(shè)置存儲(chǔ)儲(chǔ)器加速模模塊 *
22、/#if FFcclkk 2200000000 MMAMTIIM = 1;#elsee#if FFcclkk 4400000000 MMAMTIIM = 2;#elsee MMAMTIIM = 3;#endiif#endiif首先向量表表拷貝到RRAM底部部,加上這這部分是為為了代碼無無論從Fllash基基地址開始始編譯還是是從RAMM基地址開開始編譯程程序均運(yùn)行行正確。而而把RAMM底部映射射到向量表表“MEMMMAP = 0 xx2”也是是為了同一一個(gè)目的。至于復(fù)制制16個(gè)字字而不是88個(gè)字,是是因?yàn)楹?8個(gè)字存儲(chǔ)儲(chǔ)跳轉(zhuǎn)的地地址是通過過 PC指指針間接尋尋址的,它它們與對(duì)應(yīng)應(yīng)指令(在在向量
23、表中中)相對(duì)位位置是不能能變化的。因?yàn)樵谶M(jìn)入入多任務(wù)環(huán)環(huán)境前使用用了一些外外設(shè),部分分外設(shè)使用用了芯片的的引腳,而而 LPCC21066的所有引引腳都是多多功能的,所所以需要設(shè)設(shè)置引腳功功能。同時(shí)時(shí)串口也進(jìn)進(jìn)行了設(shè)置置。時(shí)鐘是是芯片各部部分正常工工作的基礎(chǔ)礎(chǔ),雖然時(shí)時(shí)鐘可以在在任何時(shí)候候設(shè)置,但但為了避免免混亂,最最好在進(jìn)入入 maiin()函函數(shù)前設(shè)置置。程序首首先使能PPLL但不不連接PLLL,然后后設(shè)置外設(shè)設(shè)時(shí)鐘(VVPB時(shí)鐘鐘pclkk)與系統(tǒng)統(tǒng)時(shí)鐘(ccclk)的的分頻比。接著設(shè)置置PLL的的乘因子和和除因子。設(shè)置完成成后,使用用“PLLLFEEDD = 00 xaa; PLLLFE
24、EDD = 00 x55;”的訪問問序列把數(shù)數(shù)據(jù)正確寫寫人硬件,并并等待PLLL跟蹤完完成。最后后,使能PPLL,并并使PLLL聯(lián)上系統(tǒng)統(tǒng)。本應(yīng)用用外接的晶晶振頻率(FFosc)為為11.00592MMHz,倍倍增器的值值M=4,所所以處理器器時(shí)鐘(FFcclkk)為444.23668 MHHz。為了了使電流控控制振蕩器器頻率(FFcco)滿滿足1566-3200MHz,所所以分頻器器的值P=2,使得得Fccoo= Fccclk2P=176.94722 MHzz。取VPPB分頻器器的分頻值值為1/44,所以外外設(shè)時(shí)鐘(FFpclkk)= FFcclkk/4=111.05592 MMHz,則則記數(shù)周期期為0.0090422s,定定時(shí)0.22ms,則則記數(shù)值為為22122個(gè),這些些時(shí)鐘的定定義都在cconfiig.h文文件中。用戶程序最最終是要在在Flassh中運(yùn)行行的,而系系統(tǒng)復(fù)位時(shí)時(shí)Flassh是以最最低速度運(yùn)運(yùn)行,這對(duì)對(duì)發(fā)揮芯片片的性能極極其不利。雖然存儲(chǔ)儲(chǔ)器加速模模塊可以在在任何時(shí)候候設(shè)置,但但為了避免免混亂,最最好在進(jìn)入入 maiin()函函數(shù)前設(shè)置置。首先使使存儲(chǔ)器加加速模塊全全速工作,然然后根據(jù)系系統(tǒng)主時(shí)鐘鐘利用條件件編譯將FFlashh的訪問時(shí)時(shí)鐘設(shè)置到到合適的值值。4.2.3 Innit.ss文件的編編寫由于LPCC21066
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024人工智能安全標(biāo)準(zhǔn)與風(fēng)險(xiǎn)評(píng)估預(yù)警
- 儲(chǔ)能電站系統(tǒng)基礎(chǔ)培訓(xùn)
- 林下經(jīng)濟(jì)施工方案
- 合同范本補(bǔ)償合同
- 吃奶魚合伙合同范例
- 行業(yè)主管工作總結(jié)的實(shí)施進(jìn)度計(jì)劃
- 品牌內(nèi)容營(yíng)銷的成功實(shí)踐計(jì)劃
- 發(fā)展幼兒自信心的教育活動(dòng)計(jì)劃
- 人事部?jī)?nèi)部流程再造計(jì)劃
- 企業(yè)文化建設(shè)的實(shí)施計(jì)劃
- 狐貍的養(yǎng)殖技術(shù)
- GB/T 3280-2015不銹鋼冷軋鋼板和鋼帶
- GB/T 2851.5-1990沖模滑動(dòng)導(dǎo)向模架中間導(dǎo)柱模架
- GB/T 28267.4-2015鋼絲繩芯輸送帶第4部分:帶的硫化接頭
- GB/T 20833.4-2021旋轉(zhuǎn)電機(jī)繞組絕緣第4部分:絕緣電阻和極化指數(shù)測(cè)量
- GB/T 17187-2009農(nóng)業(yè)灌溉設(shè)備滴頭和滴灌管技術(shù)規(guī)范和試驗(yàn)方法
- GB/T 12459-1990鋼制對(duì)焊無縫管件
- 公司參觀登記表
- GB 20517-2006獨(dú)立式感煙火災(zāi)探測(cè)報(bào)警器
- 診所備案信息表2022
- 儀器校正培訓(xùn)教材課件
評(píng)論
0/150
提交評(píng)論