欧美成人aaaaa免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

技術(shù)頻道

44b啟動代碼詳解


S3C44B0的IRQ向量中斷模式和非向量中斷模式的概念:


注:arm7的工作模式是arm7的這個(gè)內(nèi)核提供的,而廠商在生產(chǎn)時(shí),在arm7這個(gè)內(nèi)核的基礎(chǔ)上,外擴(kuò)了各種中斷及其相關(guān)的中斷控制器,而這些中斷發(fā)生一般會進(jìn)入IRQ模式,這點(diǎn)很好理解。

(1)向量中斷模式(IRQ支持,F(xiàn)IQ不支持)
當(dāng)系統(tǒng)發(fā)生IRQ中斷時(shí)候,cpu的PC會讀取位于0x18處的IRQ中斷指令(也就是說跳到地址0x18處去執(zhí)行指令),然后CPU自動讀取對應(yīng)于該中斷源確定地址上的指令取代0x18處的指令(這個(gè)過程是由系統(tǒng)自動完成的,不需要用戶編程),通過跳轉(zhuǎn)指令,系統(tǒng)就直接跳轉(zhuǎn)到對應(yīng)地址,這樣節(jié)省了中斷處理時(shí)間,提高中斷處理速度。——通俗點(diǎn)說,如果采用了向量中斷模式,一旦發(fā)生中斷,CPU就會跳到相應(yīng)的地址來執(zhí)行指令。例如ADC中斷的向量地址為0xC0,一旦發(fā)生ADC中斷,PC就先跳到了地址0x18再跳到0xC0上來執(zhí)行命令,但對于用戶來說,就跟一發(fā)生中斷就直接跳到了0xC0上沒有區(qū)別,這個(gè)先跳到0x18的過程可以忽略不計(jì),由系統(tǒng)自動完成。如果在0xC0處放如下代碼: ldr PC , =HandlerADC ,當(dāng)ADC中斷產(chǎn)生的時(shí)候系統(tǒng)會自動跳轉(zhuǎn)到HandlerADC函數(shù)中。

(2)非向量中斷模式

這種模式處理方式是一種傳統(tǒng)的中斷處理方法,當(dāng)系統(tǒng)產(chǎn)生中斷的時(shí)候,系統(tǒng)將interrupt pending寄存器中對應(yīng)標(biāo)志位置位(當(dāng)然向量中斷模式也有這步發(fā)生),然后跳轉(zhuǎn)到地址0x18處。用戶需要在地址0x18處寫一個(gè)統(tǒng)一中斷函數(shù),該函數(shù)通過讀取interrupt pending寄存器中對應(yīng)標(biāo)志位,來判斷中斷源,并根據(jù)優(yōu)先級關(guān)系再跳到對應(yīng)中斷源的處理代碼中。

二、向量中斷模式的啟動代碼分析及編程。

1、中斷向量模式中,具體實(shí)現(xiàn)如下:

中斷服務(wù)入口地址處,寫入一個(gè)調(diào)用宏的指令(類似于子程序),這個(gè)宏是一個(gè)“加載程序”,把中斷服務(wù)的首地址裝載于pc中。具體調(diào)用一個(gè)框圖來表示,結(jié)合以下的程序理解,接下來還有一個(gè)針對框圖的具體的講解。以ADC中斷為例子:



注:(1)步驟①②③在出現(xiàn)在44binit.s,詳見我的啟動代碼中的注釋。

(2)_ISR_STARTADDRESS的定義在option.inc中:

_ISR_STARTADDRESS EQU 0xc7fff00

(3)步驟④在44b.H中定義:

#define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x20))

(4)在main.C或者其他的c文件里,寫入:

void __IRQ ISR_ADC(){……}和pISR_ADC=(unsignde)ISR_ADC

必須加入在中斷服務(wù)程序中__IRQ,以高速編譯器這個(gè)是一個(gè)中斷服務(wù)程序,這樣編譯器會在編譯時(shí)候加上返回用戶模式的代碼,以實(shí)現(xiàn)中斷后程序的自動返還。

2、具體的代碼解釋:

