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

Change from C compiler to C++ compiler causes compiler errors for MSP430 firmware

本文关键字:编译器 MSP430 固件 错误 C++      更新时间:2023-10-16

我正试图用一个新的编译器(C++编译器,在Visual Studio下使用VisualGDB)为Texas Instruments MSP430微控制器编译一个久经考验的固件。

该固件的所有早期版本都是使用C编译器编译的,没有任何错误和警告。从C编译器到C++编译器的变化一定是我出现问题的原因。(用C编译器编译的代码已经运行了五年,没有出现任何问题。)

给定以下代码片段:

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

我得到这个错误:

错误:"WDTCTL"未命名类型c:\mstest\LedBlink\LedBrink.cpp

WDTCLT在msp430x14x.h中声明。

有人能给我指正确的方向吗?

有两种可能:

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

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

预处理器在这里被用来创建语法,否则这些语法将不是有效的C或C++,因此如果不考虑扩展,就无法确定太多。由于每个编译器都可能提供不同的msp430x14x.h,而不知道使用了什么C和C++编译器,因此对此也没有什么好说的。请记住,必须考虑完整扩展-因此,如果宏是根据其他宏定义的,则也必须扩展它们。GCC有一个n选项,顶部输出预处理器输出,或者您可以直接单独运行预处理器(可执行文件是"cpp")。

问题是WDTCTL是使用sfrw定义的,尽管代码中没有显示,但sfrw在iomacros.h中定义为内联asm语句。很明显,内联asm将依赖于处理器,适用于msp430的东西在visualstudio中不起作用。

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

我发现并纠正了这个问题。我必须承认,问题出在我身上是一个疏忽大意的错误。我把一个完整的C程序中的代码剪切粘贴到一个测试程序中,省略了

int main()

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

我过早地提出了我的问题。

也就是说,您的答案对于决定继续使用GCC编译器(使用Visual Studio作为IDE)或使用与我用于该固件的所有早期版本相同的编译器最有帮助。我从你提供的一组答案中学到了很多。

谢谢!