我正在尝试将为微处理器编写的应用程序移植到 Visual Studio,这样我就可以更轻松地运行调试器并扫描代码,而不是在芯片上进行调试,当您想要了解应用程序的编写方式时,这有点麻烦。我根本不是一个编程专家,我不断收到此错误(如下所示),它与结构有关:
error C2059: syntax error : '.'
代码如下所示,有人能给我指出正确的方向吗?
typedef struct usart_reg_map
{
volatile uint32 SR;
volatile uint32 DR;
volatile uint32 BRR;
volatile uint32 CR1;
volatile uint32 CR2;
volatile uint32 CR3;
volatile uint32 GTPR;
}usart_reg_map;
#define USART1_BASE ((struct usart_reg_map*))
typedef struct usart_dev
{
usart_reg_map *regs;
}usart_dev;
struct usart_dev usart1 =
{
.regs = USART1_BASE,
};
usart_dev *USART1 = &usart1;
答案1
有两个问题需要考虑:
您很可能将代码编译为 C++。但 C++ 不是 C,反之亦然 - 它们不是兼容的语言。您需要强制执行 C 编译,这通常是通过命名文件
.c
而不是 来完成的.cpp
。即使在 C 模式下,Visual Studio 对标准 C 的支持也很糟糕。
.
初始化语法称为指定初始化器并于 1999 年引入。然而,微软一直坚持不升级他们的 C 编译器,直到几年前才做了一些半心半意的尝试。他们可能支持也可能不支持指定的初始化器,我不知道。
我强烈建议任何初学者都使用符合标准的编译器。您可以告诉 VS 使用 gcc 编译器而不是默认的垃圾编译器,或者您可以下载另一个 IDE,例如 Codeblocks,它默认预装了 gcc/mingw。
答案2
在所有情况下,这都需要大量工作,但并非不可能:
- 从微型库中找出您需要的类、结构、类型和功能。
- 为它们创建文件,类似于微库,最好具有相同的文件结构,但位于不同的位置。这些只能在 PC 版本中运行。
- 为非微环境创建一个新项目,其中使用步骤2中的文件而不是步骤1。这可以通过更改包含路径来实现。
在步骤 2 中,如果您想测试,甚至可以在函数中实现一些智能化。此外,您不需要更改任何在您自己创建的微机上运行的文件,因为只有微机库才有 PC 对应库。
关于 C99,请确保您不在通用代码(您的微控制器代码)中使用 C99 特定的功能,如果需要,请将该代码放在单独的函数中,您可以将其移植到 VS,或者可能不需要它们,因为它们是微控制器库或外观函数的一部分。
答案3
您的具体问题是因为,正如您所发现的,指定的初始化程序.regs = USART1_BASE
在 Visual Studio 中不起作用。
在 Windows 上测试微控制器项目时,我通常使用 GCC 和 makefile。当尝试使用 C99 等特定标准的功能时,这种方法似乎效果更好。
正如其他人指出的那样,您可能需要进行大量重构才能使整个项目真正在 Windows 上运行。我通常会将项目分解为一些简单的模块,然后使用 GCC 在 Windows 上进行编译和测试,然后将这些经过良好测试的模块组合成一个更大的应用程序,以便在目标设备上运行和测试。