|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請(qǐng)教一個(gè)44b0的中斷返回問(wèn)題 |
| 作者:ican 欄目:ARM技術(shù) |
我寫(xiě)一個(gè)按鍵中斷程序,用的是int4567這個(gè)中斷。希望按鍵之后進(jìn)入IsrIRQ這個(gè)中斷服務(wù)程序,然后判斷中斷的類型,然后跳轉(zhuǎn)到isrservice這個(gè)c語(yǔ)言程序。 IsrIRQ ;using I_ISPR register. sub sp,sp,#4 ;預(yù)留返回指針的存儲(chǔ)位置 stmfd sp!,{r8-r9} ldr r9,=I_ISPR ldr r9,[r9] ;載入I_ISPR cmp r9, #0x0 ;If the IDLE mode work-around is used,r9 may be 0 sometimes. beq %F2 ;無(wú)可處理中斷,返回 mov r8,#0x0 ;r8為偏移量,清零 0 movs r9,r9,lsr #1 ;從右向左逐位檢驗(yàn) bcs %F1 add r8,r8,#4 ;偏移量累加 b %B0 1 ldr r9,=HandleADC ;中斷處理表的首址 add r9,r9,r8 ;計(jì)算中斷處理表的入口地址 r9+r8,即裝載中斷處理函數(shù)的指針 覽 ldr r9,[r9] ;裝載中斷處理函數(shù)的地址 覽 str r9,[sp,#8] ;將中斷處理函數(shù)的地址存入剛才預(yù)留的位置,r8和r9的上面 ldmfd sp!,{r8-r9,pc} ;出棧后,pc指向的既是中斷處理函數(shù)的地址 2 ldmfd sp!,{r8-r9}^ ;恢復(fù)r8,r9 add sp,sp,#4 ;恢復(fù)棧指針 subs pc,lr,#4 ;返回 …… void irqservice(void) ;c言語(yǔ)服務(wù)程序 { Led_Display(0x1); } 結(jié)果發(fā)現(xiàn)挑進(jìn)了這個(gè)c語(yǔ)言服務(wù)程序后跳不出來(lái)了,也就是不會(huì)執(zhí)行l(wèi)dmfd sp!,{r8-r9}^這個(gè)指令了,請(qǐng)問(wèn)是為什么呢? |
| 2樓: | >>參與討論 |
| 作者: ican 于 2005/1/1 19:59:00 發(fā)布:
將void irqservice(void)改為 void __irq irqservice(void) 改了之后程序中斷后就反復(fù)在 ldmfd sp!,{r8-r9,pc} 和irqservice程序之間跳動(dòng),也就是說(shuō),執(zhí)行完 ldmfd sp!,{r8-r9,pc}之后,就執(zhí)行irqservice,跳出后還是在ldmfd sp!,{r8-r9,pc}。反復(fù)循環(huán),沒(méi)有辦法執(zhí)行跳出中斷的指令ldmfd sp!,{r8-r9}^ ;恢復(fù)r8,r9 add sp,sp,#4 ;恢復(fù)棧指針 subs pc,lr,#4 ;返回 |
|
| 3樓: | >>參與討論 |
| 作者: ican 于 2005/1/1 20:43:00 發(fā)布:
在非向量中斷方式的匯編中斷服務(wù)程序跳到c服務(wù)程序,然后返回? 加不加__irq有什么影響呢? |
|
| 4樓: | >>參與討論 |
| 作者: gotoligang 于 2005/1/2 13:49:00 發(fā)布:
需要加__irq 需要加__irq,這樣你你就可以全部用C語(yǔ)言寫(xiě)程序了,而不用再去考慮煩人的現(xiàn)場(chǎng)保護(hù)了,在中斷服務(wù)程序里面用到的寄存器,編譯器自動(dòng)都給你保護(hù)好了。 |
|
| 5樓: | >>參與討論 |
| 作者: ican 于 2005/1/2 13:56:00 發(fā)布:
問(wèn)題是我是在匯編的中斷服務(wù)程序中調(diào)用c語(yǔ)言的 如果直接在向量中斷方式中調(diào)用c,似乎就要__IRQ,非中斷方式好像先調(diào)用匯編的服務(wù)程序,然后再調(diào)用c語(yǔ)言程序,似乎就不用加的吧? |
|
| 6樓: | >>參與討論 |
| 作者: yaanhyy 于 2005/1/2 21:25:00 發(fā)布:
我覺(jué)得你就沒(méi)有產(chǎn)生中斷激勵(lì) 你這是在程序初始化的時(shí)候設(shè)計(jì)的,你要產(chǎn)生了中斷以后,才能跳到 0x18,才能最終跳到IsrIRQ ,你給中斷端口試試看,注意相關(guān)寄存器的設(shè)置要對(duì)。~ |
|
| 7樓: | >>參與討論 |
| 作者: ican 于 2005/1/2 21:45:00 發(fā)布:
我不是跳不到IsrIRQ,而是不知道如何從c程序中返回 |
|
| 8樓: | >>參與討論 |
| 作者: ican 于 2005/1/3 11:01:00 發(fā)布:
為什么初始化的時(shí)候加上用戶堆棧,連中斷都進(jìn)不去了 原來(lái)的程序初始化的時(shí)候沒(méi)有初始化用戶堆棧,所以程序一開(kāi)始就跑在svc模式下。我以為無(wú)法從匯編的中斷程序中調(diào)用c程序后無(wú)法返回是因?yàn)闆](méi)有進(jìn)入用戶模式的問(wèn)題,所以在初始化的時(shí)候加上了; bic r0,r0,#MODEMASK|NOINT orr r1,r0,#USERMODE msr cpsr_cxsf,r1 ldr sp,=UserStack 結(jié)果程序開(kāi)始的時(shí)候可以跑在用戶模式下了,但是卻不知道為什么進(jìn)不了中斷了?从脩裟J较碌腸psr也沒(méi)有屏蔽中斷啊,為什么就進(jìn)不了中斷呢 |
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |