MSP430使用msp-gcc的中断例程将无法编译

时间:2014-10-09 21:19:59

标签: gcc interrupt msp430

我正在使用最新的CCS和MSP-GCC编译器。以下代码

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{...isr}

这是TI宣布ISR-s的最新官方支持方法无效,我得到以下编译器消息:

warning: ignoring #pragma vector  [-Wunknown-pragmas]
#pragma vector=USCI_A1_VECTOR
^
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
__interrupt void USCI_A1_ISR(void)

我也尝试了不同的方法,例如:

interrupt(USCI_A1_VECTOR) USCI_A1_ISR(void) {  //code goes here}

给出错误:

c:/ti/ccsv6/ccs_base/msp430/include_gcc/msp430f5529.h:5328:33: error: expected declaration specifiers or '...' before '(' token
#define USCI_A1_VECTOR          (47)                     /* 0xFFDC USCI A1 Receive/Transmit */
                                ^
../uart_printf.c:40:11: note: in expansion of macro 'USCI_A1_VECTOR'
interrupt(USCI_A1_VECTOR) USCI_A1_ISR(void)
          ^

这似乎有效:

__attribute__((interrupt(USCI_A1_VECTOR)))
void USCI_A1_ISR(void){ //code goes here }

我在这里缺少什么?

1 个答案:

答案 0 :(得分:5)

中断例程声明没有C标准(真正的坑)。每个编译器都有自己的方法来完成它。

TI上个月重新推出RedHat MSP430 GCC,没有时间对其进行调查。但对于旧的MSPGCC分支,您的最后一个示例应该是有效的。

MSPGCC还提供了一个包含更好的编译器互操作的文件:

#include <isr_compat.h>

ISR(USCI_A1, USCI_A1_ISR)
{
    // Code goes here
}

重要提示:从ISR名称中移除'_VECTOR'尾巴

查看 isr_compat.h 文件。它实际上是为了与市场上的所有编译器一起工作。如果您的编译器套件中没有任何类似内容,也许将它借入您的项目是个好主意。