我正在研究嵌入式处理器,并且无法在现实生活中使用中断。它们在模拟中运行良好,但这是另一个故事。
无论如何,在这个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调用约定,这是我之前没有遇到过的另一件事。我正在谈论他们的支持,但仍然试图理解并为自己解决。
答案 0 :(得分:2)
答案 1 :(得分:1)
旋转型:
extern void _setvect1(int vector, _Interrupt1 void (*target)());
声明了两个名为vector
和target
的参数。参数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}}。这些指令究竟如何影响代码生成将在编译器文档中详细说明 - 如果不是,它们可能是宏,在这种情况下,它们的定义将位于包含的头文件中。