在 STM32 上调用 memset 时出现硬故障异常
Posted
技术标签:
【中文标题】在 STM32 上调用 memset 时出现硬故障异常【英文标题】:Hardfault exception when calling memset on STM32 【发布时间】:2017-04-21 11:50:17 【问题描述】:启动 STM32 我尝试为指针指向的结构分配内存。
TLxbEvents *LxbEvents
memset((void*)LxbEvents, 0, sizeof(TLxbEvents));
查看反汇编,它总是在线崩溃
STMCS r0!,r2-r3,r12,lr
我在 ARM 网站、谷歌或其他地方都找不到描述 STMCS 指令的文档... 那时的寄存器是
r0 0x2000D694
r2 0x00000000
r3 0x00000000
r12 0x00000000
lr 0x00000000
我试图将调用移动到另一个例程,没有任何更改,检查了对齐方式,这似乎也没问题。每次程序运行到该行时,它都会因 HardFault 而崩溃,并且根据一些调试变量,它是由看门狗重置引起的,我不相信...
这条线是做什么的,有人知道,是什么导致了硬故障?
【问题讨论】:
你有一个指针LxbEvents
,但它指向哪里?
r0
, 所以 0x2000D694 在 SRAM 中的某处,使用内存查看器我可以看到那里的所有内容都归零
使用前声明!
我的意思是,你确实让它真正point某处?您确实初始化变量,还是分配给它?否则,您要么取消引用空指针(如果变量是全局变量),要么它将具有不确定的值(如果它是局部变量)。在这两种情况下都会导致未定义的行为。
我做...但是,当我尝试做类似LxbEvents = (TLxbEvents*)malloc(sizeof(TLxbEvents))
的事情时,也会导致硬故障。我现在完全不知道为什么会发生这种情况
【参考方案1】:
STMCS
是 ARM 指令(基本指令是 STM
和 CS
是 conditional instruction suffix) 看来您是在 ARM 模式下编译代码,但 STM32 是 Cortex-M 内核,仅支持 Thumb -2 指令集变体。仔细检查您的构建设置和编译开关。
【讨论】:
感谢您的信息。我使用 ARM Compiler v6.6 使用 Keil µVision 中的--cpu Cortex-M3
标志进行编译以上是关于在 STM32 上调用 memset 时出现硬故障异常的主要内容,如果未能解决你的问题,请参考以下文章