音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ù)
請(qǐng)教一個(gè)44b0的中斷返回問(wèn)題
我寫(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
將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
在非向量中斷方式的匯編中斷服務(wù)程序跳到c服務(wù)程序,然后返回?
加不加__irq有什么影響呢?

4樓: >>參與討論
gotoligang
需要加__irq
需要加__irq,這樣你你就可以全部用C語(yǔ)言寫(xiě)程序了,而不用再去考慮煩人的現(xiàn)場(chǎng)保護(hù)了,在中斷服務(wù)程序里面用到的寄存器,編譯器自動(dòng)都給你保護(hù)好了。

5樓: >>參與討論
ican
問(wèn)題是我是在匯編的中斷服務(wù)程序中調(diào)用c語(yǔ)言的
如果直接在向量中斷方式中調(diào)用c,似乎就要__IRQ,非中斷方式好像先調(diào)用匯編的服務(wù)程序,然后再調(diào)用c語(yǔ)言程序,似乎就不用加的吧?

6樓: >>參與討論
yaanhyy
我覺(jué)得你就沒(méi)有產(chǎn)生中斷激勵(lì)
你這是在程序初始化的時(shí)候設(shè)計(jì)的,你要產(chǎn)生了中斷以后,才能跳到
0x18,才能最終跳到IsrIRQ   ,你給中斷端口試試看,注意相關(guān)寄存器的設(shè)置要對(duì)。~

7樓: >>參與討論
ican
我不是跳不到IsrIRQ,而是不知道如何從c程序中返回
 
8樓: >>參與討論
ican
為什么初始化的時(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)不了中斷呢

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
急問(wèn)Fout時(shí)鐘和MLCK時(shí)鐘頻率有什么關(guān)系。
痛苦的問(wèn)!原來(lái)都可以用JTAG調(diào)試,現(xiàn)在燒一個(gè)程序后,不行了~
學(xué)ARM怎么下手?
關(guān)于LCD屏資料的網(wǎng)站有哪些?
2410板子加最小系統(tǒng)最便宜的多少RMB?
免費(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)