從上面的流程圖看出,44B0 中斷系統(tǒng)中有兩張中斷轉(zhuǎn)移表,經(jīng)過二重轉(zhuǎn)移才跳到中斷處理程序。第一張中斷向量表由硬件決定,所在區(qū)域?yàn)镽OM(flash),地址空間從0X00開始,其中0X00-0X1C為異常向量入口地址,0X20-0XC0為中斷向量入口地址。另一張中斷向量表在RAM 中,可以隨便改,其位置在程序連接后才定。由于 RAM 放在地址空間的高端(距離中斷向量超過了 32M),為了從第一張中斷向量表跳到第二張中斷向量表,故在第一張中斷向量表對應(yīng)位置上寫上 ldr PC,# interrupt_service 如:ldr PC,=HandlerEINT4567。

(1) 一級中斷向量表 以下為匯編代碼片斷,詳見44B0數(shù)據(jù)手冊11章——中斷控制器)

AREA Init,CODE,READONLY
;說明:關(guān)鍵字ENTRY告訴編譯器保留這段代碼;從代碼看Init段就是要寫入0x00地址的原始中斷向量,因此把這個(gè)文件編譯生成的44binit.O和Init填入ADS-Linker-Layout頁對應(yīng)項(xiàng)中。【這樣編譯器會把該段代碼編譯到0X0地址。】

ENTRY ;ENTRY程序入口標(biāo)號需要頂格式寫,否則出錯。

b ResetHandler ;復(fù)位異常 0x0000 0000
b HandlerUndef ;未定義異常 0x0000 0004
b HandlerSWI ;軟件中斷異常 0x0000 0008
b HandlerPabort ;指令預(yù)取異常 0x0000 000C
b HandlerDabort ;數(shù)據(jù)預(yù)取異常 0x0000 0010
b . ;保留 0x0000 0014
b HandlerIRQ ;外部中斷外設(shè)中斷都是在這里擴(kuò)展的 0x0000 0018
b HandlerFIQ ;快速中斷 0x0000 001C

VECTOR_BRANCH
ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table 0x00000020
ldr pc,=HandlerEINT1 ;
ldr pc,=HandlerEINT2 ;
……

……

b .
ldr pc,=HandlerADC ;mGKB 0x0000 00C0
b . ;
b . ;
b . ;
b . ;
b . ;mGKB
b .
b .
;0xe0=EnterPWDN
ldr pc,=EnterPWDN

LTORG

通過這段代碼,就在44B0的ROM中以0x00為起始地址的地方建立起了一張中斷向量表,而且這個(gè)表的順序完全符合44B0數(shù)據(jù)手冊中對中斷向量地址的定義要求。



2、 二級中斷向量表 ^ _ISR_STARTADDRESS ;一般為 #define _ISR_STARTADDRESS 0xc7fff00

HandleReset # 4

HandleUndef # 4

HandleSWI # 4

HandlePabort # 4

HandleDabort # 4

HandleReserved # 4

HandleIRQ # 4

HandleFIQ # 4

;Do not use the label ’IntVectorTable’,

;because armasm.exe can not recognize this label correctly.

;the value is different with an address you think it may be.

;IntVectorTable

HandleADC # 4

HandleRTC # 4

……

……

HandleEINT2 # 4

HandleEINT1 # 4

HandleEINT0 # 4 ;0xc1(c7)fff84

END

這段第一行 “^” 符號表示在RAM區(qū)開辟空間,就是偽代碼中的MAP。

^ _ISR_STARTADDRESS 表示在RAM的_ISR_STARTADDRESS處開辟一段空間。這里開辟的空間是用來存放中斷服務(wù)程序及其他異常處理程序地址的。每個(gè)中斷或其他異常都開辟4個(gè)字節(jié)的空間,這是因?yàn)镽AM區(qū)的程序地址要4個(gè)字節(jié)才能放得下。而中斷程序的地址是應(yīng)用程序在使用這個(gè)中斷時(shí),將中斷服務(wù)程序的地址存入這對應(yīng)的空間內(nèi)。



3、 中斷向量表最終指向 一般在44B.H等頭文件能找到對應(yīng)于二級中斷向量表的宏定義:片斷如下

