3

我得到了一些供应商提供的用 C 语言编写的驱动程序代码,该代码在 DOS(是的 DOS)上运行以访问硬件。我正在尝试弄清楚这段代码的作用,到目前为止没有太大的成功。特别是我在理解以下代码时遇到问题

void (interrupt *oldcan)(void);

void  interrupt far  can_isr(void)
{
    /* function body */
}

我猜第一行定义了一个函数指针,但我从未见过interrupt我假设的词是某种 DOS API 函数。我以前从未使用过 DOS,上面的函数定义在我看来它有 3 个返回类型 - ,void这显然是不可能的。该函数实际上具有 void 返回类型,但是??的含义是什么?任何帮助将不胜感激。interruptfarinterrupt far

4

3 回答 3

6

interrupt 关键字(曾经)用于创建中断处理程序——即,该函数旨在由中断调用。far意味着当它返回时,它期望 CS 和 IP 都在堆栈上(对于任何通过中断调用的东西都是给定的)。

最常见的用途可能是用于将使用串行端口的代码——BIOS/DOS 串行端口处理程序会在更高的速度(最初大约 300 bps)下丢失字符,因此您必须安装自己的处理程序. 当字符出现在串行端口时,串行端口硬件将断言一条中断处理器的行。基于此,将调用您的中断处理程序例程。您的代码需要将数据从串行端口读入内存(并执行一些操作,例如重新启用中断)并返回。

于 2012-09-10T14:22:28.490 回答
2

它很可能是特定于编译器的扩展,用于以某种非常特定于平台的方式将函数“安装”为中断处理程序。

标准 C 语言中没有interrupt关键字。

于 2012-09-10T14:21:25.360 回答
0

查看链接http://www.phanderson.com/printer/periodic_interrupt.html。该链接讨论了与代码示例一起使用的中断 - 请注意它非常简短。

还可以看这篇文章:远指针和近指针有什么区别?有关 far 关键字的信息。

于 2012-09-10T14:23:49.110 回答