麻烦理解这个函数extern void _setvect1(int vector,_Interrupt1 void(* target)());

时间:2015-09-17 16:31:24

标签: c embedded

我正在研究嵌入式处理器,并且无法在现实生活中使用中断。它们在模拟中运行良好,但这是另一个故事。

无论如何,在这个ARC处理器上,您使用此函数_setvect1设置中断处理程序,如下所示

extern void _setvect1(int vector, _Interrupt1 void (*target)());

我不明白第二部分是什么意思以及它在寻找什么。这是一个指向函数的指针,我不习惯看到类似(* target)的东西我依稀记得()是函数吗?

这是我的isr

int volatile flag_sp3 = 0;
_Interrupt1 _Save_all_regs void sp3_isr(void)
{
    unsigned volatile long result;
    result = _lr(0x0A);//status maybe
    display_value(result);
    flag_sp3++;
}

他们调用Interrupt1和_Save_all_regs调用约定,这是我之前没有遇到过的另一件事。我正在谈论他们的支持,但仍然试图理解并为自己解决。

2 个答案:

答案 0 :(得分:2)

< p>是的,它要求您传递函数指针。 void(* target)()表示一个指向函数的指针,它不接收任何参数或返回任何参数。< / p> < p>在您的情况下,您只需传递< strong> sp3_isr< / strong>作为_setvec1函数的第二个参数(记住,函数名表示函数指针)。 另外,请确保您必须声明/定义< strong> sp3_isr< / strong>在它使用之前。< / p>

答案 1 :(得分:1)

旋转型:

extern void _setvect1(int vector, _Interrupt1 void (*target)());

声明了两个名为vectortarget的参数。参数target具有类型_Interrupt1 void (*)(),这意味着指向返回void的函数的指针,并且具有未定义的参数。 未定义因为在C(但不是C ++)中,函数void fn()不等同于void fn(void),这是一个采用 no 参数的函数。然而,这有点迂腐,因为事实上在这种情况下没有传递任何参数。

因此,在这种情况下,您可以将sp3_isr()指定为中断处理程序:

_setvect1( SP3_VECT, sp3_isr ) ;

其中SP3_VECT是所需IRQ的中断向量编号。

在许多体系结构中,中断处理程序可能对编译器的代码生成有特殊要求,并且C语言的标准定义不支持此类体系结构特定的详细信息,因此编译器特定的限定符_Interrupt1和{ {1}}。这些指令究竟如何影响代码生成将在编译器文档中详细说明 - 如果不是,它们可能是宏,在这种情况下,它们的定义将位于包含的头文件中。