|
|||||||||||
| 技術(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 于 2006/7/4 15:25:00 發(fā)布:
中斷條件滿足時候 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樓: | >>參與討論 |
| 作者: 童志文 于 2006/7/4 15:38:00 發(fā)布:
中斷嵌套 首先說明兩點:其一,該段代碼實現(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 于 2006/7/4 15:48:00 發(fā)布:
請看以前的帖子 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 于 2006/7/5 8:27:00 發(fā)布:
不明白 那 BL $IRQ_Exception_Function 是怎樣影射到C程序的? |
|
| 6樓: | >>參與討論 |
| 作者: zlgarm 于 2006/7/5 8:31:00 發(fā)布:
請查看C語言的宏參 |
|
| 7樓: | >>參與討論 |
| 作者: yaohuitime 于 2006/7/5 9:12:00 發(fā)布:
在那里可以找到? |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |