rudolf
驱动小牛
驱动小牛
  • 注册日期2002-10-09
  • 最后登录2006-04-25
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1257回复:7

菜鸟的中断问题请教:

楼主#
更多 发布于:2002-11-14 17:55
例子:
 #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 :)
靠天靠地靠父母,不如靠自己。
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-14 18:08
你问的问题,要么不知所云(比如1),要么就是稀奇古怪,怎么回答?
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-14 18:10
1、2:
IRQL为硬件中断号,INTR为中断向量号, 那么:
if(IRQL < 8)
   INTR = IRQL+8
else
   INTR = IRQL+0x68

3:ISA中断为边沿触发,PCI中断才为电平触发。
4:CPU速度越快中断响应越快,但在多任务平台上还受软件调度影响。
少了e,就少了全部
jacobqzl
驱动小牛
驱动小牛
  • 注册日期2001-10-10
  • 最后登录2005-04-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-14 20:56
您说的问题是DOS下中断的问题,给您推荐一本书吧,该书把您所说的问题讲的很清楚。书名是:<<C语言高级编程>>。DOS下中断比较简单,就是获取中断向量的一个过程。
rudolf
驱动小牛
驱动小牛
  • 注册日期2002-10-09
  • 最后登录2006-04-25
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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的接口上可以检测到信号,但计数器的值没有变化。
那么是不是我的代码什么地方还有问题?
靠天靠地靠父母,不如靠自己。
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-18 22:15
oldtimehandler();
这一句不应该放在你的中断程序中,应该放在main()中,当满足关闭中断条件后再调用该语句.否则的话,放在中断程序中,会导致中断重入!
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-19 09:23
在setvetcor()后应该对0X21进行操作,打开对应的中断号。
好象是“0”表示允许中断如下:
unsinged char flag = inportb(0x21);
flag &= 0xfb ; //1111,1011
outportb(0x21)
少了e,就少了全部
mjm_d
驱动牛犊
驱动牛犊
  • 注册日期2004-05-21
  • 最后登录2004-11-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-06 06:51
IRQ2 能用吗?
IRQ2不是连接8259A从片到8259A主片的IRQ吗?
搞不懂了
游客

返回顶部