gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:28:24 26 4
gpt4 key购买 nike

我在使用自制类(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 的类。

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 ();
};

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

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 作为调试器,看不到任何错误。

问题:如果我重建项目,它会工作一次。重置平台没有帮助。任何人都知道为什么这种方法在类里面不起作用?我试过将其设为指针,将其放入头文件等。

最佳答案

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

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

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

关于C++ STM32用户定义类构造函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28128105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com