0
void on_low_interrupt(void) __interrupt 2;    

void on_low_interrupt(void) __interrupt 2
{
#ifdef CONFIG_ENABLE_I2C
  i2c_handle_interrupt();
#endif

#ifdef CONFIG_ENABLE_SERIAL
  serial_handle_interrupt();
#endif
}

我正在调整一些代码以在 PIC18F47Q10 上以从模式运行 I2C。
该代码是为另一个类似的 PIC 编写的,但它确实需要一些调整。
这是原始代码:https ://github.com/texane/pic18f_i2c

在被定义之前我不明白这个电话,我也不明白'2'是什么意思。
这是来自int.c原始发布的文件。任何帮助或解释表示赞赏。
现在我正在评论所有这些,并希望没有它也能正常工作。

看到的错误是:

"unexpected token: __interrupt

Unable to resolve identifier on_low_interrupt."

"error: expected function body after function declarator"
4

2 回答 2

2

为什么在声明之前没有主体调用此函数

void on_low_interrupt(void) __interrupt 2;是没有函数调用,这是on_low_interrupt 函数声明。下面是on_low_interrupt 函数定义及其主体。

'2'到底在做什么?

带有前导两个下划线的标识符是为实现保留的,通常由编译器实现者使用。因此,因为在2带有两个下划线的标识符之后,__interrupt它很可能是在做一些编译器特定的事情,它的含义也是编译器特定的。

一个很好的猜测是代码是为sdcc编译器编写的。3.1. General Information您可以在sdcc 手册的第 44 页部分阅读:

关键字后面的可选数字__interrupt是该例程将服务的中断号。

所以2代表例程要服务的硬件中断号。究竟什么是“中断号 2”的解释取决于设备。在您链接的存储库中,有一个18f4550.lkr文件 - 很可能是pic18f4550. 该设备的数据表可能会指导您进一步了解数字。

于 2020-10-12T16:03:25.470 回答
-1

在“C”中需要区分函数声明和函数定义。

函数声明基本上告诉编译器某处存在具有特定名称、参数类型和结果类型的函数,因此编译器可以从类型安全的角度检查该函数的调用是否正确,并可以生成正确的函数调用代码。声明是可选的,并且可以调用未声明的函数,从而使编译器猜测有关被调用函数的详细信息,但是现在这被认为是不好的做法,并且很可能会导致警告。

函数声明通常驻留在头文件 (.h) 中。在您的代码函数声明中是:

void on_low_interrupt(void) __interrupt 2;

函数定义告诉编译器函数实际做什么,即包含函数的代码。在您的代码中,函数定义是:

void on_low_interrupt(void) __interrupt 2
{
#ifdef CONFIG_ENABLE_I2C
  i2c_handle_interrupt();
#endif

#ifdef CONFIG_ENABLE_SERIAL
  serial_handle_interrupt();
#endif
}

同一个函数可以声明任意次数,但只能定义一次。

我相信,这__interrupt 2意味着该函数是低级中断 2 的处理程序。低级中断是一个事件,通常由硬件触发,程序可能想要做出反应。该__interrupt关键字是非标准的,可能特定于您正在使用的编译器。也许以下链接是相关的:http: //downloads.ti.com/docs/esd/SPRUI04/the---interrupt-keyword-stdz0559860.html

于 2020-10-12T15:31:10.380 回答