国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

電子工程網(wǎng)

標(biāo)題: 在百度空間上看到了阿南ARM訓(xùn)練班的課堂總結(jié),轉(zhuǎn)過來正好 [打印本頁]

作者: 諸葛孔明    時(shí)間: 2009-7-27 12:28
標(biāo)題: 在百度空間上看到了阿南ARM訓(xùn)練班的課堂總結(jié),轉(zhuǎn)過來正好
阿南ARM訓(xùn)練班課堂總結(jié)(1)

2009年03月02日 12:47

由于距離等等一大堆方面的原因,是否參加阿南的訓(xùn)練班著實(shí)猶豫了一陣子,如今得以如愿,自然分外珍惜,寫個(gè)總結(jié),認(rèn)真的縷一下頭緒,有不對(duì)的地方也希望阿南以及其他前輩們指正一下....

個(gè)人一向喜歡從零開始學(xué)習(xí)或者思考一個(gè)問題,想當(dāng)初買回開發(fā)板做的第一件事就是把Flash擦個(gè)干凈,上了課之后,覺得這個(gè)“零”還得再往前追溯一點(diǎn):一塊2410,一塊NandFlash-k9f1208,兩塊SDRAM-k4s561632,現(xiàn)在要搭建一個(gè)最小系統(tǒng):

第一課,主要講的就是分析硬件原理圖。

一、如何看Datasheet?
首先要面對(duì)的自然是芯片的DataSheet,對(duì)于一個(gè)完全不了解的芯片,主要先看以下幾個(gè)方面:

1).preview簡(jiǎn)介。大概的了解一下這款處理器有什么功能,包含了什么模塊等等。

2).memory內(nèi)存映射圖。對(duì)于寫程序的人來說,這個(gè)東西是相當(dāng)重要的。

3).管腳的分布及其功能。阿南特別強(qiáng)調(diào)了某些管腳不可以隨便懸空,如nWait用于延長(zhǎng)總線周期,如果沒有使用必須將其上拉才能釋放總線。

4).其他的部分可以在今后的開發(fā)中用到了再有針對(duì)性地看。

二、最小系統(tǒng)基本構(gòu)成
跟一個(gè)單片機(jī)系統(tǒng)差不多,只不過是單片機(jī)把存儲(chǔ)器集成到芯片里面了,但是這里什么都得自己來。
1).MPU
2).Flash(NOR/NAND)
3).RAM(SDARM/DDR/DR2)
4).Power and Clock(PLL)
5).Reset circuit

三、SDARM接口設(shè)計(jì)
查看DataSheet,主要有以下幾種管腳:
1).數(shù)據(jù)線DQ0~DQ15
這個(gè)與2410的數(shù)據(jù)總線對(duì)應(yīng)連接就可以了。

2).行/列地址線A0~A12
由于2410是按照字節(jié)尋址,但SDRAM是16Bit半字寬度,所以連接時(shí)需要錯(cuò)開一位,將A0連到處理器的A1,而這個(gè)系統(tǒng)是通過兩塊k4s561632串聯(lián)實(shí)現(xiàn)32Bit數(shù)據(jù)寬度,所以需要進(jìn)行字對(duì)齊連接,將A0接到A2地址總線上,其他順次接。

3).Bank地址線BA0~BA1
在2410的手冊(cè)里面,有個(gè)SDRAM BANK ADDRESS PIN CONNECTION表,里面規(guī)定了不同組織結(jié)構(gòu)的SDARM的Bank地址線。所以首先要明白存儲(chǔ)器的組織結(jié)構(gòu),看K4S56163的芯片手冊(cè),標(biāo)注:4M*16Bit*4Banks。
這表示每個(gè)Bank有4M大小,即由行列地址確定的存儲(chǔ)單元個(gè)數(shù)為4M個(gè),16Bit是位寬,即每個(gè)存儲(chǔ)單元存儲(chǔ)的數(shù)據(jù)大小為16bit半字,一共包含有4個(gè)Bank,所以這個(gè)SDRAM的總?cè)萘繛?2MB(256Mbit)。根據(jù)這個(gè)就可以確定Bank地址線為A[24:23]。
再說一下SDRAM的訪問過程,大概是這樣的:首先送出Bank地址,然后再依次送出行列地址確定需要訪問的存儲(chǔ)單元,最后進(jìn)行數(shù)據(jù)交換。

