如何在Mspgcc中声明中断处理程序(ISR)?

时间:2013-03-19 13:27:41

标签: msp430 mspgcc

在mspgcc中声明中断处理程序的首选方法是什么?

2 个答案:

答案 0 :(得分:5)

请注意,此信息适用于MSPGCC v4.6.3,该版本在MSPGCC的Ti / Redhat / SOMNIUM端口之前,该端口现在与代码编辑工作室一起分发。

感谢Mspgcc用户邮件列表的Peter Bigot提供此答案。

有两种可能性:

<强> A 即可。使用Code composer studio样式语法(具有可移植到CCS的附加好处):

#pragma vector=TIMER0_A0_VECTOR    
__interrupt void
ta0cc0_isr (void)

(请注意,这是在Mspgcc版本20120406左右引入的。)

<强>乙即可。使用本机gcc语法:

static void
__attribute__((__interrupt__(TIMER0_A0_VECTOR)))
isr_cc0_TA0 (void)

<强> C 即可。正确命名函数,使其包含在向量表中(对ASM函数有用)。

interrupt属性使函数命名为__isr_X,其中X是从向量表开始的中断的字偏移量(等于中断属性参数的值除以2)。

这些__isr_X符号用于初始化crt0ivtbl.o中的向量表。

答案 1 :(得分:3)

只是澄清一下,因为这是谷歌的早期结果。

__attribute__((__interrupt__(TIMER0_A0_VECTOR)))
void __isr_5(void)
{
        ...
}

当使用上述语法时,当前GCC仍然(我相信这是arvindpdmn评论的内容)引发错误。

internal compiler error: in msp430_attr, at config/msp430/msp430.c:1835
 {
 ^

report of this in the TI E2E community之后提出了一个问题,但所说的问题仍然存在于&#34; Planned&#34;状态,目前还不清楚追踪者甚至属于谁。 (您可以通过上述链接中的主题访问该问题。)

查看代码,显然会引发错误,因为唯一可能包含参数的属性是interrupt属性。

实际上,如果省略了前导和下面的下划线,编译工作正常。

这就是正确的语法!

__attribute__((interrupt(TIMER0_A0_VECTOR)))
void name_does_not_matter(void)
{
        ...
}

事实上,这个属性是documented in the official GNU GCC documentation。回想起来,目前尚不清楚下划线首先来自哪里。所以,基本上,这里唯一的问题是错误信息是如此无法提供信息。