我已经获得了一些供应商提供的用C编写的驱动程序代码,该代码在DOS(是DOS)上运行以访问硬件。我试图弄清楚这段代码的作用,到目前为止还没有太大的成功。特别是我在理解以下代码时遇到了问题
void (interrupt *oldcan)(void);
void interrupt far can_isr(void)
{
/* function body */
}
我猜第一行定义了一个函数指针,但我从未见过我假设的interrupt
字是某种DOS API函数。我之前从未使用过DOS,上面的函数定义告诉我它有3种返回类型 - void
,interrupt
和far
这显然是不可能的。该函数实际上具有void返回类型,但interrupt far
??的含义是什么?我们将非常感激地提供任何帮助。
答案 0 :(得分:4)
中断关键字用于创建中断处理程序 - 即,此函数旨在由中断调用。 far
表示当它返回时,它期望CS和IP都在栈上(对于通过中断调用的任何东西给出)。
最常见的用途可能是使用串口的代码 - BIOS / DOS串口处理程序会以更高的速度丢失字符(最初大约300 bps),所以你必须安装一个处理程序你自己。当字符出现在串行端口时,串行端口硬件会断言一条中断处理器的线路。基于此,将调用您的中断处理程序例程。您的代码需要将数据从串口读入内存(并执行一些操作,如重新启用中断)并返回。
答案 1 :(得分:2)
它很可能是特定于编译器的扩展,用于以某种特定于平台的方式将该函数“安装”为中断处理程序。
标准C语言中没有interrupt
个关键字。
答案 2 :(得分:0)
查看链接http://www.phanderson.com/printer/periodic_interrupt.html。该链接讨论了与代码示例一起使用的中断 - 请注意它非常简短。
您还可以查看此帖子:What is the difference between far pointers and near pointers?,了解有关far关键字的信息。