版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、§ 4.2.1.1 中斷向量表VectorsLDRLDRLDRLDRLDRDCDLDRLDRResetAddrUnde巾nedAddrSWI_AddrPrefetchAddrDCDPrefetchAbortARM啟動(dòng)代碼詳解(Vectors.c、Init.s 、Target.c、Target.h ) 2010-05-15 16:03啟動(dòng)代碼是芯片復(fù)位后進(jìn)入 C語言的main ()函數(shù)前執(zhí)行的一段代碼,主要是 為運(yùn)行C語言程序提供基本運(yùn)行環(huán)境,如初始化存儲(chǔ)器系統(tǒng)等。AR泌司只設(shè)計(jì)核,不自己生產(chǎn)芯片,只是把核授權(quán)給其它廠商,其它廠商購買了授權(quán)且加入自 己的外設(shè)后生產(chǎn)出各具特色的芯片。這樣
2、就促進(jìn)了基于ARMt理器核的芯片多元 化,但也使得每一種芯片的啟動(dòng)代碼差別很大,不易編寫出統(tǒng)一的啟動(dòng)代碼。ADS(針對(duì)ARMt理器核的C語言編譯器)的策略是不提供完整的啟動(dòng)代碼,啟動(dòng)代 碼不足部分或者由廠商提供,或者自己編寫。啟動(dòng)代碼劃分為4個(gè)文件:Vectors.c、Init.s 、Target.c、Target.h 。Vectors.c 包含異常向量表、堆棧 初始化及中斷服務(wù)程序與C程序的接口。Init.s 包含統(tǒng)初始化代碼,并跳轉(zhuǎn)到 ADSB1供的初始化代碼。Target.c和Target.h包含目標(biāo)板特殊的代碼,包括異 常處理程序和目標(biāo)板初始化程序。這樣做的目的是為了盡量減少匯編代碼,
3、同時(shí)把不需要修改的代碼獨(dú)立出來以減少錯(cuò)誤。§ 4.2. 1 Vectors.c 文件的編寫PC, ResetAddrPC, UndefinedAddrPC, SWI_AddrPC, PrefetchAddrPC, DataAbortAddr0xb9205f80PC, PC, #-0xff0PC, FIQ_AddrDCDResetDCDUndefinedDCDSoftwareInterruptDataAbortAddrDCDDataAbortnouseDCDIRQAddrDCDIRQHandlerFIQAddrDCDFIQHandler異常是由部或外部源產(chǎn)生的以引起處理器處理的一個(gè)事件
4、。ARMt理器核支持7種類型的異常。異常出現(xiàn)后,CPU雖制從異常類型對(duì)應(yīng)的固定存儲(chǔ)地址開始 執(zhí)行程序。這個(gè)固定的地址就是異常向量。向量從上到下依次為復(fù)位、未定義指 令異常、軟件中斷、預(yù)取指令中止、預(yù)取數(shù)據(jù)中止、保留的異常、 IRQ和FIQ 0 IRQ向量“LDR PC, PC, #-0xff0” 使用的指令與其它向量不同。在正常情況下這條指令所在地址為0X00000018當(dāng)CPLM行這條指令但還沒有跳轉(zhuǎn)時(shí), PC的值為 0X00000020, 0X00000020減去 0X00000FF0 為 0XFFFFF030 這是向量 中斷控制器(VIC)的特殊寄存器VICVectAddr。這個(gè)寄存器保
5、存當(dāng)前將要服務(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 );/*分配堆??臻g*/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)模式堆棧因?yàn)?/p>
8、程序需要切換模式,而且程序退出時(shí)CPU的模式已經(jīng)不再是管理模式而 是系統(tǒng)模式LR已經(jīng)不再保存返回程序地址,所以程序首先把返回地址保存到 R0 中,同時(shí)使用R0返回。然后程序把處理器模式轉(zhuǎn)化為IRQ模式,并設(shè)置IRQ模 式的堆棧指針。其中變量Stacklrq保存著IRQ模式的堆棧指針的初始值, Irqstackspace 是分配給IRQ模式的堆??臻g的開始地址,IRQ_STACK_LEGTH 用戶定義的常量,用于設(shè)置IRQ模式的堆棧空間的大小。程序使而同樣的方法 設(shè)置FIQ模式堆棧指針、中止模式堆棧指針、未定義堆棧指針和系統(tǒng)模式堆棧指 針。程序使用編譯器分配的空間作為堆棧,而不是按照通常的做法把
9、堆棧分配到 RAM勺頂端,之所以這樣是因?yàn)檫@樣做不必知道 RAMK端位置,移植更加方便; 編譯器給出的占用RAMS句的大小就是實(shí)際占用的大小,便于控制 RAM勺分配。 對(duì)于LPC2106來說,中止模式是不需要分配堆棧空間的,這是因?yàn)長(zhǎng)PC2106沒有外部總線,也沒有虛擬存機(jī)制,如果出現(xiàn)取數(shù)據(jù)中止或取指令中止肯定是程序 有問題。而一般情況下也不需要模擬協(xié)處理器指令或擴(kuò)充指令,未定義中止也就意味著程序有錯(cuò)誤,也不需要分配堆??臻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;輸出的標(biāo)號(hào)IMPORT$IRQ_Exception;引用的外部標(biāo)號(hào)#4$IRQ LabelSUBLR, LR,;計(jì)算返回地址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;不進(jìn)行任務(wù)切換LDR;進(jìn)行任務(wù)切換=OSIntCtxSwMENDUndefined;未定義指令bUndefinedPrefetchAbort;取指令中止bPrefetchAbortDataAbort;取數(shù)據(jù)中止bDataAbortIRQ_HandlerHANDLERRQ_Exception;中斷FIQ_Handle
12、r;快速中斷bFIQ_HandlerTimer0_Handler HANDLER Timer。;定時(shí)器 0中斷未定義指令異常、取指令中止異常、取數(shù)據(jù)中止異常均是死循環(huán),其中原因 在上一小節(jié)已經(jīng)說明。而快速中斷在本應(yīng)用中并未使用,所以也設(shè)置為死循環(huán)。 LPC210瞅用向量中斷控制器,各個(gè)IRQ中斷的人口不一樣,所以使用了一個(gè)宏 來簡(jiǎn)化中斷服務(wù)程序與C語言的接口編寫。由ARMt理器核的文檔可知,處理器 進(jìn)入IRQ中斷服務(wù)程序時(shí)(LR 4)的值為中斷返回地址,為了使任務(wù)無論在主 動(dòng)放棄CPLM還是中斷時(shí)堆棧結(jié)構(gòu)都一樣,在這里先把 LR減4。其它的部分與 叱C/OS n要求的基本一致。ARMfct理核
13、在進(jìn)入中斷服務(wù)程序時(shí)處理器模式變?yōu)?IRQ模式,與任務(wù)的模式不同,它們的堆棧指針SP也不一樣,而寄存器應(yīng)當(dāng)保存到用戶的堆棧中,為了減少不必要的CPU寸間和RAMS句的浪費(fèi),本移植僅在 必要時(shí)將處理器的寄存器保存到用戶的堆棧中,其它時(shí)候還是保存到IRQ模式的堆棧中。同時(shí),從編譯器的函數(shù)調(diào)用規(guī)可知,C語言函數(shù)返回時(shí),寄存器R4-R11、 SP不會(huì)改變,所以只需要保存CPSRR0- R3 R12和返回地址LR,在后面保存CPSR 是為了必要時(shí)將寄存器保存到用戶堆棧比較方便。在異常處理代碼與C語言的接口程序中沒有與中斷服務(wù)子程序流程圖中的 判斷語句對(duì)應(yīng)的語句。判斷語句是為了避免在函數(shù)OSIntCtxs
14、w ()調(diào)整堆棧指針,這個(gè)調(diào)整量是與編譯器、編譯器選項(xiàng)、C C/OS - II配置選項(xiàng)都相關(guān)的變量 在這里進(jìn)行這些處理相對(duì)其它處理器結(jié)構(gòu)可能增加的處理器時(shí)間很少,但對(duì)于 AR豚說,由于中斷(IRQ)有獨(dú)立的堆棧,在這里這樣做就需要把所有寄存器 從中斷的堆??截惖饺蝿?wù)的堆棧,需要花費(fèi)比較多的額外時(shí)間。而變量 OSIntNesting為0時(shí),并不一定會(huì)進(jìn)行任務(wù)切換,所以本移植沒有與之對(duì)應(yīng)的 程序,而在函數(shù)OSIntCtxsw ()中做這一項(xiàng)工作。這樣,僅在需要時(shí)才處理這 些事物,程序效率得以提高。在中斷調(diào)用后,如果需要任務(wù)切換,則變量 OSTCBHighRdy變量OSTCBCur 的值不同;如果不
15、需要任務(wù)切換這兩個(gè)變量則相同。 本移植通過判斷這兩個(gè)變量 來決定是進(jìn)行任務(wù)切換,還是不進(jìn)行任務(wù)切換。通過比較,如果需要任務(wù)切換則 執(zhí)行“LDRPC, =OSIntCtxSw”跳*到OSIntCtxSw處進(jìn)行任務(wù)切換;如果不需要 任務(wù)切換則執(zhí)行“ LDMEQFD SP!, R0R3, R12, PCA”中斷返回。這里需要對(duì)“ MSRCPSR_c,#0x92”說明下,這條指令的作用是關(guān)IRQ中斷。因?yàn)橹袛啵↖RQ)模式的LR寄石器在處理器響應(yīng)中斷時(shí)用于保存中斷返回 地址,所以在處理器響應(yīng)中斷時(shí)中斷(IRQ)模式的LR寄存器不能保存有效數(shù)據(jù)。 而BL指令要用LR寄存器保存BL下一條指令的位置,所以在
16、中斷(IRQ)模式時(shí), 在BL指令之前必須關(guān)中斷,在保存 LR后才能開中斷。§ 4.2.2 Target.c 文件的編寫為了使系統(tǒng)基本能夠工作,必須在進(jìn)人main ()函數(shù)前對(duì)系統(tǒng)進(jìn)行一些基本的初始化工作,這些工作由函數(shù) TargetResetInit ()完成。void TargetResetInit(void)uint32 i ;uint32 *cp1;uint32 *cp2;extern void Vectors(void) ;/* 拷貝向量表,保證在flash和ram中程序均可正確運(yùn)行*/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)各部分時(shí)鐘*/VPBDIV = 0 ;PLLCFG =0x23;PLLFEED = 0xaa;PLLFEED = 0x55;while(PLLSTAT & (1 << 10) = = 0);PLLCON = 3;PLLFEED = 0xaa;PLLFEED = 0x55MAMCR = 2
18、/*設(shè)置存儲(chǔ)器加速模塊*/#if Fcclk < 20000000MAMTIM = 1;#else#if Fcclk < 40000000MAMTIM = 2#elseMAMTIM = 3;#endif#endif首先向量表拷貝到RA既部,加上這部分是為了代碼無論從 Flash基地址開 始編譯還是從RAM1地址開始編譯程序均運(yùn)行正確。而把RAMK部映射到向量表 “MEMMAP = 0X2也是為了同一個(gè)目的。至于復(fù)制 16個(gè)字而不是8個(gè)字,是因 為后8個(gè)字存儲(chǔ)跳轉(zhuǎn)的地址是通過 PC指針間接尋址的,它們與對(duì)應(yīng)指令(在向 量表中)相對(duì)位置是不能變化的。因?yàn)樵谶M(jìn)入多任務(wù)環(huán)境前使用了一些外設(shè)
19、,部分外設(shè)使用了芯片的引腳,而LPC2106勺所有引腳都是多功能的,所以需要設(shè)置引腳功能。同時(shí)用口也進(jìn)行了 設(shè)置。時(shí)鐘是芯片各部分正常工作的基礎(chǔ),雖然時(shí)鐘可以在任何時(shí)候設(shè)置,但為 了避免混亂,最好在進(jìn)入main ()函數(shù)前設(shè)置。程序首先使能PLL但不連接PLL, 然后設(shè)置外設(shè)時(shí)鐘(VPB寸鐘pclk )與系統(tǒng)時(shí)鐘(cclk )的分頻比。接著設(shè)置 PLL的乘因子和除因子。設(shè)置完成后,使用“PLLFEE# 0xaa; PLLFEE修0x55;” 的訪問序列把數(shù)據(jù)正確寫人硬件,并等待 PLL跟蹤完成。最后,使能PLL,并使 PLL聯(lián)上系統(tǒng)。本應(yīng)用外接的晶振頻率(Fosc)為11.0592MHz倍增器的值M=4 所以處理器時(shí)鐘(Fcclk )為44.2368 MHz為了使電流控制振蕩器頻率(Fcco) 滿足 156-320MHz 所以分頻器的值 P=2,使得 Fcco= Fccl
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度物流服務(wù)合同標(biāo)的與服務(wù)內(nèi)容2篇
- 2025年度航空航天零部件采購合同模板3篇
- 2025彩妝造型行業(yè)消費(fèi)者權(quán)益保護(hù)合作協(xié)議3篇
- 泰州職業(yè)技術(shù)學(xué)院《城市更新與方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024版:變壓器買賣雙方權(quán)益保障合同3篇
- 2024年足療服務(wù)人員聘用協(xié)議樣本版B版
- 二零二五版2025年度個(gè)體美容美發(fā)店合伙合作協(xié)議3篇
- 二零二五版物聯(lián)網(wǎng)技術(shù)在農(nóng)業(yè)應(yīng)用合伙協(xié)議3篇
- 二零二五年度綠色建筑門窗安裝及節(jié)能認(rèn)證協(xié)議3篇
- 二零二五版貨物搬運(yùn)與物流信息平臺(tái)建設(shè)合同3篇
- 自我發(fā)展與團(tuán)隊(duì)管理課件
- 《婦產(chǎn)科學(xué)》課件-17.盆腔器官脫垂
- 《UL線材培訓(xùn)資識(shí)》課件
- 監(jiān)理報(bào)告范本
- 店鋪交割合同范例
- 大型活動(dòng)LED屏幕安全應(yīng)急預(yù)案
- 2024年內(nèi)蒙古包頭市中考道德與法治試卷
- 湖南省長(zhǎng)沙市2024-2025學(xué)年高二上學(xué)期期中考試地理試卷(含答案)
- 自來水質(zhì)量提升技術(shù)方案
- 金色簡(jiǎn)約蛇年年終總結(jié)匯報(bào)模板
- 農(nóng)用地土壤環(huán)境質(zhì)量類別劃分技術(shù)指南(試行)(環(huán)辦土壤2017第97號(hào))
評(píng)論
0/150
提交評(píng)論