阅读:1257回复: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 :) |
|
|
沙发#
发布于:2002-11-14 18:08
你问的问题,要么不知所云(比如1),要么就是稀奇古怪,怎么回答?
|
|
|
板凳#
发布于:2002-11-14 18:10
1、2:
IRQL为硬件中断号,INTR为中断向量号, 那么: if(IRQL < 8) INTR = IRQL+8 else INTR = IRQL+0x68 3:ISA中断为边沿触发,PCI中断才为电平触发。 4:CPU速度越快中断响应越快,但在多任务平台上还受软件调度影响。 |
|
|
地板#
发布于:2002-11-14 20:56
您说的问题是DOS下中断的问题,给您推荐一本书吧,该书把您所说的问题讲的很清楚。书名是:<<C语言高级编程>>。DOS下中断比较简单,就是获取中断向量的一个过程。
|
|
地下室#
发布于: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-18 22:15
oldtimehandler();
这一句不应该放在你的中断程序中,应该放在main()中,当满足关闭中断条件后再调用该语句.否则的话,放在中断程序中,会导致中断重入! |
|
6楼#
发布于:2002-11-19 09:23
在setvetcor()后应该对0X21进行操作,打开对应的中断号。
好象是“0”表示允许中断如下: unsinged char flag = inportb(0x21); flag &= 0xfb ; //1111,1011 outportb(0x21) |
|
|
7楼#
发布于:2004-07-06 06:51
IRQ2 能用吗?
IRQ2不是连接8259A从片到8259A主片的IRQ吗? 搞不懂了 |
|