由于许可证问题,我有一个应用程序,我从Keil IDE移植到使用GNU工具链构建.我已经成功地能够在设备上设置,构建,刷新和运行应用程序.
GNU端的应用程序由于某种原因被卡在WWDG的弱链接IRQ处理程序中,这是一个无限循环.应用程序未启用WWDG,默认情况下在重置时禁用.我还验证了配置寄存器的默认启动值.
除编译器之外,唯一的区别是链接器和启动文件.但是,两个工具链使用的启动文件和链接器文件都是STM生成的默认值.
知道可能导致这种情况的原因吗?我在这里结束了我的智慧.
使用stm32f103XX,让我知道是否有任何其他信息会有所帮助.
编辑:使用下面的评论,我能够确定它实际上是正在被触发的HardFault_Handler.如果可能有帮助,我已经在下面包含了回溯输出
GDB BT:
0 HardFault_Handler()
1(信号处理程序调用)
2 0x720a3de在?? ()
3 foo(0x80005534)
Backtrace已停止:前一帧与此帧相同(损坏的堆栈?)
2件事对我来说很突出,虽然我没有gdb专家.1)foo不是一个函数,它是一个const数组的字符和2)0x0720a3de不是一个有效的内存地址,闪存地址范围从0x08000000开始
我试图向一个同事解释一个概念,然后认识到我的理解是错误的.
如何嵌入数组的结构可分配?
例如:
typedef struct {
uint8_t data[8];
} Test;
...
Test test1;
Test test2;
... some assignment to test1
test2 = test1;
Run Code Online (Sandbox Code Playgroud)
我知道数据是否是类型指针,我们需要实现深度复制,但我试图完全理解它的工作方式.
我的过程是因为'data'通常是指向第一个元素的指针,而&data将是该指针的地址.在struct的情况下,结构地址是编译器用来访问数组的?
有人可以解释允许这种情况的语言机制.这只是c结构的语法糖吗?如果是这样,为什么不实现这样的直接数组赋值......
uint8_t data[10];
uint8_t data2[10];
...
data2 = data;
Run Code Online (Sandbox Code Playgroud)
为什么经过多年的C编程,我对于我曾经使用但从未理解的机制存在存在的语言危机?