中斷是我們嵌入式開發(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ù)入口地址。
上表中的 指令都是在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í)行到,程序就會跑飛。
上一篇:ARM處理器架構(gòu)------可嵌套中斷的實現(xiàn)
下一篇:ARM處理器架構(gòu)----處理器的工作狀態(tài)
推薦閱讀
史海拾趣
進入21世紀(jì)后,Electroswitch開始積極實施國際化戰(zhàn)略。公司通過收購和兼并等方式,不斷拓展海外市場。同時,公司還加強了與國際知名企業(yè)的合作,共同開發(fā)新產(chǎn)品和新技術(shù)。這些舉措使得Electroswitch的國際化水平得到了顯著提升,也為公司的未來發(fā)展奠定了堅實的基礎(chǔ)。
隨著市場競爭的加劇,Electroswitch意識到僅僅依靠產(chǎn)品質(zhì)量已經(jīng)不足以贏得市場。因此,公司開始注重提升服務(wù)質(zhì)量,為客戶提供更加全面和專業(yè)的支持。通過加強售前咨詢、售后服務(wù)以及技術(shù)支持等方面的投入,Electroswitch成功贏得了客戶的信任和忠誠。這也使得公司在電子行業(yè)中的地位得到了進一步提升。
進入20世紀(jì)90年代,電子行業(yè)的技術(shù)革新日新月異。Connor-Winfield敏銳地捕捉到了市場的變化,開始將產(chǎn)品線擴展到其他領(lǐng)域,以滿足更多客戶的需求。除了石英計時電路和振蕩器,公司還開始研發(fā)和生產(chǎn)一系列與電子應(yīng)用緊密相關(guān)的產(chǎn)品。這些新產(chǎn)品的推出,不僅進一步鞏固了公司在行業(yè)內(nèi)的地位,也為其開拓了更廣闊的市場空間。
隨著電子行業(yè)的不斷發(fā)展,數(shù)據(jù)治理和云數(shù)據(jù)湖領(lǐng)域也面臨著越來越多的挑戰(zhàn)。Dremio公司始終保持敏銳的市場洞察力,積極應(yīng)對各種挑戰(zhàn)。他們不斷投入研發(fā)資源,推出了一系列創(chuàng)新產(chǎn)品和技術(shù)解決方案。例如,他們開發(fā)了一種基于人工智能的數(shù)據(jù)分析引擎,能夠自動識別和預(yù)測數(shù)據(jù)中的異常和趨勢。這一技術(shù)不僅提高了數(shù)據(jù)分析的準(zhǔn)確性和效率,也為企業(yè)提供了更全面的數(shù)據(jù)支持。
2023年10月,華為坤靈(HUAWEI eKit)在德國慕尼黑成功舉辦了分銷品牌發(fā)布會,這是其在歐洲市場的首個國家級發(fā)布活動。通過簡化交易流程、打造高效的平臺和工具、整合伙伴體系等措施,HUAWEI eKit為德國及歐洲市場的中小企業(yè)提供了靈活易用的產(chǎn)品解決方案。同時,HUAWEI eKit還致力于為中小企業(yè)市場的各種業(yè)務(wù)場景開發(fā)易買易賣、易裝易維、易學(xué)易用的分銷產(chǎn)品,贏得了市場的廣泛認(rèn)可。
2023年10月,華為坤靈(HUAWEI eKit)在香港成功舉辦了分銷新品發(fā)布會。針對香港市場的特點,HUAWEI eKit展示了面向SOHO辦公、酒店餐飲、商業(yè)地產(chǎn)、零售商超等場景的新品,并通過整合政策、產(chǎn)品、解決方案、服務(wù)和數(shù)字工具平臺等措施,助力香港區(qū)域分銷伙伴不斷開拓中小企業(yè)市場。通過與聯(lián)強國際(香港)有限公司(SYNNEX)的緊密合作,HUAWEI eKit成功吸引了超過100名香港分銷商參與此次發(fā)布會,進一步鞏固了其在香港市場的地位。
請教有沒有能夠測量高頻隨時間變化的大電流(上千安)的傳感器或者別的方法么?我不一定要得到具體數(shù)值,因為是高頻變化,所以能看見變化趨勢就可以了。謝謝各位!… 查看全部問答∨ |
本帖最后由 paulhyde 于 2014-9-15 09:53 編輯 如果有關(guān)于電子設(shè)計大賽通信和小車方面的預(yù)測和資料,希望能得到,wawj-111@163.com … 查看全部問答∨ |
一、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 ...… 查看全部問答∨ |
各位大蝦好!小第初學(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 ...… 查看全部問答∨ |
|
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ā)板 精華推薦
- 嵌入式學(xué)習(xí)篇丨迅為4412開發(fā)板Android4.4系統(tǒng)編譯
- Linux系統(tǒng)編程篇丨迅為IMX6ULL-對應(yīng)視頻講解
- 嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯編-源碼分析(一)嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯
- 迅為IMX6ULL開發(fā)板-主頻和時鐘配置例程(二)
- 迅為IMX6ULL開發(fā)板-主頻和時鐘配置例程
- 迅為IMX6ULL開發(fā)板安裝VMware Tool工具
- i.MX6ULL終結(jié)者Debian文件系統(tǒng)的構(gòu)建i.MX6ULL 移植Debian文件系統(tǒng)
- 迅為i.MX6ULL開發(fā)板按鍵例程編譯及運行
- 迅為-i.MX6開發(fā)板手冊更新-非設(shè)備樹uboot-修改默認(rèn)環(huán)境變量
- Linux系統(tǒng)編程篇丨迅為IMX6ULL-對應(yīng)視頻講解
- 嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯編-源碼分析(一)嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯
- 迅為IMX6ULL開發(fā)板-主頻和時鐘配置例程(二)
- 迅為IMX6ULL開發(fā)板-主頻和時鐘配置例程
- 迅為IMX6ULL開發(fā)板安裝VMware Tool工具
- i.MX6ULL終結(jié)者Debian文件系統(tǒng)的構(gòu)建i.MX6ULL 移植Debian文件系統(tǒng)
- 迅為i.MX6ULL開發(fā)板按鍵例程編譯及運行
- 迅為-i.MX6開發(fā)板手冊更新-非設(shè)備樹uboot-修改默認(rèn)環(huán)境變量
- 迅為-IMX6ULL-QT應(yīng)用_在開發(fā)板上移植ssh
- 迅為-i.MX6ULL開發(fā)板-QT實戰(zhàn)項目DHT11&網(wǎng)絡(luò)編程實戰(zhàn)練習(xí)(一)
- 賴偉德4K產(chǎn)業(yè)大會:五個維度分析中國具備發(fā)展4K產(chǎn)業(yè)的條件
- 醫(yī)療電子改變生活:這9家公司正在把智能數(shù)字藥丸變?yōu)楝F(xiàn)實
- 微流控系統(tǒng)分離CTCs方法及背景介紹
- 77GHz雷達信號處理流程框圖及應(yīng)用方案
- 人工智能的機遇和挑戰(zhàn)
- 用STM32F407玩控制—常規(guī)PID控制
- 用STM32F407玩控制—不完全微分PID控制
- 用STM32F407玩控制—史密斯預(yù)估補償控制
- 用STM32F407玩控制—繼電反饋法PID參數(shù)自動整定
- 用STM32F407玩控制—模式設(shè)別法PID參數(shù)自動整定