C++ STM32 用户定义 class 构造函数问题

C++ STM32 user defined class constructor problems

我在使用自制 classes 时遇到问题。我有一个 class,我可以在其中输入数据结构。如果我从 "old main.cpp" 调用该函数,它会填充一个预先存在的结构并根据此信息初始化硬件。

main.cpp (old way of handling, witch works):
UART UARTObj;
IO_t UART1_RX;
IO_t UART1_TX;
...
IOObj.begin(&UART1_RX, GPIOA, 3, GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_Speed_Level_3, GPIO_AF_1);
UARTObj.begin(USART2, 230400, &UART1_RX, &UART1_TX);

因为我想将引脚分配保留在一个地方,所以我创建了一个名为 IOPin 的 class。

IOPin.h :
typedef struct IO_t{
GPIO_InitTypeDef GPIOInfo;
GPIO_TypeDef* GPIOx;
uint8_t GPIO_AF;
bool init;
}IO_t;

class IOPin
{
public:
IOPin(GPIO_TypeDef*, uint16_t, GPIOMode_TypeDef, GPIOOType_TypeDef, GPIOPuPd_TypeDef, GPIOSpeed_TypeDef);
IOPin(GPIO_TypeDef*, uint16_t, GPIOMode_TypeDef, GPIOOType_TypeDef, GPIOPuPd_TypeDef, GPIOSpeed_TypeDef, uint8_t GPIO_AF);
IO_t *PIN = new IO_t;
virtual
~IOPin ();
};

理论是我用每个对象所需的信息调用构造函数。 稍后,我调用了一个附加了 class 的函数。我从这个 class 中获取结构并像旧方法一样通过相同的函数将其放入。

main.cpp (new way of handling, witch gives problems) :
IOPin UART_RX(GPIOA, 3, GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_Speed_Level_3, GPIO_AF_1);
IOPin UART_TX(GPIOA, 2, GPIO_Mode_AF, GPIO_OType_PP, GPIO_PuPd_UP, GPIO_Speed_Level_3, GPIO_AF_1);
....
IOObj.begin(&UART_RX);
IOObj.begin(&UART_TX);
UARTObj.begin(USART2, 230400, &UART_RX, &UART_TX);

我正在使用 GDB 作为调试器,看不出任何错误。

问题: 如果我重建项目,它会工作一次。 重置平台没有帮助。 有人知道为什么这种 class 方法不起作用吗? 我试过把它做成一个指针,把它放到头文件中等等。

好的,这里有一些提示可能最终会得出完整的答案,因为很难从问题中发布的不完整片段中确切地看出发生了什么,而且这对于评论来说太长了:

堆栈可以使用时不要使用堆。 C++11 声明 IO_t *PIN = new IO_t 似乎可以简单地替换为 IO_t PINPIN 在哪里用有效内容初始化?你没有显示这个,PIN 似乎也没有被删除。

除非有充分的理由,否则不要声明成员 virtual。一个virtual会员瞬间引入一个虚函数table,它是在你最稀缺的资源SRAM中实现的。您所学的 PC 编程最佳实践不适用于此处。

首先,我绝对不会使用工具链附带的动态分配。但更好的是我根本不会使用动态分配。它是一个微控制器,您 运行 特权模式并且可以访问板上所有可用的内存。

其次,检查你的链接脚本和初始化部分。确保它设置正确。特别是你的 vtable