【问题标题】:Hardfault exception when calling memset on STM32在 STM32 上调用 memset 时出现硬故障异常
【发布时间】: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)) 的事情时,也会导致硬故障。我现在完全不知道为什么会发生这种情况

标签: c assembly stm32 memset


【解决方案1】:

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

【讨论】:

  • 感谢您的信息。我使用 ARM Compiler v6.6 使用 Keil µVision 中的 --cpu Cortex-M3 标志进行编译
猜你喜欢
  • 2021-09-19
  • 2022-01-21
  • 2016-03-04
  • 2014-12-07
  • 2021-01-29
  • 2020-08-12
  • 2020-11-12
  • 2021-06-28
  • 1970-01-01
相关资源
最近更新 更多