#define pISR_RESET (*(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+0x10))

#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 (*(unsigned *)(_ISR_STARTADDRESS+0x24))

#define pISR_UTXD1 (*(unsigned *)(_ISR_STARTADDRESS+0x28))

#define pISR_UTXD0 (*(unsigned *)(_ISR_STARTADDRESS+0x2c))

……

……

#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x7c))

#define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x80))

#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x84))

一般在C文件中將自定義的中斷服務(wù)子程序地址放進(jìn)對應(yīng)宏中,如:

pISR_TIMER0 = (int) time_interrupt()



2、向量中斷和非向量中斷模式的詳細(xì)源碼分析

(1)向量中斷

在1中講到當(dāng)發(fā)生IRQ中斷時(shí),中斷控制器會在數(shù)據(jù)總線上加載分支指令跳到相應(yīng)中斷源的向量地址,即一級中斷向量表中對應(yīng)的中斷向量入口地址。

ldr pc,=HandlerEINT0 ; 0x20

ldr pc,=HandlerEINT1

……

ldr pc,=HandlerTIMER0 ; 0x60

ldr pc,=HandlerTIMER1

……

ldr pc,=HandlerADC ; 0xb4

……

由上述代碼可知,程序會跳轉(zhuǎn)到HandlerXXX中,定義如下:

HandlerFIQ HANDLER HandleFIQ

HandlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

HandlerADC HANDLER HandleADC

HandlerRTC HANDLER HandleRTC

……

HandlerEINT1 HANDLER HandleEINT1

HandlerEINT0 HANDLER HandleEINT0

HandlerXXX HANDLER HandleXXX為一個(gè)匯編宏,定義如下:

MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

;由于ADS僅支持FD(滿遞減)型堆棧

sub sp,sp,#4 ;將堆棧退一個(gè)字用于保存下面用到的R0

stmfd sp!,{r0} ;將R0壓入堆棧

ldr r0,=$HandleLabel ;將HandleLabel的地址賦給R0

ldr r0,[r0] ;將HandleLabel的地址指向的內(nèi)容(實(shí)際的執(zhí)行地址)賦給R0

