C语言 有人能解释一下这个函数指针的语法吗?

mrphzbgm  于 2023-03-29  发布在  其他
关注(0)|答案(3)|浏览(131)

我已经得到了一些供应商提供的驱动程序代码写的c运行在DOS(是的DOS)访问硬件。我试图找出这段代码做什么,到目前为止没有太大的成功。特别是我有问题理解以下代码

void (interrupt *oldcan)(void);

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

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

3xiyfsfu

3xiyfsfu1#

中断关键字是far表示当它返回时,它期望CS和IP都在堆栈上,interrupt关键字表示它期望标志寄存器也被压入(所有通过中断调用的内容都是给定的,但也可以通过按下标志寄存器,然后执行far跳转来模拟中断)。
最常见的用法可能是用于将要使用串行端口的代码--BIOS/DOS串行端口处理程序在更高的速度下会丢失字符(任何高于约300 bps,最初)所以你必须安装自己的处理程序。当一个字符出现在串行端口时,串行端口硬件将Assert一条中断处理器的线路。基于此,你的代码需要从串行端口读取数据到内存中(并做一些事情,如重新启用中断)并返回。

bhmjp9jg

bhmjp9jg2#

它很可能是一个特定于编译器的扩展,用于以某种特定于平台的方式将函数“安装”为中断处理程序。
标准C语言中没有interrupt关键字。

7fyelxc5

7fyelxc53#

查看链接http://www.phanderson.com/printer/periodic_interrupt.html。该链接讨论了在代码示例中使用的中断-请注意,它非常简短。
你也可以看到这篇文章:What is the difference between far pointers and near pointers?以获取关于far关键字的信息。

相关问题