2013-03-19 49 views

回答

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后,但他说的问题仍处于“计划中”状态,目前还不清楚谁跟踪,甚至属于。 (您可以通过上面的链接访问该问题。)

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

事实上,如果省略了前导和下面的下划线,汇编就可以正常工作。

这是正确的语法!

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

而事实上,这个属性是documented in the official GNU GCC documentation。回想起来,第一个地方的下划线来自哪里还不清楚。所以,基本上,这里唯一的问题是错误信息是非常不明确的。

5

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

非常感谢Mspgcc-users邮件列表的Peter Bigot为此答案。

有两种可能性:

一个。使用的Code Composer Studio风格的语法(有被移植到CCS的额外好处):

#pragma vector=TIMER0_A0_VECTOR  
__interrupt void 
ta0cc0_isr (void) 

(请注意,这是地方出台各地MSPGCC的20120406版本)。

B。使用原生的gcc语法:

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

Ç。正确命名该功能,以便将其包含在矢量表中(对ASM功能有用)。

中断属性导致该函数被命名为__isr_X其中X是中断与向量表开始的字偏移量(等于中断属性参数的值除以2)。

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

+0

当使用GNU v5.3.0.219(SOMNIUM Technologies Limited)作为CCS附件安装时,这在CCS 6.2.0中对我无效。错误:'内部编译器错误:在msp430_attr,at'处。如果我找不到答案,可能会开始一个新问题。 – 2016-10-17 13:30:32

+1

手册中说:“要使用MSP430 GCC定义中断,请使用以下语法: 'void __attribute__((interrupt(INTERRUPT_VECTOR)))INTERRUPT_ISR(void)' static关键字不应用于ISR定义。 PDF:http://www.ti.com/lit/pdf/slau646 – 2016-10-17 13:37:10

+0

此原始信息适用于MSPGCC端口,然后由Ti/Redhat重新实施,但在2013年不存在:) – 2016-10-18 07:08:13

相关问题