从C编译器更改为C ++编译器会导致MSP430固件的编译器错误

时间:2012-09-20 02:40:24

标签: c++ c embedded msp430

我正在尝试使用新编译器(使用VisualGDB在Visual Studio下使用C ++编译器)为德州仪器MSP430微控制器编译一个经过验证的固件固件。

此固件的所有先前版本均使用C编译器编译,零错误和零警告。从C编译器到C ++编译器的更改必定是我的问题的原因。 (使用C编译器编译的代码已运行五年没有问题。)

鉴于此代码段:

#include <msp430x14x.h>
WDTCTL = WDTPW+WDTHOLD;

我收到此错误:

错误:'WDTCTL'没有命名类型c:\ msptest \ LedBlink \ LedBlink.cpp

WDTCLT在msp430x14x.h中声明。

有人可以指出我正确的方向吗?

3 个答案:

答案 0 :(得分:3)

有两件事是可能的:

    每个编译器提供的
  • msp430x14x.h都不同 - 这种标头没有标准格式,每个供应商可能会以不同方式定义它们。
  • 您正在使用一个编译器与另一个编译器的标头,它使用不兼容的编译器扩展或语法。

毫无疑问,这里有大量编译器特定或“宏魔术” - 您需要了解的是预处理器如何扩展这些宏。编译器抱怨扩展的代码,而不是你发布的源代码。

此处使用预处理器来创建无法有效的C或C ++语法,因此不考虑扩展,可以确定的不多。并且由于每个编译器可能提供不同的msp430x14x.h,而不知道究竟是什么C和使用了什么C ++编译器,因此也不能说很多。请记住,必须考虑完整扩展 - 因此,如果宏是根据其他宏定义的,那么它们也必须进行扩展。 GCC有一个n选项顶部输出预处理器输出,或者你可以直接单独运行预处理器(可执行文件是“cpp”)。

答案 1 :(得分:0)

问题在于WDTCTL是使用sfrw定义的,虽然代码中未显示sfrw,但{{1}}中的{{1}}定义为内联asm语句。显然,内联asm将依赖于处理器,对msp430有效的功能将无法在visual studio中使用。

答案 2 :(得分:0)

感谢所有回复的人。除了我提出的问题之外,回复是有帮助的。

我找到并纠正了这个问题。我必须承认,问题是我的疏忽错误。我将已完成的C程序中的代码剪切并粘贴到测试程序中,省略

int main()

因此,编译器抱怨的赋值语句在源代码的不正确范围内。

我过早地发布了我的问题。

也就是说,您的答案最有助于决定继续使用GCC编译器(使用Visual Studio作为IDE),或者使用我用于此固件所有先前版本的相同编译器。我从你提供的一系列答案中学到了很多东西。

谢谢!