我正在使用最新的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 }
我在这里缺少什么?
答案 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 文件。它实际上是为了与市场上的所有编译器一起工作。如果您的编译器套件中没有任何类似内容,也许将它借入您的项目是个好主意。