0

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

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

鉴于此代码段:

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

我收到此错误:

错误:“WDTCTL”未命名类型 c:\msptest\LedBlink\LedBlink.cpp

WDTCLT 在 msp430x14x.h 中声明。

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

4

3 回答 3

3

有两种可能:

  • 每个编译器提供的 msp430x14x.h 是不同的 - 这种头文件没有标准形式,每个供应商可能对它们进行不同的定义。
  • 您正在将一个编译器的头文件与另一个编译器一起使用,并且它使用不兼容的编译器扩展或语法。

毫无疑问,这里有大量特定于编译器的或“宏魔法”——您需要查看的是这些宏是如何被预处理器扩展的。编译器抱怨的是扩展代码,而不是您发布的源代码。

预处理器在这里被用来创建在其他情况下不是有效的 C 或 C++ 的语法,因此如果不考虑扩展,就无法确定太多。而且由于每个编译器都可能提供不同的 msp430x14x.h,而在不确切知道使用什么 C 和什么 C++ 编译器的情况下,也不能说太多。请记住,必须考虑完全扩展 - 所以如果一个宏是根据其他宏定义的,它们也必须被扩展。GCC有一个选项top output the pre-processor output,或者你可以直接单独运行预处理器(可执行文件是“cpp”)。

于 2012-09-20T06:28:30.417 回答
0

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

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

主函数()

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

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

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

谢谢!

于 2012-09-20T14:15:45.843 回答
0

问题是WDTCTL使用 定义的sfrw,虽然未在您的代码中显示,但在iomacros.hsfrw中定义为内联 asm 语句。显然,内联 asm 将取决于处理器,而适用于 msp430 的方法在 Visual Studio 中不起作用。

于 2012-09-20T04:06:57.070 回答