为什么在声明该函数之前不带任何主体,而“ 2”到底在做什么?

问题描述

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"

解决方法

为什么在声明此函数之前没有任何正文

void on_low_interrupt(void) __interrupt 2;不是function call,这是on_low_interrupt function declaration。下面是on_low_interrupt function definition及其正文。

“ 2”到底在做什么?

前两个下划线的标识符为实现保留,通常由编译器实现者使用。因此,因为2在带有两个下划线__interrupt的标识符之后,所以它很可能在执行特定于编译器的操作,并且它的含义也特定于编译器。

一个很好的猜测是该代码是为sdcc编译器编写的。您可以在第sdcc manual3.1. General Information的第44页上阅读:

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

因此2表示例程要服务的硬件中断号。确切的解释是“中断号2”取决于设备。在链接的存储库中,有一个18f4550.lkr文件-很可能是pic18f4550的链接脚本。 datasheet for the device可能会指导您进一步了解数字。

,

在“ 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