4).控制引腳
由于2410集成了SDRAM的管理器,所以接到相應(yīng)的管腳就是了,主要是行選通RAS,列選通CASE,寫使能WE,LDQM和UDQM數(shù)據(jù)I/O屏蔽用于在讀模式下控制輸出緩沖,在寫模式下屏蔽輸入數(shù)據(jù),CS片選接在nGS6,即是把SDARM掛接在Bank6上,另外還有時(shí)鐘控制線,電源等。

四、NandFlash接口設(shè)計(jì)
NandFlash與NorFlash不同,它是非線性的存儲(chǔ)器,所以它應(yīng)該不是映射到2410的內(nèi)存空間上的。2410有專門的NandFlash接口管腳,相對(duì)比較容易一點(diǎn),八位數(shù)據(jù)線直接與處理器的數(shù)據(jù)總線相連,ALE地址允許,CLE命令允許,CS片選使能,讀/寫使能,R/B等幾根線都有對(duì)應(yīng)的管腳相連。由于NandFlash共用八位數(shù)據(jù)線傳輸?shù)刂泛蛿?shù)據(jù),所以2410上有個(gè)NCON引腳用于選擇地址的周期,一般情況下3個(gè)周期就可以完成24位的尋址范圍。
關(guān)于NandFlash的啟動(dòng),如果將芯片設(shè)置成NandFlash啟動(dòng),會(huì)有4K大小的SRAM映射在0x0地址處,上電后硬件自動(dòng)將前4K大小的代碼搬到這里,首先從SRAM中運(yùn)行程序,在這4K代碼里需要完成將其他代碼拷貝到SDRAM中,最后令程序在SDRAM中運(yùn)行。

五、電源、時(shí)鐘和復(fù)位電路
提到一個(gè),設(shè)計(jì)電源的時(shí)候先讓外圍電路通電,最后才讓處理器上電,大概與正確的開電腦順序是相同的,主要考慮的是萬一處理器已復(fù)位完成開始運(yùn)行時(shí),但要訪問的外圍器件還未準(zhǔn)備就緒,就有可能會(huì)發(fā)生意外。

大概先這么多吧,其他的想到再來補(bǔ)充......
作者: 諸葛孔明    時(shí)間: 2009-7-27 12:28
阿南ARM訓(xùn)練班課堂總結(jié)(2)

2009年03月11日 11:11

硬件PCB完成之后,需要首先對(duì)各個(gè)單元電路進(jìn)行檢測(cè)調(diào)試,這一課主要講的就是硬件系統(tǒng)的調(diào)試。

一、電源、晶振及復(fù)位電路
在給PCB上電之前要確保電源供電的可靠性,排除短路問題等等。對(duì)照PCB版圖找到相應(yīng)的測(cè)點(diǎn)的位置。
在Protel99SE下,選擇Tools->Preferences...(快捷鍵T+P)下的Show/Hide選項(xiàng)卡,這里可以選擇隱藏一些顯示,以利于觀察布線,一般將覆銅(Polygons)隱藏。
在Browse PCB選項(xiàng)卡下可以選擇查找特定的元件、節(jié)點(diǎn)等,直接輸入元件(節(jié)點(diǎn))名稱選擇或跳轉(zhuǎn)到該元件的位置上。
按快捷鍵S+P在出現(xiàn)十字手形后單擊某一條線路可以高亮顯示所有與其相連的通路。按X+A取消所有選擇。Shift+S可以隱藏或顯示除當(dāng)前層外的其他層布線。
排除了短路問題之后就可以上電測(cè)試了。使用萬用表電壓檔依次測(cè)試一些關(guān)鍵節(jié)點(diǎn)的電壓值,確保電源供電正確。晶振電路需要使用示波器觀測(cè)波形。復(fù)位電路通過檢測(cè)nRSTOUT引腳,在正常工作下輸出為高電平,按下復(fù)位鍵后輸出低電平。

