娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

中斷是我們嵌入式開發(fā)很常用到的一種資源和編程手段。這篇文章重點分析arm的中斷處理流程。


首先,中斷是異常的一種。當(dāng)發(fā)生一種異常時,處理器會進入不同的工作模式。ARM的異常和相應(yīng)的模式之間的對應(yīng)關(guān)系見下表:

當(dāng)一個異常導(dǎo)致模式的改變時,ARM核自動地:


1、把cpsr保存到相應(yīng)模式下的spsr


2、把pc保存到相應(yīng)模式下的lr


3、設(shè)置cpsr為相應(yīng)異常模式


4、設(shè)置pc為相應(yīng)異常處理程序的入口地址


對于IRQ或者FIQ而言,還多一項變化:禁用相關(guān)的中斷IRQ或FIQ,禁止同類型的其他中斷被觸發(fā)。(這也是自動實現(xiàn)的,因此正常情況下,ARM中斷不可嵌套)


從異常中斷處理程序退出時,需要我們在程序中用軟件實現(xiàn)下面兩個操作:


1、從spsr_mode中恢復(fù)數(shù)據(jù)到cpsr中


2、從lr_mode中恢復(fù)內(nèi)容到pc中,返回到異常中斷的指令的下一條政令處執(zhí)行.


2440默認(rèn)的有一個異常向量表,即發(fā)生某一個異常后,會根據(jù)異常向量表設(shè)置pc為相應(yīng)的處理函數(shù)入口地址。

image.png

上表中的 指令都是在2440init.s中的程序表示。


下面,我們結(jié)合板子自帶的2440test源代碼中的2440init.s中的異常處理,來分析arm中斷處理的實現(xiàn)。


首先,在2440init.s中有:


__ENTRY

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

這里就是相應(yīng)的 異常處理向量表。程序正常啟動就跳轉(zhuǎn)到resethandler,如果是發(fā)生中斷就跳轉(zhuǎn)到handlerIRQ。對于handlerIRQ,它是用一個宏實現(xiàn)的。


MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)

ldr     r0,=$HandleLabel;load the address of HandleXXX to r0

ldr     r0,[r0] ;load the contents(service routine start address) of HandleXXX

str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack

ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)

MEND

上面是宏的聲明。下面是具體用到宏的地方。

HandlerFIQ      HANDLER HandleFIQ

HandlerIRQ      HANDLER HandleIRQ

HandlerUndef    HANDLER HandleUndef

HandlerSWI      HANDLER HandleSWI

HandlerDabort   HANDLER HandleDabort

HandlerPabort   HANDLER HandlePabort

上面的這段程序在編譯的時候會被編譯器展開,我們可以將其中的IRQ相關(guān)的展開如下:

HandlerIRQ   HANDLER  HandleIRQ 會被下面的代碼段替換:


HandlerIRQ

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!,{r0} ;PUSH the work register to stack(lr does''t push because it return to original address)

ldr     r0,=HandleIRQ   ;load the address of HandleXXX to r0

ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX

str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack

ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)


因此,發(fā)生中斷時,就會b HandlerIRQ,跳轉(zhuǎn)到上面的代碼進行執(zhí)行。按照上面的流程,處理器會把HandleIRQ地址中所存儲的數(shù) 付給pc指針,作為下一條指令的地址,然后執(zhí)行。那么HandleIRQ地址中存儲的數(shù)是什么呢?


在2440init.s中有這樣一段程序:


ldr r0,=HandleIRQ ;This routine is needed

ldr r1,=IsrIRQ    ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c

str r1,[r0]

從這里,可以看出,HandleIRQ中存的是IsrIRQ。所以處理器會跳轉(zhuǎn)到isrIRQ中執(zhí)行。

IsrIRQ

sub sp,sp,#4       ;reserved for PC

stmfd sp!,{r8-r9}

 

ldr r9,=INTOFFSET

ldr r9,[r9]

ldr r8,=HandleEINT0

add r8,r8,r9,lsl #2

ldr r8,[r8]

