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

hga*_*abe 2 gcc interrupt msp430

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

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{...isr}
Run Code Online (Sandbox Code Playgroud)

这是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)
Run Code Online (Sandbox Code Playgroud)

我也尝试过不同的方法,比如:

interrupt(USCI_A1_VECTOR) USCI_A1_ISR(void) {  //code goes here}
Run Code Online (Sandbox Code Playgroud)

这给出了错误:

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)
          ^
Run Code Online (Sandbox Code Playgroud)

这似乎工作:

__attribute__((interrupt(USCI_A1_VECTOR)))
void USCI_A1_ISR(void){ //code goes here }
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

mgr*_*er4 5

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

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

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

#include <isr_compat.h>

ISR(USCI_A1, USCI_A1_ISR)
{
    // Code goes here
}
Run Code Online (Sandbox Code Playgroud)

重要提示:从ISR名称中删除"_VECTOR"尾部

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