二、檢查內(nèi)核
接入Multi-ICE仿真器看是否能檢測(cè)到內(nèi)核,如果不能檢測(cè)到內(nèi)核,原因可能是電源供電或晶振電路不正常,一些不能隨便處理的引腳(空置時(shí)必須接高或低),仿真器接口線沒有正確連接等等,相應(yīng)排查各個(gè)出錯(cuò)的原因。

三、SDRAM接口電路調(diào)試
到上面那一步處理器基本可以工作了,接下來是要調(diào)試存儲(chǔ)設(shè)備。通過AXD看是否能夠正確讀寫SDRAM所在的位置。對(duì)于一個(gè)裸板,對(duì)應(yīng)于存儲(chǔ)器的寄存器設(shè)置是未定義的,所以要調(diào)試SDRAM存儲(chǔ)器系統(tǒng),首先應(yīng)配置相關(guān)的特殊功能寄存器,使系統(tǒng)中的SDRAM能被正確訪問。主要是BWSCON總線配置,以及各個(gè)Bank的配置寄存器BANKCONn。
這里使用三星官方提供的初始化文件ADS2410boot.ini。
打開AXD->System Views->Command Line Interface(快捷鍵Alt+L),
在命令行下輸入obey .\ADS2410boot.ini。
完成配置后打開Memory窗口,定位到SDRAM所在的地址0x30000000,數(shù)據(jù)區(qū)應(yīng)顯示SDRAM中的內(nèi)容。
雙擊其中的任一數(shù)據(jù),輸入新的值,若對(duì)應(yīng)的存儲(chǔ)單元能正確顯示剛才輸入的數(shù)據(jù),則表明SDRAM存儲(chǔ)器已能正常工作。

四、Flash接口電路的調(diào)試
Flash的調(diào)試直接通過燒寫軟件來完成,使用sjf2410和JTAG小板將程序(如流水燈)燒入Flash,看能否正常運(yùn)行程序。
這里涉及了安裝GiveIO將PC并口用作普通I/O口以及sjf2410的使用。
1. 安裝GiveIO驅(qū)動(dòng)
1).將GIVEIO.SYS拷貝到C:\WINDOWS\system32\drivers目錄下。
2).依次點(diǎn)擊 控制面板->添加硬件->下一步->是,…->下一步->添加新的硬件設(shè)備->手動(dòng)從…->端口(COM/LPT)->從磁盤安裝->瀏覽->保存文件giveio.inf的目錄->完成。安裝成功后可以在設(shè)備管理器端口中看到一個(gè)名為giveio端口。
2. sjf2410的使用
在命令行下進(jìn)入軟件所在的目錄,輸入sjf2410可以看到命令行格式,依次按照提示的步驟即可以完成Flash的燒寫。

五、外圍電路的測(cè)試
至此,一個(gè)最小系統(tǒng)基本可以正常工作了,其他外圍電路的測(cè)試通過使用官方的測(cè)試程序來完成。
作者: 諸葛孔明    時(shí)間: 2009-7-27 12:29
阿南ARM訓(xùn)練班課堂總結(jié)(3)

2009年03月19日 10:31

第三課主要是分析啟動(dòng)代碼和中斷處理過程

