10

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

4

2 回答 2

7

请注意,此信息适用于 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 附近的某个地方引入的)。

。使用本机 gcc 语法:

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

C. _ 正确命名函数,使其包含在向量表中(对 ASM 函数很有用)。

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

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

于 2013-03-19T13:27:40.803 回答
5

澄清一下,因为这是 Google 的早期结果。

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

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

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

在 TI E2E 社区对此进行报告后提出了一个问题,但表示问题仍处于“计划”状态,甚至不清楚跟踪器属于谁。(您可以通过上面链接中的线程访问该问题。)

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

事实上,如果省略前导和后下划线,编译就可以正常工作。

这就是正确的语法!

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

事实上,这个属性记录在官方 GNU GCC 文档中。回想起来,首先不清楚下划线的来源。所以,基本上,这里唯一的问题是错误消息信息太少。

于 2016-11-17T10:01:16.580 回答