2015-09-17 41 views
0

我正在研究嵌入式处理器,并且无法在实际中获取中断。他们在模拟中工作得很好,但这是另一回事。无法理解此功能extern void _setvect1(int vector,_Interrupt1 void(* target)());

反正这个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++; 
} 

他们叫中断1和_Save_all_regs调用约定,另一件事我不是真的碰上了。我正在与他们的支持交谈,但仍然试图为自己理解和解决问题。

+1

这是一个函数指针,看看我的代码,看看它是如何使用= >> http://stackoverflow.com/questions/32614150/clarification-on-function-pointers-in-c/32615240 #32615240 – Michi

+0

坏主意在一个中断内调用display_value()。强烈建议将值保存到全局变量,然后一些主线函数查找flag_sp3变量中的更改,并在更改时调用display_value() – user3629249

回答

1

的rototype:

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

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

你会分配sp3_isr()作为中断处理这样的:

_setvect1(SP3_VECT, sp3_isr) ; 

哪里SP3_VECT对于所需的IRQ中断向量号。

在很多平台上的中断处理程序可能有特殊要求,由编译器对于代码生成,而这种架构的具体细节没有在C语言的标准定义的支持,因此编译器特定的预选赛_Interrupt1_Save_all_regs。具体如何这些指令影响代码生成将在编译器文档中详细说明 - 如果不是,它们可能是宏,在这种情况下,它们的定义将包含在一个包含的头文件中。

2

是的,它是要求你传递一个函数指针。 void(* target)()表示指向函数的指针,它不接收任何参数或返回任何内容。

在你的情况下,你可以通过sp3_isr作为_setvec1函数的第二个参数(记住,函数名称代表函数指针)。 另外,请确保您在使用之前必须声明/定义sp3_isr

相关问题