之前有分析過44b0下的這個(gè)啟動(dòng)代碼,差別不是非常大,今天再重新看了一遍。啟動(dòng)代碼與Bootloader不同,主要是指進(jìn)入C語言之前的匯編代碼,網(wǎng)上都稱為是bootloader的stage1,一般通用的內(nèi)容包括:
1. 定義程序入口點(diǎn)
2. 設(shè)置異常向量表
3. 初始化存儲(chǔ)系統(tǒng)
4. 初始化用戶程序的執(zhí)行環(huán)境
5. 初始化堆棧指針寄存器,改變處理器的模式
6. 設(shè)置FIQ/IRQ中斷處理程序入口
7. 進(jìn)入C程序

1)編譯器選擇
    GBLL     THUMBCODE
     [ {CONFIG} = 16
THUMBCODE SETL   {TRUE}
         CODE32
         |   
THUMBCODE SETL   {FALSE}
         ]
因?yàn)樘幚砥鞣譃?6位 32位兩種工作狀態(tài),程序的編譯器也是分16位和32兩種編譯方式,所以這段程序用于根據(jù)處理器工作狀態(tài)確定編譯器編譯方式,程序不難理解,主要解釋一下符號(hào)“[     |     ]”的意思,上面的程序是指:
if({CONFIG} = 16 )
     { THUMBCODE SETL {TRUE}
       CODE32 }
else
       THUMBCODE SETL {FALSE}
還是沒有不明白CONFIG怎么區(qū)分是16位還是32位?哪里決定它的取值?應(yīng)該是編譯器指定的這個(gè)值。

2)宏定義
        MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
     sub     sp,sp,#4        
     stmfd     sp!,{r0}        
     ldr      r0,=$HandleLabel
     ldr      r0,[r0]         
     str      r0,[sp,#4]      
     ldmfd    sp!,{r0,pc}   
     MEND
$HandlerLabel是宏的地址標(biāo)號(hào),HANDLER是宏名,$HandleLabel是宏的參數(shù),$標(biāo)號(hào)在宏指令展開時(shí),標(biāo)號(hào)會(huì)替換為用戶定義的符號(hào)。在此后,所有遇到$HandlerLabel HANDLER $HandleLabel這種形式的表達(dá)式都會(huì)被展開成$HandlerLabel到MEND之間的函數(shù)。
例如:ADC_IRQ HANDLER HandleADC即代表如下函數(shù),語句ldr pc,=ADC_IRQ的作用也就是跳轉(zhuǎn)到這個(gè)函數(shù):
ADC_IRQ
     sub     sp,sp,#4        
     stmfd     sp!,{r0}        
     ldr      r0,=HandleADC
     ldr      r0,[r0]         
     str      r0,[sp,#4]      
     ldmfd    sp!,{r0,pc}
這段程序用于把ADC中斷服務(wù)程序的首地址裝載到pc中,跳轉(zhuǎn)到中斷處理函數(shù),稱之為“加載程序”。HandleADC是一個(gè)地址標(biāo)號(hào),它的內(nèi)容就是ADC中斷服務(wù)程序的地址標(biāo)號(hào),即文件最后的那個(gè)表HandleADC # 4所示,將HandleADC # 4中的4換成中斷服務(wù)程序的地址標(biāo)號(hào)即是,程序在這里定義了一個(gè)數(shù)據(jù)區(qū),存放各種中斷服務(wù)程序的首地址。每個(gè)字空間都有一個(gè)標(biāo)號(hào),以Handle***命名。

3)寄存器及堆棧設(shè)置
按照上面的順序,可以比較容易讀懂啟動(dòng)代碼的作用,主要就是通過設(shè)置特殊功能寄存器來達(dá)到對(duì)系統(tǒng)參數(shù)的設(shè)定。依次禁止看門狗,中斷,設(shè)定時(shí)鐘控制寄存器,存儲(chǔ)器控制寄存器等等。
由于各個(gè)工作模式下的堆棧指針是相互獨(dú)立的,所以要分別進(jìn)入各個(gè)模式下設(shè)置其堆棧指針,基本上都差不多,比如未定義指令模式下的設(shè)置:
     mrs     r0,cpsr
     bic     r0,r0,#MODEMASK
     orr     r1,r0,#UNDEFMODE|NOINT
     msr     cpsr_cxsf,r1        
     ldr     sp,=UndefStack
UnderStack是在程序后面用UnderStack #   256建立的一個(gè)堆棧空間的首地址,這部分空間建立在RAM中,256字節(jié)空間的堆棧大小。

4)初始化用戶程序的執(zhí)行環(huán)境
之前在44B0里的啟動(dòng)代碼里還有包括把ROM里的程序拷貝到RAM中并跳轉(zhuǎn)到RAM運(yùn)行程序,也就是把加載狀態(tài)下的程序按照編譯連接時(shí)的設(shè)置重新排布成運(yùn)行時(shí)的程序狀態(tài),以達(dá)到符號(hào)能夠正確連接的目的,這里是涉及到了所謂的映像文件,但是2410這里沒有這一段,即程序的加載態(tài)就是它的運(yùn)行態(tài),所以要求燒寫程序時(shí)必須要把它燒寫在設(shè)置的RO地址上,否則程序?qū)⒉荒苷_執(zhí)行。下面這段程序?qū)崿F(xiàn)RW數(shù)據(jù)初始化,只是把數(shù)據(jù)段復(fù)制到高地址,如果沒有設(shè)置RW的話這段代碼也不會(huì)執(zhí)行。
     ;Copy and paste RW data/zero initialized data
     ldr     r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
     ldr     r1, =|Image$$RW$$Base|   ; and RAM copy
     ldr     r3, =|Image$$ZI$$Base|  
   
     ;Zero init base => top of initialised data
     cmp     r0, r1       ; Check that they are different
     beq     %F2
