| 
			 
					阅读:1448回复:7
				 
				菜鸟的中断问题请教:
					例子:
 
							#include <conio.h> #include <dos.h> #include <bios.h> #include <stdio.h> #define INTR 0x1c // The clock tick interrupt #ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif void interrupt ( *oldtimehandler)(__CPPARGS); void interrupt timehandler(__CPPARGS); long int time_clock=0; char flag=0; void main() { clrscr(); oldtimehandler = getvect(INTR); setvect(INTR, timehandler); while(bioskey(1)==0){ if(flag==1){ printf(\" %i\",time_clock); flag=0; } } } void interrupt timehandler(__CPPARGS) { disable(); //close other interrup time_clock++; oldtimehandler(); flag=1; enable(); } 问题: 1、在例程中的INTR和中断的对应关系是什么? 2、如要使用IRQ2,那么INTR应为什么? 3、在中断信号源的跳变电压是多少?(0-5V还是0-2.8V) 4、硬件中断响应的速度是否和CPU速度有关?若CPU主频为100MHZ那么响应的硬件中断最高能到多少HZ? :) :D :)  | 
	|
					
						
						
						
						
  | 
	
| 
			 沙发# 
								发布于:2004-07-06 06:51				
			
					IRQ2 能用吗?
 
							IRQ2不是连接8259A从片到8259A主片的IRQ吗? 搞不懂了  | 
	|
| 
			 板凳# 
								发布于:2002-11-19 09:23				
			
					在setvetcor()后应该对0X21进行操作,打开对应的中断号。
 
							好象是“0”表示允许中断如下: unsinged char flag = inportb(0x21); flag &= 0xfb ; //1111,1011 outportb(0x21)  | 
	|
					
						
  | 
	
| 
			 地板# 
								发布于:2002-11-18 22:15				
			
					oldtimehandler();
 
							这一句不应该放在你的中断程序中,应该放在main()中,当满足关闭中断条件后再调用该语句.否则的话,放在中断程序中,会导致中断重入!  | 
	|
| 
			 地下室# 
								发布于:2002-11-15 12:17				
			
					 多谢各位帮忙。
 
							现在问题简单了我用一个脉冲发生器作为硬件中断源,直接接到IRQ2的接口上。 然后利用中断去记数代码如下: #include <conio.h> #include <dos.h> #include <bios.h> #include <stdio.h> #define INTR 0x0a // IRQ2 #ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif void interrupt ( *oldtimehandler)(__CPPARGS); void interrupt timehandler(__CPPARGS); long int time_clock=0; char flag=0; void main() { clrscr(); //清屏 oldtimehandler = getvect(INTR); //保存环境变量 setvect(INTR, timehandler); //设定中断 while(bioskey(1)==0){ //若有键按下则推出 if(flag==1){ //若接收到新的中断则打印提示 printf(\" %i\",time_clock); //打印提示 flag=0; //中断标志置0 } } } void interrupt timehandler(__CPPARGS) { disable(); //关中断 time_clock++; //计数器加一 oldtimehandler(); //恢复原中断环境 outportb(0x20,0x20); //硬件中断结束 enable(); //开中断 flag=1; //中断标志置1 } 经实验,在IRQ2的接口上可以检测到信号,但计数器的值没有变化。 那么是不是我的代码什么地方还有问题?  | 
	|
					
						
  | 
	
| 
			 5楼# 
								发布于:2002-11-14 20:56				
			
					您说的问题是DOS下中断的问题,给您推荐一本书吧,该书把您所说的问题讲的很清楚。书名是:<<C语言高级编程>>。DOS下中断比较简单,就是获取中断向量的一个过程。				 
							 | 
	|
| 
			 6楼# 
								发布于:2002-11-14 18:10				
			
					1、2:
 
							IRQL为硬件中断号,INTR为中断向量号, 那么: if(IRQL < 8) INTR = IRQL+8 else INTR = IRQL+0x68 3:ISA中断为边沿触发,PCI中断才为电平触发。 4:CPU速度越快中断响应越快,但在多任务平台上还受软件调度影响。  | 
	|
					
						
  | 
	
| 
			 7楼# 
								发布于:2002-11-14 18:08				
			
					你问的问题,要么不知所云(比如1),要么就是稀奇古怪,怎么回答?				 
							 | 
	|
					
						
  |