




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基于ARM7TDMI內(nèi)核的芯片里多數(shù)硬件模塊都是可配置的,需要由軟件來(lái)設(shè)置其需要的工作狀態(tài)。因此在用戶的應(yīng)用程序之前,需要由專門的一段代碼來(lái)完成對(duì)系統(tǒng)的初始化。由于這類代碼直接面對(duì)處理器內(nèi)核和硬件控制器進(jìn)行編程,一般都是用匯編語(yǔ)言。一般通用的內(nèi)容包括:中斷向量表初始化存儲(chǔ)器系統(tǒng)初始化堆棧初始化有特殊要求的斷口,設(shè)備初始化用戶程序執(zhí)行環(huán)境改變處理器模式呼叫主應(yīng)用程一.中斷向量表 ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內(nèi)。每當(dāng)一個(gè)中斷發(fā)生以后,ARM處理器便強(qiáng)制把PC指針置為向量表中對(duì)應(yīng)中斷類型的地址值。因?yàn)槊總€(gè)中斷只占據(jù)向量表中1個(gè)字的存儲(chǔ)空間,
2、只能放置一條ARM指令,使程序跳轉(zhuǎn)到存儲(chǔ)器的其他地方,再執(zhí)行中斷處理。中斷向量表的程序?qū)崿F(xiàn)通常如下表示:AREA Boot ,CODE, READONLYENTRYB ResetHandlerB UndefHandlerB SWIHandlerB PreAbortHandlerB DataAbortHandlerBB IRQHandlerB FIQHandler其中關(guān)鍵字ENTRY是指定編譯器保存這段代碼,因?yàn)榫幾g器可能會(huì)認(rèn)為這是一段亢余代碼而加以優(yōu)化。鏈接的時(shí)候要確保這段代碼被鏈接在0地址處,并且作為整個(gè)程序的入口。放在0地址處的中斷向量表的ResetHandler一般放在FLASH內(nèi),其他
3、中斷向量的入口地址可以是FLASH內(nèi)的,也可以是SDRAM內(nèi)的,但是在為操作系統(tǒng)初始化時(shí)應(yīng)該為SDRAM的地址。例如作為uClinux的啟動(dòng)代碼,此處應(yīng)該為內(nèi)存地址。一般有兩種實(shí)現(xiàn)方式:1.1 1第一種實(shí)現(xiàn)方式b reset add pc, pc, #0x0c000000
4、160; add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 add pc, pc, #0x0c000000 add pc, pc, #
5、0x0c000000 add pc, pc, #0x0c000000 0x0c000000為內(nèi)存起始地址,uClinux將中斷向量放入地址0x0c000008,因?yàn)閏pu發(fā)生中斷時(shí)仍然會(huì)跳轉(zhuǎn)到0地址處的中斷向量表中去,所以此處要修改中斷向量表的地址,使程序能正確跳轉(zhuǎn)到uClinux實(shí)現(xiàn)的中斷向量處。此處需要注意,由于ARM系統(tǒng)的三級(jí)流水線技術(shù),當(dāng)程序執(zhí)行到x地址處,pc指針的值其實(shí)等于x+8.在uClinux中實(shí)現(xiàn)如下:#ifdef CONFIG_ARCH_S3C44B0#undef ve
6、ctors_base()#define vectors_base() (0x0c000008)#endif所以add pc, pc, #0x0c000000這條語(yǔ)句將會(huì)有8的偏移量。 1.2 2第二種實(shí)現(xiàn)方式:b restldr pc,= 0x0c000004ldr pc,= 0x0c000008ldr pc,= 0x0c00000cldr pc,= 0x0c000010b .ldr
7、 pc,= 0x0c000018 /irq中斷l(xiāng)dr pc,= 0x0c00001c但相應(yīng)的linux源代碼應(yīng)作修改,這時(shí)uClinux中實(shí)現(xiàn)如下:#ifdef CONFIG_ARCH_S3C44B0#undef vectors_base()#define vectors_base() (0x0c000000)#endif即只要當(dāng)發(fā)生中斷時(shí),cpu發(fā)生中斷時(shí)跳轉(zhuǎn)到0地址處的中斷向量表中去,再這里能跳轉(zhuǎn)到uClinux的vectors_base()地址處。 ARM7有兩種IRQ中斷模式1.向量中斷時(shí)0地址代碼如下:其中從0x20開始處一定要按順序放入ENTRYb
8、 ResetHandler ; 0x00b HandlerUndef ; 0x04b HandlerSWI ; 0x08b HandlerPabort ; 0x0cb HandlerDabort ; 0x10b . ; 0x14b HandlerIRQ ; 0x18b HandlerFIQ ; 0x1cldr pc,=HandlerEINT0 ; 0x20ldr pc,=HandlerEINT1ldr pc,=HandlerEINT2ldr pc,=HandlerEINT3ldr pc,=HandlerEINT4567ldr pc,=HandlerTICK ; 0x34b .b .ldr pc
9、,=HandlerZDMA0 ; 0x40ldr pc,=HandlerZDMA1ldr pc,=HandlerBDMA0ldr pc,=HandlerBDMA1ldr pc,=HandlerWDTldr pc,=HandlerUERR01 ; 0x54b .b .ldr pc,=HandlerTIMER0 ; 0x60ldr pc,=HandlerTIMER1ldr pc,=HandlerTIMER2ldr pc,=HandlerTIMER3ldr pc,=HandlerTIMER4ldr pc,=HandlerTIMER5 ; 0x74b .b .ldr pc,=HandlerURXD0
10、; 0x80ldr pc,=HandlerURXD1ldr pc,=HandlerIICldr pc,=HandlerSIOldr pc,=HandlerUTXD0ldr pc,=HandlerUTXD1 ; 0x94b .b .ldr pc,=HandlerRTC ; 0xa0b .b .b .b .b .b .ldr pc,=HandlerADC ; 0xb4 2非向量IRQ中斷模式ENTRYb ResetHandler ; for debugb HandlerUndef ; handlerUndefb HandlerSWI ; SWI int
11、errupt handlerb HandlerPabort ; handlerPAbortb HandlerDabort ; handlerDAbortb . ; handlerReservedb IsrIRQb HandlerFIQ. . . . . .IsrIRQsub sp,sp,#4 ; reserved for PCstmfd sp!,r8-r9ldr r9,=I_ISPRldr r9,r9mov r8,#0x00 movs r9,r9,lsr #1bcs %F1add r8,r8,#4b %B01 ldr r9,=HandleADCadd r9,r9,r8ldr r9,r9str
12、r9,sp,#8ldmfd sp!,r8-r9,pc. . . . . .HandleADC # 4HandleRTC # 4HandleUTXD1 # 4HandleUTXD0 # 4. . . . . .HandleEINT3 # 4HandleEINT2 # 4HandleEINT1 # 4HandleEINT0 # 4 ; 此處通過(guò)判斷I_ISPR的值可以跳到相應(yīng)的中斷處理函數(shù)處。此處的Bootloader采用非向量IRQ中斷方式,通過(guò)以下頭文件的定義可以方便的把中斷向量處理函數(shù)的地址傳入:/* ISR */#define pISR_RESET
13、60; (*(unsigned *)(_ISR_STARTADDRESS+0x0)#define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4)#define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8)#define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc)#define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x1
14、0)#define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14)#define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18)#define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1c) #define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x20)#define pISR_RTC (*
15、(unsigned *)(_ISR_STARTADDRESS+0x24)#define pISR_UTXD1 (*(unsigned *)(_ISR_STARTADDRESS+0x28)#define pISR_UTXD0 (*(unsigned *)(_ISR_STARTADDRESS+0x2c)#define pISR_SIO (*(unsigned *)(_ISR_STARTADDRESS+0x30)#define pISR_IIC
16、(*(unsigned *)(_ISR_STARTADDRESS+0x34)#define pISR_URXD1 (*(unsigned *)(_ISR_STARTADDRESS+0x38)#define pISR_URXD0 (*(unsigned *)(_ISR_STARTADDRESS+0x3c)#define pISR_TIMER5 (*(unsigned *)(_ISR_STARTADDRESS+0x40)#define pISR_TIMER4
17、; (*(unsigned *)(_ISR_STARTADDRESS+0x44)#define pISR_TIMER3 (*(unsigned *)(_ISR_STARTADDRESS+0x48)#define pISR_TIMER2 (*(unsigned *)(_ISR_STARTADDRESS+0x4c)#define pISR_TIMER1 (*(unsigned *)(_ISR_STARTADDRESS+0x50)#define pISR_TIMER0&
18、#160; (*(unsigned *)(_ISR_STARTADDRESS+0x54)#define pISR_UERR01 (*(unsigned *)(_ISR_STARTADDRESS+0x58)#define pISR_WDT (*(unsigned *)(_ISR_STARTADDRESS+0x5c)#define pISR_BDMA1 (*(unsigned *)(_ISR_STARTADDRESS+0x60)#define pISR_BDMA0 (*(unsi
19、gned *)(_ISR_STARTADDRESS+0x64)#define pISR_ZDMA1 (*(unsigned *)(_ISR_STARTADDRESS+0x68)#define pISR_ZDMA0 (*(unsigned *)(_ISR_STARTADDRESS+0x6c)#define pISR_TICK (*(unsigned *)(_ISR_STARTADDRESS+0x70)#define pISR_EINT4567 (*(unsigned *)(_ISR_STARTADDRESS+0x74)#de
20、fine pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x78)#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x7c)#define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x80)#define pISR_EINT0
21、 (*(unsigned *)(_ISR_STARTADDRESS+0x84) 通過(guò)如下代碼就可以實(shí)現(xiàn)UART0口的中斷處理了:rINTCON=0x5; /Non-vectored,IRQ enable,FIQ disable rINTMOD=0x0; /All=IRQ mode pISR_URXD0=(unsigned)Uart0_RxInt; 當(dāng)在地址0處將中斷向量跳到內(nèi)存后,相應(yīng)的中斷向量就應(yīng)該拷貝到內(nèi)存地址處。
22、把以下代碼從FLASH拷貝到SDRAM中:real_vectors: b reset b undefined_instruction b software_interrupt
23、60; b prefetch_abort b data_abort b not_used b irq b
24、160; fiqundefined_instruction: mov r6, #3 b endless_blinksoftware_interrupt: mov r6, #4 b endles
25、s_blinkprefetch_abort: mov r6, #5 b endless_blinkdata_abort: mov r6, #6 b endless_blinknot_used:
26、 /* we *should* never reach this */ mov r6, #7 b endless_blinkirq:sub sp,sp,#4 ; reserved for PCstmfd sp!,r8-r9ldr r9,=I_ISPRldr r9,r9mov r8,#0x00 movs r9,r9,lsr #1bcs %F1add r8,r8
27、,#4b %B01 ldr r9,=HandleADCadd r9,r9,r8ldr r9,r9str r9,sp,#8ldmfd sp!,r8-r9,pc. . . . . .fiq: mov r6, #9 b endless_blink有了如上步驟就可以在bootloader中實(shí)現(xiàn)中斷處理了。 1.3
28、0; 二Reset中斷處理如下內(nèi)容1 初始化存儲(chǔ)器系統(tǒng)存儲(chǔ)器地址分布一種典型的情況是啟動(dòng)ROM的地址重映射。初始化堆棧因?yàn)锳RM有7種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針存放器SP都是獨(dú)立的。因此,對(duì)程序中需要用到的每一種模式都要給SP定義一個(gè)堆棧地址。方法是改變狀態(tài)存放器內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),讓后給SP賦值。注意:不要切換到User模式進(jìn)行User模式的堆棧設(shè)置,因?yàn)檫M(jìn)入U(xiǎn)ser模式后就不能再操作CPSR回到別的模式了,可能會(huì)對(duì)接下去的程序執(zhí)行造成影響。這是一段堆棧初始化的代
29、碼例如,其中只定義了三種模式的SP指針:MRS R0,CPSRBIC R0,R0,#MODEMASK ;平安起見,屏蔽模式位以外的其他位ORR R1,R0,#IRQMODEMSR CPSR_cxfs,R1LDR SP,=UndefStackORR R1,R0,#FIQMODEMSR CPSR_cxsf,R1LDR SP,=FIQStackORR R1,R0,#SVCMODEMSR CPSR_cxsf,R1LDR SP,=SVCStack2初始化有特殊要求的端口,設(shè)備 這里視不同的硬件設(shè)計(jì)而不同。 3 初始化應(yīng)用程序執(zhí)行環(huán)境映像一開始總是存儲(chǔ)在ROMFlash里面的,其RO局部即可以在ROMFlash里面執(zhí)行,也可以轉(zhuǎn)移到速度更快的RAM中執(zhí)行;而RW和ZI這兩局部是必須轉(zhuǎn)移到可寫的RAM里去。所謂應(yīng)用程序執(zhí)行環(huán)境的初始化,就是完成必要的從ROM到RAM的數(shù)據(jù)傳輸和內(nèi)容清零。下面是在ADS下,
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三年級(jí)語(yǔ)文下冊(cè)期中考試試卷分析
- 中醫(yī)基礎(chǔ)學(xué)習(xí)題含答案
- 中級(jí)電工模擬試題及參考答案
- 廠里工序分包協(xié)議合同范本
- 債券抵押合同范本
- 一年級(jí)班主任的個(gè)人年底總結(jié)
- 一年級(jí)下學(xué)期體育教學(xué)計(jì)劃
- 廠家招商加盟合同范例
- 《黃帝內(nèi)經(jīng)》讀書心得體會(huì)
- 廠家飯盒供貨合同范本
- 酒店公共區(qū)域電梯安全使用培訓(xùn)
- 急性冠脈綜合征ACS課件
- 三角函數(shù)的誘導(dǎo)公式(一)完整版
- 零信任安全模型研究
- 中小學(xué)幼兒園安全風(fēng)險(xiǎn)防控工作規(guī)范
- 正確認(rèn)識(shí)民族與宗教的關(guān)系堅(jiān)持教育與宗教相分離
- 畜禽廢棄物資源化利用講稿課件
- 土地糾紛調(diào)解簡(jiǎn)單協(xié)議書
- 服裝倉(cāng)庫(kù)管理制度及流程
- 架子工安全教育培訓(xùn)試題(附答案)
- 《高血壓5項(xiàng)化驗(yàn)》課件
評(píng)論
0/150
提交評(píng)論