1      
     cmp     r1, r3      
     ldrcc     r2, [r0], #4            
     strcc     r2, [r1], #4   
     bcc     %B1
2      
     ldr     r1, =|Image$$ZI$$Limit|
     mov     r2, #0
3      
     cmp     r3, r1       ; Zero init
     strcc     r2, [r3], #4
     bcc     %B3
b %F1(B1)的意思是在臨近的地址標(biāo)號(hào)跳轉(zhuǎn),F(xiàn)是向后尋找,B是向前尋找。

5)說說映象文件
用ADS編譯產(chǎn)生的映像文件有.axf、.bin、.hex等等格式,就拿要直接燒進(jìn)Flash里的.bin文件來說,在其他書上看到有這么句話“映像文件一般由域組成,域由最多三個(gè)輸出段(RO,RW,ZI)組成,輸出段又由輸入段組成。”
對(duì)于這段話,前兩句是比較好理解的,域就是整個(gè)映像文件,對(duì)于大部分程序來說就只有一個(gè)域,也就是燒進(jìn)Flash里的那部分東東,稱作加載域;輸出段就是用AREA定義的RO,Rw,一般就這兩個(gè),拿前面的bootloader來說,整體框架是這樣的:
     AREA     Init,CODE,READONLY     ;<--RO段
     ENTRY
Entry                          ;<--CODE部分

… …

SMRDATA DATA               ;<--DATA部分

… …

     AREA          RamData, DATA,             READWRITE     ;<--RW段

… …

