标题:中断问题
只看楼主
无语的我
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2006-4-25
 问题点数:0 回复次数:4 
中断问题

/*时间中断定义*/
#define TIMER 0x1c
int TimerCounter=0;
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt newhandler(__CPPARGS)
{
TimerCounter++;
oldhandler();
}
void SetTimer(void interrupt (*IntProc)(__CPPARGS))
{
oldhandler=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
谁帮我解释下这段程序啊.看了好久都没看懂.对中断不是很清楚.
先谢谢了.

搜索更多相关主题的帖子: void 时间 enable 
2007-07-18 20:52
小凤小凤
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-7-17
得分:0 
void interrupt ( *oldhandler)(__CPPARGS);中断函数指针.
oldhandler=getvect(TIMER);这句是将中断号为TIMER的中断处理函数地址赋给oldhandler;
disable(); 这句关硬中断.
setvect(TIMER,IntProc); 这句是设置新的中断函数.
enable(); 打开硬中断.
2007-07-18 22:55
limeng_HOHO
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:49
专家分:50
注 册:2007-7-16
得分:0 
感觉这篇文章很好 和大家分享一下


系统级c语言程序设计
摘要:本文主要介绍c语言中中断服务程序的编写、安装和使用。由于硬中断服务程序的编写涉及到硬件端口读写操作,使得用户直接和硬件打交道,在程序设计过程中要用到的数据比较多,这就使程序员和计算机的硬件设备间缺少一种“缓冲”的作用,况且,用汇编语言来直接对硬件编程要方便得多。本文仅对软中断程序的编写作个介绍。
关键词:软中断、中断向量、中断向量表、tsr内存驻留、dos重入、中断请求、段地址、偏移量、寄存器、bios、dos、setvect ( )、getvect ( )、keep ( )、disable ( )、enable ( )、geninterrupt ( )、int86 ( )、interrupt
对于一般的c语言爱好者而言,就如何在c中使用中断例程这一问题应该已经非常熟悉,例如,我们可以通过int86 ( )函数调用13h号中断直接对磁盘物理扇区进行操作,也可以通过int86 ( )函数调用33h号中断在屏幕上显示鼠标光标等。其实,13h号也好,33h号也好,它们只不过就是一些函数,这些函数的参数通过cpu的寄存器传递。中断号也只不过是间接地指向函数体的起始内存单元,说它是间接的,也就是说,函数的起始段地址和偏移量是由中断号通过一种方法算得的。如此一来,程序员不必要用太多的时间去写操作硬件的程序了,只要在自己的程序中设置好参数,再调用bios或dos提供的中断服务程序就可以了,大大减小了程序开发难度,缩短了程序开发周期。那么中断既然是函数,就可以由用户任意的调用、由用户任意地编写。
计算机内存的前1024个字节保存着256个中断向量,每个中断向量占4个字节,前两个字节保存着中断服务程序的入口地址偏移量,后两个字节保存着中断程序的入口段地址,使用时,只要将它们分别调入寄存器ip及cs中,就可以转入中断服务程序实现中断调用。每当中断发生时,cpu将中断号乘以4,在中断向量表中得到该中断向量地址,进而获得ip及cs值,从而转到中断服务程序的入口地址,调用中断。这就是中断服务程序通过中断号调用的基本过程。在计算机启动的时候,bios将基本的中断填入中断向量表,当dos得到系统控制权后,它又要将一些中断向量填入表中,还要修改一部分bios的中断向量。有一部分中断向量是系统为用户保留的,如60h到67h号中断,用户可以将自己的中断服务程序写入这些中断向量中。不仅如此,用户还可以自己更改和完善系统已有的中断向量。
在c语言中,提供了一种新的函数类型interrupt,专门用来定义中断服务程序,比如我们可以写如下的中断服务程序:
/*例1:中断服务程序*/
void interrupt int60()
{
puts("this is an example");
}
该中断的功能就是显示一个字符串,为什么不用printf ( )函数呢?这就牵涉到dos的重入问题,后面将作一些介绍。
一个简单的中断服务程序写好了,如何把它的函数入口地址填写到中断向量表中,以便在产生中断的时候能转入中断服务程序去执行呢?这里要用到setvect ( )和getvect ( )函数。setvect ( )有两个参数:中断号和函数的入口地址,其功能是将指定的函数安装到指定的中断向量中,getvect ( )函数有一个参数:中断号,返回值是该中断的入口地址。在安装中断以前,最好用disable ( )函数关闭中断,以防止在安装过程中又产生新的中断而导致程序运行混乱,待安装完成后,再用enable ( )函数开放中断,使程序正常运行。现在我们可以把上面的例子再丰富一下:
/*例2:中断服务程序的编写、安装和使用*/

#include <dos.h>

#include <stdio.h>

#ifdef __cplusplus

#define __argu ...

#else

#define __argu

#endif

void interrupt int60 (__argu) /*中断服务函数*/

{

puts("this is an example");

}

void install (void interrupt (*fadd)(__argu),int num) /*安装中断*/
{
disable(); /*关闭中断*/
setvect(num, fadd); /*设置中断*/
enable(); /*开放中断*/
}
void main()
{
install (int60,0x60);/*将int60函数安装到0x60中断*/
geninterrupt (0x60); /*人为产生0x60号中断*/
}
有一定经验的读者很容易得到该程序的执行结果:在屏幕上显示“this is an example!”。



世界并不美丽 然而又因此而美丽
2007-07-19 00:23
taiwai1234
Rank: 1
来 自:原始森林神农架
等 级:新手上路
帖 子:64
专家分:0
注 册:2007-6-25
得分:0 
牛!要支持!

逍遥自在,一生无求!
2007-07-19 06:33
无语的我
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2006-4-25
得分:0 

谢谢了.



2007-07-19 10:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-156394-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.055629 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved