你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

一个地址未对齐引起的 HardFault 异常

[复制链接]
STMCU小助手 发布时间:2023-2-19 17:00
1. 概述
5 Y# B. {, I$ ?
5 I, ?2 _+ y  S* z
客户在使用 STM32G070 的时候,KEIL MDK 为编译工具,当编译优化选项设置为Level0 的时候,程序会出现 Hard Fault 异常,而当编译优化选项设置为 Level1 的时候,则程序运行正常。表面上看,这似乎是 KEIL MDK 的问题,通过分析,导致这个问题的本质原因是内存地址没有对齐引起的,下面章节将详细分析该问题的来龙去脉以及解决方法。
/ _. ~! W* m) F" t6 f- X0 d8 V% d+ S5 R

7 B* C3 ^/ G, [2. 问题描述与分析
# j( {6 y3 e& R* m0 @) I根据客户的反馈,引起问题的代码很简单,客户定义了几个全局数组,在主程序中访问这几个数组就会出现 Hard Fault 异常,参考代码如下。3 f1 D9 b4 U; A2 j0 Y

3 G+ l" b7 b- m% }' s- L9 @
( i& b1 b% e  A0 ]/ t1 l
Q$R@%5MPGE(]@$][)K7@]2Y.png
$ _3 }( e( i+ L7 ^% L, D
4 H" @7 \5 l( x" C. q3 ?

9 k* W) i) ~+ h把客户提供的代码片段移植到 NUCLEO-G070RB 开发板上,问题很容易就复现了,代码本身功能简单,写法上也没有错误,所以从代码片段本身上看,无法确定问题出在哪里,通过 KEIL 调试器,在汇编窗口单步调试下,最终发现导致 HardFault 异常的语句为下图所示语句。* z  @' f/ y5 f
. r! }4 A- b' |* {7 L9 [6 z

1 ~3 b+ n" _: K6 L$ x- x% A O)_2L%QRPG7CJ2NHS[`(I(S.png . @' z$ G$ |0 M9 f7 C

. A" M. o% ^) y, x& I0 {- Q
, Z6 b) ?$ d6 Y% D/ t
根据单步调试得知出现问题的语句为 LDR 指令,参考 Cortex M0 编程手册 PM0223 得知 LDR 指令的作用是从内存地址中加载一个 WORD 数据到目的寄存器 Rt 中,其中内存地址根据 Rn 或者 SP 寄存器的值以及立即数 imm 得到。: Y) b  I! l1 q5 N
/ O! Z; a; D) H2 W' s" S( f

# V' d( g4 |# `- t 5}0S7H12Z4W0TRV9EY7E5PI.png
: R1 g( L8 ~( f1 E2 k* V; R& f' t- C/ Z) _3 F% R+ x6 s1 I6 U

: R0 f) ]; S8 D/ w9 |5 N根据指令的描述,使用 LDR 指令的时候,通过 Rn 和 imm 计算得到的内存地址必须是读取字节数的倍数,LDR 每次读取一个 WORD,所以使用 LDR 指令时,内存地址必须 4字节对齐。如果地址没有对齐,则会导致 HardFault 异常。5 E* {# B9 R- d& F
结合 LDR 指令的描述,在调试状态下,通过查看寄存器值,图 2 出错语句中根据 Rn和 imm 计算得到的内存地址为 R0=0x2000000B,imm=4 所以内存地址为 0x2000000F,很显然这个地址不是 4 字节对齐的。 ( ~# K. o' k' q5 t; Y- O

, u, R0 k8 @, S5 E8 i; f0 G7 k/ Z  S4 v; J# G
$ |4 `0 Y- Z8 s" b. N. m9 Z3 l3 h, g
完整版请查看:附件 一个地址未对齐引起的 HardFault 异常.pdf (673.92 KB, 下载次数: 8)
收藏 评论0 发布时间:2023-2-19 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版