在 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 指令(基本指令是 STMCS 是 conditional instruction suffix) 看来您是在 ARM 模式下编译代码,但 STM32 是 Cortex-M 内核,仅支持 Thumb -2 指令集变体。仔细检查您的构建设置和编译开关。

【讨论】:

感谢您的信息。我使用 ARM Compiler v6.6 使用 Keil µVision 中的 --cpu Cortex-M3 标志进行编译

以上是关于在 STM32 上调用 memset 时出现硬故障异常的主要内容,如果未能解决你的问题,请参考以下文章

STM32F030 启动时出现硬故障,__libc_init_array

尝试使用 vTaskList() 列出所有任务时出现硬故障

禁用定时器时出现硬故障?

调用任何 C 函数时的 STM32 硬故障

使用 STM32L476RG 时出现 UART 溢出错误

memset 在 32 位嵌入式平台上运行缓慢