然而對(duì)于輸出段又由輸入段組成卻著實(shí)糊涂了好一陣,輸入段是指源程序的代碼(CODE)部分和數(shù)據(jù)(DATA)部分。上面這個(gè)框架中,在RO輸出段的Entry下開始一系列的匯編指令操作,這個(gè)應(yīng)該是CODE輸入段,而SMRDATA DATA引領(lǐng)DCD用于開辟一片數(shù)據(jù)存儲(chǔ)空間,這部分應(yīng)該是DATA輸入段,它與RW里的數(shù)據(jù)不同之處在于這部分?jǐn)?shù)據(jù)不能被修改。
在ADS編譯前在ARM-Linker里的Ro_Base和Rw_Base兩個(gè)地址值,就是指兩個(gè)輸出段的起始地址,即程序是按照你設(shè)置的這種方式排布在內(nèi)存中的,各個(gè)地址標(biāo)號(hào)根據(jù)這兩個(gè)值確定。然而,用Ultraedit打開bin文件卻發(fā)現(xiàn)其實(shí)Rw是跟在Ro后面的,也就是說,這兩個(gè)段并沒有按照你設(shè)置的地址起始,由此引出映像文件的加載域和運(yùn)行時(shí)域兩個(gè)概念。
加載域就是用Ultraedit打開看到的程序最原始的狀態(tài),而運(yùn)行時(shí)域則是程序在執(zhí)行時(shí)按照你設(shè)定的方式排布的狀態(tài),顯然,上面設(shè)置的兩個(gè)地址是針對(duì)運(yùn)行時(shí)域來設(shè)置的,程序要滿足上面的設(shè)置才能正確連接。也就是程序開始階段(加載域狀態(tài))是不能正確連接的,不過開始時(shí)不需要用到Rw里的數(shù)據(jù),程序是可以運(yùn)行的,因此必須在需要用到Rw數(shù)據(jù)之前把它拷貝到上面設(shè)置的位置上,這就是bootloader里初始化用戶程序的執(zhí)行環(huán)境部分的作用,把數(shù)據(jù)移動(dòng)到正確的位置!
拷貝完Rw里的數(shù)據(jù)之后,所有的符號(hào)都可以正確連接,這時(shí)跳轉(zhuǎn)到main函數(shù)里去執(zhí)行程序就可以了。2410的這段啟動(dòng)代碼沒有進(jìn)行Ro的拷貝,所以如果你把程序燒在0x0地址,那么Ro就必須設(shè)置成0x0,如果你設(shè)置成0x30000000,那么Ro就必須設(shè)置成0x30000000,如果Rw不設(shè)置,它將默認(rèn)跟在Ro后面,否則就執(zhí)行上面的搬遷代碼,挪到正確的位置上。由于本系統(tǒng)是采用NandFlash啟動(dòng)的,最初的啟動(dòng)代碼必須要在0x0處的SRAM里執(zhí)行,所以,如果要把這段啟動(dòng)代碼當(dāng)作NandFlash的啟動(dòng)代碼的話,Ro就必須設(shè)成0x0。

6).中斷處理過程
要使用中斷,首先需要清掉程序狀態(tài)寄存器CPSR里的IRQ位,這個(gè)很容易被忽略了。再之后才是考慮與中斷有關(guān)的相應(yīng)寄存器.

這個(gè)幾個(gè)寄存器比較容易弄混了:
SRCPND/SUBSRCPND:只要中斷產(chǎn)生的條件滿足,例如外部電平,定時(shí)溢出等等,SRCPND/SUBSRCPND的相應(yīng)位就會(huì)被置位,它不管其他地方的設(shè)置如何,所以某一時(shí)刻可能有幾個(gè)位同時(shí)被置位了(幾個(gè)中斷同時(shí)產(chǎn)生)。
INTMSK/INTSUBMSK:這個(gè)是中斷屏蔽位,清零表示允許中斷請(qǐng)求,默認(rèn)是禁止了所有的中斷請(qǐng)求。
INTPND:它表示處理器接下來就要去處理的那個(gè)中斷,某一時(shí)刻只可能有一個(gè)位被置位。這個(gè)寄存器置位的必要條件是SRCPND/SUBSRCPND已經(jīng)是1,而且INTMSK/INTSUBMSK相應(yīng)位已經(jīng)清零。
SRCPND/SUBSRCPND和INTPND都不會(huì)自動(dòng)清零,要程序向相應(yīng)的位寫1才能清零,這個(gè)有點(diǎn)奇怪。

