如何解决为什么在声明该函数之前不带任何主体,而“ 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 manual页3.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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。