str r8,[sp,#8]

ldmfd sp!,{r8-r9,pc}


在上面的程序中,INTOFFSET表示的是中斷號對于EINT0的偏移號。這樣計算得到中斷向量號之后,跳轉(zhuǎn)到中斷函數(shù)進行處理。對于,上面的程序奇怪的一點是沒有看到恢復(fù)cpsr和pc指針。因此,可以推斷,對于中斷函數(shù)在ADS中有特殊的聲明方式,如:static void __irq Uart_DMA_ISR(void)。像這種聲明方式,在編譯的時候,編譯器會自動在函數(shù)的末尾添加恢復(fù)cpsr和pc的語句。另外, 寄存器r0-r12也是需要保護的,因為在中斷函數(shù)和原來的上下文中都會用到,所以,我認(rèn)為 編譯器在中斷處理函數(shù)中對r0-r12也進行了保護和恢復(fù)。



另外,在ucosII中,對IsrIRQ函數(shù)進行了修改,我們后面再進行分析。


另外,我們用軟件實現(xiàn)了一套中斷向量表:


ALIGN

AREA RamData, DATA, READWRITE

^   _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00

HandleReset #   4

HandleUndef #   4

HandleSWI #   4

HandlePabort    #   4

HandleDabort    #   4

HandleReserved  #   4

HandleIRQ #   4

HandleFIQ #   4

 

;Don''t use the label 'IntVectorTable',

;The value of IntVectorTable is different with the address you think it may be.

;IntVectorTable

;@0x33FF_FF20

HandleEINT0 #   4

HandleEINT1 #   4

HandleEINT2 #   4

HandleEINT3 #   4

HandleEINT4_7 #   4

HandleEINT8_23 #   4

HandleCAM #   4 ; Added for 2440.

HandleBATFLT #   4

HandleTICK #   4

HandleWDT #   4

HandleTIMER0 #   4

HandleTIMER1 #   4

HandleTIMER2 #   4

HandleTIMER3 #   4

HandleTIMER4 #   4

HandleUART2  #   4

;@0x33FF_FF60

HandleLCD #   4

HandleDMA0 #   4

HandleDMA1 #   4

HandleDMA2 #   4

HandleDMA3 #   4

HandleMMC #   4

HandleSPI0 #   4

HandleUART1 #   4

HandleNFCON #   4 ; Added for 2440.

HandleUSBD #   4

HandleUSBH #   4

HandleIIC #   4

HandleUART0 #   4

HandleSPI1 #   4

HandleRTC #   4

HandleADC #   4

;@0x33FF_FFA0

之前,我們在發(fā)生中斷時,pc指針就跳轉(zhuǎn)到了 HandleIRQ地址中所存儲的數(shù) 出執(zhí)行。也就是說在HandleIRQ中存的是異常處理函數(shù)的入口地址。這就是異常處理向量表的作用。

所以,我們可以看出,對于2440init.s實現(xiàn)的異常處理,采用的是兩級向量表機制。 第一級向量表是arm核自己實現(xiàn)的,發(fā)生相應(yīng)的異常時,pc指針跳轉(zhuǎn)到0x18地址中存的數(shù),作為入口地址。 第二級向量表是由Handler宏實現(xiàn)的,繼續(xù)跳轉(zhuǎn)到 HandleIRQ地址中存的數(shù),繼續(xù)執(zhí)行。 

而對于IRQ來講,還有第三級的向量表,在IsrIRQ中,又會根據(jù)中斷號,比如uart2的中斷,跳轉(zhuǎn)到 HandleUart2地址中 存的數(shù),繼續(xù)執(zhí)行。



在2440init.s中,并沒有給HandleUndef等這些地址處賦值,因此,一旦執(zhí)行到,程序就會跑飛。

關(guān)鍵字:ARM  處理器架構(gòu)  異常  中斷處理 引用地址:ARM處理器架構(gòu)-----異常/中斷處理

上一篇:ARM處理器架構(gòu)------可嵌套中斷的實現(xiàn)
下一篇:ARM處理器架構(gòu)----處理器的工作狀態(tài)

推薦閱讀

集微網(wǎng)消息,彭博于10月5日爆出的“間諜芯片門”雖無實質(zhì)證據(jù),但是對產(chǎn)業(yè)的影響仍在持續(xù)發(fā)酵。近日,韓國政府懷疑本國的眾多服務(wù)器主板中被Super Micro的所謂改裝芯片入侵,韓國公共機構(gòu)和研究機構(gòu)將對其服務(wù)器進行徹底排查,并計劃在發(fā)現(xiàn)安全問題時更換其計算機系統(tǒng)。市場研究公司IDC數(shù)據(jù)顯示,Super Micro占全球數(shù)據(jù)中心服務(wù)器市場的10%。韓國方面認(rèn)...
“經(jīng)常尋找‘迷路’的它,掃的不干凈還需人工掃、清理塵盒易揚塵影響我們的健康”作為一款能幫我們減輕家庭負(fù)擔(dān)的智能掃地機,似乎并沒有讓我們省心省力。致力打造家居清潔服務(wù)的一站式解決方案的聯(lián)想,推出了全球首款自動集塵的掃拖一體機器人,自動集塵、掃拖一體、導(dǎo)航等高能設(shè)計,不僅彌補了用戶體驗上的不足,更是完全碾壓石頭、科沃斯等產(chǎn)品。 究...
歷史總是驚人的相似,記得在數(shù)百年前美國獨立戰(zhàn)爭之后,美國全力發(fā)展自己的工業(yè)體系,但是當(dāng)年的全球霸主英國對其實行了全面技術(shù)封鎖。比如說英國將蒸汽機和珍妮紡紗機列為“高科技產(chǎn)品”,禁止對美國出口。現(xiàn)今,美國的科技力量處于全球領(lǐng)先位置,不僅與中國開啟了“毛衣戰(zhàn)”,同時還對我國部分企業(yè)進行高端技術(shù),芯片技術(shù)無疑是其中的重點技術(shù)封鎖。集成...
stm8l051F3使用stvd進行仿真調(diào)試時提示如下錯誤: Running Linkerclnk -l"C:Program Files (x86)COSMICCXSTM8Lib" -o Debugstm8l051_sx1278.sm8 -mDebugstm8l051_sx1278.map Debugstm8l051_sx1278.lkf #error clnk Debugstm8l051_sx1278.lkf:1 segment .bss size overflow (293) The command: "clnk -l"C:Program Files (x86)COSMICC...

史海拾趣

問答坊 | AI 解惑

求助:測量大的時變高頻電流的方法

請教有沒有能夠測量高頻隨時間變化的大電流(上千安)的傳感器或者別的方法么?我不一定要得到具體數(shù)值,因為是高頻變化,所以能看見變化趨勢就可以了。謝謝各位!…

查看全部問答∨

電子設(shè)計大賽

本帖最后由 paulhyde 于 2014-9-15 09:53 編輯 如果有關(guān)于電子設(shè)計大賽通信和小車方面的預(yù)測和資料,希望能得到,wawj-111@163.com  …

查看全部問答∨

呼叫daicheng

一、vivi下如何用命令方式修改MACH_TYPE?用命令方式修改,就不用重新make vivi了吧? 二、我用的就是廠家提供的vivi鏡像和內(nèi)核鏡像,可是燒進去不能啟動。 你幫我看看下面這個分區(qū)有問題嗎?我的flash是64M,可是vivi好像沒有全部將它分區(qū)。 啟動 ...…

查看全部問答∨

為什么NAND flash以page為單位讀寫,SD card以block為單位讀寫?

NAND flash以page為單位讀寫,以block為單位erase, SD card的存儲介質(zhì)用的是NAND flash,為什么卻已block為單位讀寫呢?《SD SPEC》甚至都沒有page這個概念。 《SD SPEC》還提到set block length 用CMD16,block的長度不是該由NAND FLASH的硬件組 ...…

查看全部問答∨

128M sdram的BOOT在開發(fā)系統(tǒng)上能運行,但是燒寫到FLASH運行總是異常

開發(fā)環(huán)境:S3C2440,ADS1.2,PB5.0 使用UL的BOOT代碼為基礎(chǔ)將64M SDRAM改動為128M SDRAM. 硬件已經(jīng)實現(xiàn),軟件改動后使用開發(fā)系統(tǒng)連接一塊板子 (這塊板子的NAND FLASH原本在64M SDRAM運行時BOOT和系統(tǒng)都是正常的,為調(diào)試128M SDRAM,將64M的SDRAM換成12 ...…

查看全部問答∨

PB4.2添加MFC生成SDK后安裝后沒有MFC文件夾

各位大蝦好!小第初學(xué)WINCE,現(xiàn)在碰到一個問題,我在PB4.2添加了MFC,然后rebuild。 再build  SDK。  但是我安裝SDK后C:\\Program Files\\Windows CE Tools\\wce420\\SMDK2410下沒有MFC文件夾,這是什么原因呢?    …

查看全部問答∨

關(guān)于藍牙WSALookupServiceNext()錯誤10050的問題

各位大俠我最近初學(xué)藍牙,準(zhǔn)備在WIN CE 5.0 平臺下用SOCKET進行藍牙的開發(fā)。 但是在查找設(shè)備的時候總是出錯。是在WSALookupServiceNext()這一步的時候出現(xiàn)了錯誤,錯誤代碼為10050 好像是沒有找到藍牙設(shè)備,用CE里的例子試也是出現(xiàn)錯誤代碼10 ...…

查看全部問答∨

內(nèi)核\協(xié)議棧\驅(qū)動

大家談?wù)勥@三者的關(guān)系啊…

查看全部問答∨

DP51 按鍵問題,當(dāng)1個鍵按下時是什么判斷的?部分程序有點看不懂,請教一下

#define RCtrl                0x10        void send_shift(uchar d) {         uchar i;         for(i = 0x80; i >= 0x01; i=i ...…

查看全部問答∨

初步相識LM3S811,感覺設(shè)計門檻降低的真是驚人!----學(xué)習(xí)一

初步相識LM3S811,感覺設(shè)計門檻降低的真是驚人!,竟然各種需要的函數(shù)都設(shè)計好了,只要調(diào)用就可以了,根本不需要熟悉繁雜的寄存器。我把初次掌握的東西發(fā)給大家,供參考。 1、系統(tǒng)工作的時鐘配置方法 在 clockInit( )函數(shù)里,庫函數(shù) SysCtlLDOSe ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 吉安县| 辽中县| 吉隆县| 蓬安县| 阿城市| 明水县| 滨海县| 宿州市| 栖霞市| 城市| 精河县| 本溪市| 钟山县| 禄丰县| 吉安市| 民县| 新乐市| 南乐县| 旬阳县| 宜兴市| 江都市| 肥城市| 黄龙县| 莱州市| 萝北县| 奉节县| 顺昌县| 兰坪| 黎平县| 修文县| 丹东市| 丹寨县| 怀宁县| 海兴县| 修水县| 绿春县| 临漳县| 尤溪县| 徐闻县| 甘孜| 长宁区|