2410不支持中斷嵌套,中斷產(chǎn)生后處理器進(jìn)入到IRQ模式,只有在等到這個(gè)中斷處理完之后才能響應(yīng)下一次中斷。
如果同時(shí)產(chǎn)生多個(gè)中斷,就涉及到了中斷優(yōu)先級(jí)的問題。SRCPND寄存器對(duì)應(yīng)的32個(gè)中斷源總共被分為6個(gè)組,每個(gè)組由一個(gè)ARBITER(0~5)對(duì)其進(jìn)行管理。中斷必須先由所屬組的ARBITER(0~5)進(jìn)行第一次優(yōu)先級(jí)判斷然后再到ARBITER6進(jìn)行第二次判斷。可以更改的只是組里的優(yōu)先級(jí)順序。
PRIORITY的各個(gè)位被分為兩種類型,一種是ARB_MODE,另一種為ARB_SEL,拿ARBITER0來說,這個(gè)組一共包含了四種中斷源:EINT0~EINT3,分別對(duì)應(yīng)Req0~Req3,很明顯ARB_SEL0就是決定了這四種中斷的優(yōu)先順序,如果這個(gè)組里的兩個(gè)中斷同時(shí)產(chǎn)生,將會(huì)把排在前面的先傳遞給ARBITER06進(jìn)行第二次判斷。ARB_MODE0置1代表開啟優(yōu)先級(jí)次序旋轉(zhuǎn),當(dāng)該位置為1之后,ARB_SEL0的值會(huì)在每處理完一次中斷后順次改變。
作者: 諸葛孔明    時(shí)間: 2009-7-27 12:29
中斷處理流程
啟動(dòng)代碼開始是一個(gè)異常向量表,這個(gè)向量表是固定的,由處理器決定,必須要放在0x0地址那個(gè)地方,這個(gè)跟51單片機(jī)的中斷向量表相類似。
    b     ResetHandler  
     b     HandlerUndef     ;handler for Undefined mode
     b     HandlerSWI     ;handler for SWI interrupt
     b     HandlerPabort     ;handler for PAbort
     b     HandlerDabort     ;handler for DAbort
     b     .         ;reserved
     b     HandlerIRQ     ;handler for IRQ interrupt
     b     HandlerFIQ     ;handler for FIQ interrupt