str r0,[sp,#4] ;將對應(yīng)的中斷函數(shù)首地址入棧保護(hù)

ldmfd sp!,{r0,pc} ;將中斷函數(shù)的首地址出棧,放入PC中

MEND

由上宏定義可知,程序又跳到HandleXXX中執(zhí)行,即二級中斷向量表中的地址。為此綜上所述,便可跳到對應(yīng)的中斷服務(wù)子程序地址,執(zhí)行中斷!

(2)非向量中斷

前面講過,一旦產(chǎn)生IRQ中斷,微控制器會切換到IRQ模式,并且跳轉(zhuǎn)到一級向量表0x0000018地址處執(zhí)行程序;而FIQ則跳到0x000001C地址處。即

ENTRY

b ResetHandler ;復(fù)位異常 0x0000 0000
……
b HandlerIRQ ;外部中斷 0x0000 0018
b HandlerFIQ ;快速中斷 0x0000 001C
……

然后跳轉(zhuǎn)到宏HandlerIRQ HANDLER HandleIRQ 或 HandlerFIQ HANDLER HandleFIQ。

由以下代碼可知,HandleIRQ最終對應(yīng)的是IsrIRQ地址標(biāo)號。

;****************************************************

;* Setup IRQ handler *

;****************************************************

ldr r0,=HandleIRQ ;This routine is needed

ldr r1,=IsrIRQ str r1,[r0]

上述代碼位于ResetHandler為標(biāo)號的匯編代碼段內(nèi),板子上電或復(fù)位后,都要從位于0x0執(zhí)行b ResetHandler 的指令跳轉(zhuǎn)到ResetHandler為標(biāo)號的匯編代碼段處執(zhí)行,也就將HandleIRQ初始化為IsrIRQ。IsrIRQ代碼段如下:

IsrIRQ ;using I_ISPR register.

sub sp,sp,#4 ;reserved for PC

stmfd sp!,{r8-r9}

;IMPORTANT CAUTION

;if I_ISPC is not used properly, I_ISPR can be 0 in this routine.

ldr r9,=I_ISPR

ldr r9,[r9]

cmp r9, #0x0 ;If the IDLE mode work-around is used, r9 may be 0 sometimes.

beq %F2 ;相等就向后搜索跳轉(zhuǎn)標(biāo)號2.

mov r8,#0x0

0

movs r9,r9,lsr #1

bcs %F1 ;>= 就向后搜索跳轉(zhuǎn)標(biāo)號1.

add r8,r8,#4

b %B0 ;向前搜索跳轉(zhuǎn)標(biāo)號0.

1

ldr r9,=HandleADC

add r9,r9,r8 ;以HandleADC(r9)為基址,r8對應(yīng)所發(fā)生中斷源的偏移量

ldr r9,[r9] ;結(jié)果為二級中斷向量表中對應(yīng)中斷標(biāo)號地址HandleXXX

str r9,[sp,#8]

ldmfd sp!,{r8-r9,pc}

2

ldmfd sp!,{r8-r9}

add sp,sp,#4

subs pc,lr,#4

上述這段程序就是用來處理非向量中斷(比向量中斷方式多執(zhí)行的代碼段),具體判斷I_ISPR中各位是否置1 置1表示目前此中斷等待響應(yīng)(每次只能有一位置1),從最高優(yōu)先級中斷位開始判斷,檢測到等待服務(wù),中斷就將pc置為中斷服務(wù)函數(shù)首地址。這段代碼就是向量中斷和非向量中斷區(qū)別的根本所在,向量中斷利用硬件計(jì)算,直接通過一級中斷向量表中0X20-0XC0中斷向量入口地址跳轉(zhuǎn)到二級中斷向量表中對應(yīng)的HandleXXX地址,省掉了這段代碼的操作。

文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。

欧美成人aaaaa免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

      欧美一区日韩一区| 国内不卡一区二区三区| 亚洲激情欧美| 久久久蜜桃精品| 国产农村妇女毛片精品久久麻豆| 亚洲美女在线国产| 欧美成人免费在线观看| 在线观看亚洲精品视频| 久久精品1区| 国产亚洲一区在线播放| 午夜精品网站| 国产日韩欧美在线看| 香港久久久电影| 国产日韩一区欧美| 欧美在线免费视屏| 国产亚洲成精品久久| 欧美一区二区在线观看| 国产欧美日韩精品专区| 欧美一区二区三区四区视频| 国产日产欧美精品| 久久九九热re6这里有精品| 国内精品久久久久久久影视蜜臀 | 中国av一区| 国产精品萝li| 欧美一区二区三区喷汁尤物| 狠狠色狠狠色综合日日五| 久久久综合网站| 亚洲成人原创| 欧美日韩成人综合在线一区二区| 一区二区三区欧美亚洲| 国产精品久久久亚洲一区| 午夜精品视频在线观看| 狠狠久久婷婷| 欧美日韩精品欧美日韩精品| 一区二区三区日韩在线观看| 国产精品欧美久久| 久久精品91| 99国产精品久久久久久久成人热| 国产精品久久999| 久久久91精品国产| 日韩午夜精品视频| 国产精品一国产精品k频道56| 久久久久久综合| 日韩视频永久免费| 国产亚洲va综合人人澡精品| 女生裸体视频一区二区三区| 一区二区三区精品久久久| 国产亚洲激情| 欧美美女福利视频| 欧美在线视频在线播放完整版免费观看 | 欧美一区二区三区四区高清 | 国产综合香蕉五月婷在线| 欧美成人精品在线播放| 亚洲欧美日韩国产成人精品影院| 精品88久久久久88久久久| 欧美美女操人视频| 久久久91精品| 在线中文字幕一区| 亚洲高清视频在线观看| 国产精品乱看| 欧美精品在线观看91| 久久国产精品99国产精| 一区二区三区四区五区视频| 韩日成人在线| 国产精品久久一卡二卡| 欧美黄色精品| 久久久97精品| 午夜精品理论片| 亚洲乱码国产乱码精品精98午夜| 国产一区二区高清视频| 欧美无乱码久久久免费午夜一区 | 影音先锋亚洲视频| 国产欧美日韩精品丝袜高跟鞋| 欧美高清视频一二三区| 久久亚洲综合| 久久成人精品一区二区三区| 亚洲影院免费观看| 在线视频精品| 99国产精品久久| 亚洲精品乱码| 亚洲激情第一页| 亚洲第一色在线| 狠狠综合久久| 国产综合精品一区| 国产精品外国| 国产精品国产馆在线真实露脸| 欧美黑人在线观看| 欧美成人午夜激情| 男女精品网站| 欧美电影美腿模特1979在线看 | 国内久久视频| 国产亚洲福利社区一区| 国产亚洲福利社区一区| 国产专区精品视频| 国产一区二区视频在线观看| 国产视频精品xxxx| 国产一区二区激情| 好看的亚洲午夜视频在线| 国产自产2019最新不卡| 国内揄拍国内精品久久| 狠狠色丁香婷婷综合| 狠狠色狠狠色综合系列| 一区国产精品| 亚洲欧洲一区| 亚洲天堂免费观看| 亚洲欧美日韩一区在线| 小嫩嫩精品导航| 欧美主播一区二区三区| 久久经典综合| 欧美成人日韩| 欧美日韩午夜在线| 国产精品一区二区久久| 国产一区二区三区四区hd| 怡红院精品视频| 亚洲国产精品久久久久秋霞影院 | 亚洲老板91色精品久久| 在线一区日本视频| 欧美一级在线视频| 免费观看久久久4p| 欧美日韩国产在线| 国产日韩欧美| 亚洲欧洲日本专区| 在线视频一区观看| 久久疯狂做爰流白浆xx| 免费观看亚洲视频大全| 欧美视频观看一区| 国产一区二区精品久久| 亚洲日本欧美| 欧美一区二区高清| 欧美岛国在线观看| 国产精品一区二区男女羞羞无遮挡| 国产欧美日韩激情| 日韩视频―中文字幕| 先锋资源久久| 欧美精选一区| 国产自产女人91一区在线观看| 亚洲高清久久| 欧美亚洲在线| 欧美精品九九| 黄色亚洲网站| 亚洲综合日韩在线| 免费看成人av| 国产欧美日韩视频一区二区三区 | 欧美日韩高清免费| 国内精品视频一区| 正在播放欧美一区| 欧美成人免费在线| 国产亚洲综合在线| 亚洲视频你懂的| 欧美高清视频一二三区| 国产日韩一区| 亚洲伊人网站| 欧美激情精品久久久久久大尺度 | 在线观看日韩av先锋影音电影院| 亚洲在线中文字幕| 欧美激情一区二区| 亚洲第一色在线| 欧美有码在线视频| 国产精品三级视频| 中日韩在线视频| 欧美日本免费| 亚洲精品日韩精品| 美女国内精品自产拍在线播放| 国产精品视频观看| 中文在线不卡视频| 欧美顶级大胆免费视频| 精品成人a区在线观看| 欧美一区二区三区婷婷月色 | 午夜精品亚洲| 国产精品初高中精品久久| 日韩一区二区精品葵司在线| 欧美jizz19性欧美| 91久久嫩草影院一区二区| 免费观看国产成人| 在线精品视频免费观看| 久久一区二区三区av| 精品9999| 欧美大成色www永久网站婷| 在线欧美日韩国产| 美女诱惑黄网站一区| 亚洲电影av| 美女免费视频一区| 亚洲日本黄色| 欧美日韩精品一二三区| 一区二区三区高清在线| 欧美视频在线免费看| 亚洲一区二区欧美日韩| 欧美午夜一区| 性欧美精品高清| 激情欧美丁香| 欧美不卡视频一区| 一本色道久久综合狠狠躁篇的优点 | 暖暖成人免费视频| 亚洲精品影院| 国产精品久久久久999| 午夜性色一区二区三区免费视频| 国产欧美一区二区三区在线老狼 | 欧美激情按摩| 亚洲一区二区三区色| 国产欧美一区二区在线观看|