主題:ETR186中斷問(wèn)題 共有39071人關(guān)注過(guò)本帖 |
---|
雙贏 |
1樓 |
ETR186中斷問(wèn)題 Post By:2009-12-22 14:17:00 [只看該作者]
你好,我在應(yīng)用你們ETR186開(kāi)發(fā)板時(shí),中斷程序如果放得稍微長(zhǎng)一點(diǎn)的話,就會(huì)出現(xiàn)死機(jī)的狀態(tài),即我在調(diào)試模式下進(jìn)行調(diào)試時(shí),中斷沒(méi)有反應(yīng),ETR186出現(xiàn)死機(jī),調(diào)試界面自動(dòng)退出,回到DOS下的黑屏輸入界面。那是哪里的問(wèn)題呢??? 順便交代一下,在中斷中的程序是我在鍵盤查詢下也要響應(yīng)的一個(gè)程序。在鍵盤下能完全實(shí)現(xiàn),但在中斷下就不行。
void interrupt IRQ5_ISR(__CPPARGS) {       UninstallISR_Extern(0x0d);/*原形為UninstallISR,因?yàn)榕c串口中斷重名,所以改名*/        enable( );            print_data();       //NB_Delay(10000);      // put your code here         IRQ5cnt++;         outport( 0xff22, 0x0d);  } print_data()是我寫的一個(gè)函數(shù),已經(jīng)在查詢狀態(tài)下驗(yàn)證過(guò),沒(méi)錯(cuò); 還有就是如果我在程序中置入NB_Delay(10000);它是先延時(shí)10S,然后才在我的 print_data();向串口發(fā)送數(shù)據(jù)。這些都是哪里的原因呢??? 你Q是多少,可以在Q上聊下嗎,我迫切希望得到問(wèn)題的解決!!! |
|
單帖管理 | 引用 | 回復(fù) |
lqk |
2樓 信息 | 搜索 | 郵箱 |
加好友 發(fā)短信 |
Post By:2009-12-22 14:57:00 [只看該作者]
您好:
1、安裝中斷函數(shù)InstallISR(...)和卸載中斷函數(shù)UninstallISR(...)都只應(yīng)該執(zhí)行一次,在你的代碼中為什么在中斷函數(shù)中又卸載了中斷? 2、中斷處理函數(shù)的執(zhí)行時(shí)間不應(yīng)太長(zhǎng),建議在中斷函數(shù)中只置標(biāo)志位,在主循環(huán)中通過(guò)查詢標(biāo)志,選擇執(zhí)行相應(yīng)的程序。 在ETR186的開(kāi)發(fā)光盤上(software\drivers)有中斷使用的例程,你參考一下。 |
單帖管理 | 引用 | 回復(fù) |
雙贏 |
3樓 |
Post By:2009-12-22 15:05:00 [只看該作者]
我在中端函數(shù)中卸掉了中斷主要是由于受到匯編中斷關(guān)掉再開(kāi)的影響。雖然說(shuō)退出后中斷沒(méi)有開(kāi),但在我第一次進(jìn)入中斷時(shí)程序就已經(jīng)在ETR186中死掉了,不過(guò)還得感謝你的提醒。可以去嘗試另外一種方法。
|
|
單帖管理 | 引用 | 回復(fù) |
lqk |
4樓 信息 | 搜索 | 郵箱 |
加好友 發(fā)短信 |
Post By:2009-12-22 15:16:00 [只看該作者]
你說(shuō)的中斷關(guān)掉再開(kāi)是通過(guò)enable( );和outport( 0xff22, 0x0d);實(shí)現(xiàn)的,不能用UninstallISR(...)函數(shù)。
|
單帖管理 | 引用 | 回復(fù) |
雙贏 |
5樓 |
Post By:2009-12-22 15:52:00 [只看該作者]
恩,我明白了,比如下面的Installisr只是置入新中斷向量。enable()開(kāi)總中斷,outport( 0xff22, 0x0f );置IRQ5中斷向量,剛才你提醒了我一下,換一種思想去編程,成功了,謝了!!! int InstallISR( int intno ) {    switch( intno )       {       case 0x0d:    outport( 0xff3a, inport(0xff3a)|MaskBit ); // mask irq5    oldIRQ5handler = getvect( intno );    setvect( intno, IRQ5_ISR );    outport( 0xff3a, inport(0xff3a)&~MaskBit ); // unmask irq5    break; |
|
單帖管理 | 引用 | 回復(fù) |