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

Posted

技术标签:

【中文标题】C++ STM32用户定义类构造函数问题【英文标题】:C++ STM32 user defined class constructor problems 【发布时间】:2015-03-23 13:35:43 【问题描述】:

我遇到了自制课程的问题。我有一个可以输入数据结构的类。如果我从“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 作为调试器,看不到任何错误。

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

【问题讨论】:

你说的是完全重置(程序从一些只读内存重新加载到内存等)? 这段特殊的代码用于初始化引脚。更具体地说是UART的引脚。我没有遇到任何硬件故障,并且达到了我的主要功能中的循环。不过,我没有很好地初始化引脚。如果我将设置更改为旧方式,一切正常。我认为这是一个设计错误,但我不确定.. 【参考方案1】:

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

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

除非有充分的理由,否则不要声明成员 virtual。一位virtual 成员立即介绍了一个虚函数表,它是在SRAM 中实现的,这是您最稀缺的资源。教给您的 PC 编程最佳实践不适用于此处。

【讨论】:

是的,这很可能是堆问题。在堆中分配 1400 字节时,我遇到很多 malloc 退出应用程序的问题。将进一步调查!谢谢安迪【参考方案2】:

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

其次,检查您的链接描述文件 if 和初始化部分。确保已正确设置。尤其是你的 vtable

【讨论】:

以上是关于C++ STM32用户定义类构造函数问题的主要内容,如果未能解决你的问题,请参考以下文章

C++类-构造函数的重载

C++类-构造函数的重载

构造函数调用

C++中复制构造函数被调用的三种情况

复制构造函数中的c ++用户定义成员

C++类-屏蔽掉系统自带的 默认构造函数