首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于中断的一点点有关问题

2012-03-24 
关于中断的一点点问题/*这个程序每隔1秒钟输出一个整数,10秒钟后结束程序。按escape键提前退出程序。*/#incl

关于中断的一点点问题
/*   这个程序每隔1秒钟输出一个整数,10秒钟后结束程序。
      按escape键提前退出程序   。*/

#include   <stdio.h>
#include   <dos.h>
#include   <conio.h>

/*   Escape   key   */
#define   VK_ESC   0x11b  

#define   TIMER   0x1c         /*   时钟中断的中断号   */

/*   中断处理函数在C和C++中的表示略有不同。
      如果定义了_cplusplus则表示在C++环境下,否则是在C环境下。   */

#ifdef   __cplusplus
        #define   __CPPARGS   ...
#else
#define   __CPPARGS
#endif

int   TimerCounter=0;   /*   计时变量,每秒钟增加18。   */

/*   指向原来时钟中断处理过程入口的中断处理函数指针(句柄)   */
void   interrupt   (   *oldhandler)(__CPPARGS);

/*   新的时钟中断处理函数   */
void   interrupt   newhandler(__CPPARGS)
{
/*   increase   the   global   counter   */
      TimerCounter++;

/*   call   the   old   routine   */
      oldhandler();
}

/*   设置新的时钟中断处理过程   */
void   SetTimer(void   interrupt   (*IntProc)(__CPPARGS))
{
oldhandler=getvect(TIMER);
disable();   /*   设置新的时钟中断处理过程时,禁止所有中断   */
setvect(TIMER,IntProc);
enable();     /*   开启中断   */
}

/*   恢复原有的时钟中断处理过程   */
void   KillTimer()
{
disable();
setvect(TIMER,oldhandler);
enable();
}


void   main(void)
{
int   key,time=0;

SetTimer(newhandler);   /*   修改时钟中断   */

for   (;;)
{
if   (bioskey(1))
{
key=bioskey(0);
if   (key==VK_ESC)   /*   按escape键提前退出程序   */
{
printf( "User   cancel!\n ");
break;
}
}
if   (TimerCounter> 18)   /*   1秒钟处理一次   */
{
/*   恢复计时变量   */
TimerCounter=0;
time++;
printf( "%d\n ",time);
if   (time==10)   /*   10秒钟后结束程序   */
{
printf( "Program   terminated   normally!\n ");
break;
}
}
}
KillTimer();   /*   恢复时钟中断   */

}


————————————————————
1.主函数中的SetTimer(newhandler)之后的运行情况是怎样的,我不太明白为什么它后面的语句for()可以一直在后台监视键盘输入,这个语句不是在中断处理语句之后吗?

2.
void   interrupt   newhandler(__CPPARGS)
{
/*   increase   the   global   counter   */
      TimerCounter++;

/*   call   the   old   routine   */
      oldhandler();
}
为什么还要加个oldhandler();
新的中断函数一直执行TimerCounter++;不就好了

谁帮我看一下,谢谢啦

[解决办法]
(1)SetTimer是注册一个新的中断处理程序,它本身并不是中断处理程序。“注册”一个处理程序跟“执行”一个被注册的程序是两码事,“注册”当然是很快的,也不会影响后面的for。

(2)他这样做是想在不改变原来中断行为的基础上增加新的行为。

热点排行