我对自制课程有疑问。我有一个类,我可以输入数据结构。如果我从" 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作为调试器,看不到任何错误。
问题: 如果我重建项目,它可以工作一次。 重置平台没有帮助。 任何人都知道为什么这种方法与班级不起作用? 我已经尝试将它作为指针,将其放入头文件等等。
答案 0 :(得分:1)
好的,这里有一些技巧可能会最终成为一个完整的答案,因为很难确切地看到问题中发布的不完整片段发生了什么,这对评论来说太长了:
堆栈执行时不要使用堆。 C ++ 11声明IO_t *PIN = new IO_t
似乎可以用IO_t PIN
轻易替换。 PIN
在哪里使用有效内容进行初始化?您没有显示此内容,PIN
似乎也没有被删除。
除非有充分的理由,否则不要声明成员virtual
。 virtual
成员立即引入虚拟功能表,该表在SRAM中实现,这是您最稀缺的资源。您在PC编程中所学的最佳实践不适用于此处。
答案 1 :(得分:0)
首先,我绝对不会使用工具链附带的动态分配。但是更好的是我根本不会使用动态分配。它是一个微控制器,您可以运行特权模式并可以访问板载的所有可用内存。
第二,检查链接描述文件和初始化部分。确保正确设置。尤其是您的vtable