當(dāng)產(chǎn)生IRQ中斷時(shí),PC首先無條件地來到0x18這個(gè)地址處,這個(gè)0x18就是處理器決定的IRQ中斷的入口地址,所以要在這個(gè)地址處放一條跳轉(zhuǎn)指令b HandlerIRQ,PC接著跳轉(zhuǎn)到HandlerIRQ地址標(biāo)號(hào)處,這里存放著一個(gè)宏語句:
HandlerIRQ       HANDLER HandleIRQ
按照上面說的宏展開,其實(shí)是執(zhí)行這么一段語句:
     sub     sp,sp,#4         ;留下堆棧的第一個(gè)位置
    stmfd     sp!,{r0}         ;保護(hù)R0因?yàn)楹竺嬉肦0傳遞值
    ldr      r0,=HandleIRQ   ;將HandleIRQ這個(gè)地址標(biāo)號(hào)的值傳如R0
     ldr      r0,[r0]          ;取存放在HandleIRQ里的那個(gè)值
    str      r0,[sp,#4]       ;把取到的值壓入棧
    ldmfd    sp!,{r0,pc}      ;恢復(fù)R0并把PC指向HandleIRQ里存放的地址值
HandleIRQ里存放是什么值呢?代碼最后有個(gè)這樣的表,這個(gè)表就是在SDRAM里的另外一張異常向量表,這張表可以根據(jù)需要修改_ISR_STARTADDRESS的值來隨意更改它的位置。
         ^    _ISR_STARTADDRESS
HandleReset      #    4
HandleUndef      #    4
HandleSWI        #    4
HandlePabort     #    4
HandleDabort     #    4
HandleReserved   #    4
HandleIRQ        #    4
HandleFIQ        #    4
這里實(shí)現(xiàn)結(jié)構(gòu)化一片地址空間的目的,可見在HandleIRQ這里預(yù)留了4個(gè)字節(jié)的空間,但是這個(gè)空間里現(xiàn)在放的是什么東西呢?
在代碼的初始化過程中有這么一段代碼:
    ldr     r0,=HandleIRQ     ; Setup IRQ handler  
     ldr     r1,=IsrIRQ         
     str     r1,[r0]
原來是把IsrIRQ所在的地址值放到這個(gè)地方,那就是宏實(shí)現(xiàn)了把PC指向IsrIRQ的目的。程序來到IsrIRQ:
IsrIRQ  
     sub     sp,sp,#4        ;預(yù)留堆棧
     stmfd     sp!,{r8-r9}     ;保護(hù)R8,R9
   
     ldr     r9,=INTOFFSET   ;找出產(chǎn)生哪種中斷
     ldr     r9,[r9]
     ldr     r8,=HandleEINT0
     add     r8,r8,r9,lsl #2
     ldr     r8,[r8]
     str     r8,[sp,#8]
     ldmfd     sp!,{r8-r9,pc}   ;將PC指向相應(yīng)的中斷處理地址
假如產(chǎn)生了EINT0中斷來到了這里,那么PC將會(huì)跳轉(zhuǎn)到HandleEINT0里存放的地址值,與上面的相同,程序里有這個(gè)表:
HandleEINT0        #    4
HandleEINT1        #    4
HandleEINT2        #    4
HandleEINT3        #    4
HandleEINT4_7     #    4
    .
    .
    .
這個(gè)表在2410addr.h頭文件里也有對(duì)應(yīng)的定義,指向的是同樣的一塊地方:
    .
    .
    .
#define pISR_EINT0      (*(unsigned *)(_ISR_STARTADDRESS+0x20))
#define pISR_EINT1      (*(unsigned *)(_ISR_STARTADDRESS+0x24))
#define pISR_EINT2      (*(unsigned *)(_ISR_STARTADDRESS+0x28))
    .
    .
    .
問題是HandleEINT0存放的又是什么值呢?這就需要在初始化EINT0的時(shí)候?qū)懮线@么一句:
pISR_EINT0 = (unsigned )_IsrEINT0Service;
也就是把EINT0的中斷處理函數(shù)的地址寫到HandleEINT0地址處存放,那么到此PC就可以跳轉(zhuǎn)到_IsrEINT0Service里去了,這里完成你所需要的中斷處理過程。
作者: 諸葛孔明    時(shí)間: 2009-7-27 12:30





歡迎光臨 電子工程網(wǎng) (http://www.qingdxww.cn/) Powered by Discuz! X3.4
主站蜘蛛池模板: 免费福利在线看黄网站 | 麻豆精品传媒 | 2019自拍偷拍 | 日韩区在线观看 | 欧美videos另类精品 | 一级毛片在播放免费 | 国产手机国产手机在线 | 天使萌一区二区在线观看 | a级黄色毛片三个搞一 | 20款禁用软件app下载 | 欧美成人h版影院在线播放 欧美成人h版影片在线观看 | 日日射日日干 | 国产麻豆果冻传媒 | 男女免费视频网站 | 国产色司机在线视频免费观看 | 国产最新在线视频 | 永久国产| 青青草伊人久久 | 国产精品久久久久不卡绿巨人 | 四虎影视免费在线观看 | 欧美第六页 | 亚洲国产日韩欧美在线a乱码 | 欧美成人a大片 | 欧美操操 | 在线播放精品 | 午夜精品一区二区三区免费视频 | 久久2019| ww欧洲ww在线视频免费观看 | 免费大片黄在线观看日本 | 男人亚洲天堂 | 日韩欧美网 | 新91免费 | 欧美成人午夜视频免看 | 欧美性free极品另类 | 国产日韩在线观看视频 | 精品国产一区二区三区成人 | 看全色黄大色黄大片视频 | 亚洲综合成人网在线观看 | 国产精品自在自线免费观看 | 久久精品一区二区三区资源网 | 午夜a级理论片在线播放一级 |