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

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

到底是怎么中斷的?

作者:yaohuitime 欄目:ARM技術(shù)
到底是怎么中斷的?
 MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      ; 輸出的標號
        IMPORT  $IRQ_Exception_Function         ; 引用的外部標號

$IRQ_Label
        SUB     LR, LR, #4                      ; 計算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; 保存任務(wù)環(huán)境
        MRS     R3, SPSR                        ; 保存狀態(tài)
        STMFD   SP!, {R3}
        STMFD   SP, {LR}^                       ; 保存用戶狀態(tài)的SP,注意不能回寫
                                                ; 如果回寫的是用戶的SP,所以后面要調(diào)整SP
        SUB     SP, SP, #4

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; 切換到系統(tǒng)模式
       
        BL      $IRQ_Exception_Function         ; 調(diào)用c語言的中斷處理程序

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; 切換回irq模式
        LDMFD   SP, {LR}^                       ; 恢復(fù)用戶狀態(tài)的SP,注意不能回寫
                                                ; 如果回寫的是用戶的SP,所以后面要調(diào)整SP
        ADD     SP, SP, #4                      ;
        LDMFD   SP!, {R3}
        MSR     SPSR_cxsf, R3

        LDMFD   SP!, {R0-R3, R12, PC}^          ;
    MEND
void __irq  IRQ_Time0(void)
{  if( (IO0SET&BEEPCON) == 0 ) IO0SET = BEEPCON;    
     else  IO0CLR = BEEPCON;                        
            
   T0IR = 0x01;                                    // 清除中斷標志
   VICVectAddr = 0x00;                            // 通知VIC中斷處理結(jié)束
}


請問: 匯編代碼和C程序的關(guān)系是什么?中斷是怎么實現(xiàn)的?

2樓: >>參與討論
high
中斷條件滿足時候
pc會跳到0x18,
(處理器具體執(zhí)行步驟不太記得,大約是幾個:保存curmode_cpsr到irq_spsr,切換到irq模式,如果是thumb切換到arm,關(guān)閉CPSR_i, 返回值+4---lr+4,)

0x18就是匯編,這里是用宏實現(xiàn)。

匯編調(diào)用c程序。--之所以要切換回用戶模式調(diào)用,是irq模式堆棧一般設(shè)置很少,干脆用用戶堆棧。

* - 本貼最后修改時間:2006-7-4 15:27:23 修改者:high

3樓: >>參與討論
童志文
中斷嵌套
首先說明兩點:其一,該段代碼實現(xiàn)的是中斷嵌套,不是簡單的中斷;其二,‘void __irq  IRQ_Time0(void)’中__irq不需要,__irq告訴編譯器插入中斷上下文切換代碼,而在此處匯編代碼進行了上下文切換。

樓上匯編實現(xiàn)了一個宏,用到該宏如下聲明:Timer0_Handler  HANDLER Timer0
這樣在C語言中,實現(xiàn)void Timer0(void){  
   if( (IO0SET&BEEPCON) == 0 ) IO0SET = BEEPCON;    
     else  IO0CLR = BEEPCON;                        
            
   T0IR = 0x01;                                    // 清除中斷標志
   VICVectAddr = 0x00;                          // 通知VIC中斷處理結(jié)束
   }
要在C語言中聲明 void Timer0_Handler(void) 來調(diào)用宏。
VICVectAddr0 = (uint32)Timer0_Handler;// 設(shè)置Timer0向量地址。
這樣,當中斷發(fā)生時運行HANDER宏。HANDER進行現(xiàn)場保護并切換到SYS模式,此時可以響應(yīng)中斷了。再調(diào)用Timer0中斷處理函數(shù),Timer0執(zhí)行完后,HANDER切換到IRQ模式,恢復(fù)現(xiàn)場并正式退出中斷模式。

4樓: >>參與討論
smartcode
請看以前的帖子
http://bbs.21ic.com/club/bbs/list.asp?boardid=39&t=1995510&tp=%u7528%u4E8E%u4E2D%u65AD%u5D4C%u5957

* - 本貼最后修改時間:2006-7-5 9:26:59 修改者:zlgarm

5樓: >>參與討論
yaohuitime
不明白
那 BL   $IRQ_Exception_Function
是怎樣影射到C程序的?

6樓: >>參與討論
zlgarm
請查看C語言的宏參
 
7樓: >>參與討論
yaohuitime
在那里可以找到?
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
詢問!
時鐘節(jié)拍
請推薦用于uCOS II 學習的周立功開發(fā)套件
請一個關(guān)于堆棧指針的問題
有誰在2210上移植ucGui成功的,共享一下嘛
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號