主题:ETR186中断问题 共有34096人关注过本帖 |
---|
双赢 |
1楼 |
ETR186中断问题 Post By:2009-12-22 14:17:00 [只看该作者]
你好,我在应用你们ETR186开发板时,中断程序如果放得稍微长一点的话,就会出现死机的状态,即我在调试模式下进行调试时,中断没有反应,ETR186出现死机,调试界面自动退出,回到DOS下的黑屏输入界面。那是哪里的问题呢??? 顺便交代一下,在中断中的程序是我在键盘查询下也要响应的一个程序。在键盘下能完全实现,但在中断下就不行。
void interrupt IRQ5_ISR(__CPPARGS) {       UninstallISR_Extern(0x0d);/*原形为UninstallISR,因为与串口中断重名,所以改名*/        enable( );            print_data();       //NB_Delay(10000);      // put your code here         IRQ5cnt++;         outport( 0xff22, 0x0d);  } print_data()是我写的一个函数,已经在查询状态下验证过,没错; 还有就是如果我在程序中置入NB_Delay(10000);它是先延时10S,然后才在我的 print_data();向串口发送数据。这些都是哪里的原因呢??? 你Q是多少,可以在Q上聊下吗,我迫切希望得到问题的解决!!! |
|
单帖管理 | 引用 | 回复 |
lqk |
2楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2009-12-22 14:57:00 [只看该作者]
您好:
1、安装中断函数InstallISR(...)和卸载中断函数UninstallISR(...)都只应该执行一次,在你的代码中为什么在中断函数中又卸载了中断? 2、中断处理函数的执行时间不应太长,建议在中断函数中只置标志位,在主循环中通过查询标志,选择执行相应的程序。 在ETR186的开发光盘上(software\drivers)有中断使用的例程,你参考一下。 |
单帖管理 | 引用 | 回复 |
双赢 |
3楼 |
Post By:2009-12-22 15:05:00 [只看该作者]
我在中端函数中卸掉了中断主要是由于受到汇编中断关掉再开的影响。虽然说退出后中断没有开,但在我第一次进入中断时程序就已经在ETR186中死掉了,不过还得感谢你的提醒。可以去尝试另外一种方法。
|
|
单帖管理 | 引用 | 回复 |
lqk |
4楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2009-12-22 15:16:00 [只看该作者]
你说的中断关掉再开是通过enable( );和outport( 0xff22, 0x0d);实现的,不能用UninstallISR(...)函数。
|
单帖管理 | 引用 | 回复 |
双赢 |
5楼 |
Post By:2009-12-22 15:52:00 [只看该作者]
恩,我明白了,比如下面的Installisr只是置入新中断向量。enable()开总中断,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; |
|
单帖管理 | 引用 | 回复 |