0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

工程师笔记|一个地址未对齐引起的 HardFault 异常

STM32单片机 来源:未知 2023-02-10 11:05 次阅读
关键词:地址对齐,Hardfault,STM32G0





目录预览




1. 概述

2. 问题描述与分析

3. 问题解决

4. 总结



1.概述

客户在使用 STM32G070 的时候,KEIL MDK 为编译工具,当编译优化选项设置为Level0 的时候,程序会出现 Hard Fault 异常,而当编译优化选项设置为 Level1 的时候,则程序运行正常。


表面上看,这似乎是 KEIL MDK 的问题,通过分析,导致这个问题的本质原因是内存地址没有对齐引起的,下面章节将详细分析该问题的来龙去脉以及解决方法。


问题描述与分析

根据客户的反馈,引起问题的代码很简单,客户定义了几个全局数组,在主程序中访问这几个数组就会出现 Hard Fault 异常,参考代码如下。


把客户提供的代码片段移植到 NUCLEO-G070RB 开发板上,问题很容易就复现了,代码本身功能简单,写法上也没有错误,所以从代码片段本身上看,无法确定问题出在哪里,通过 KEIL 调试器,在汇编窗口单步调试下,最终发现导致 HardFault 异常的语句为下图所示语句。


根据单步调试得知出现问题的语句为 LDR 指令,参考 Cortex M0 编程手册 PM0223 得知 LDR 指令的作用是从内存地址中加载一个 WORD 数据到目的寄存器 Rt 中,其中内存地址根据 Rn 或者 SP 寄存器的值以及立即数 imm 得到。


根据指令的描述,使用 LDR 指令的时候,通过 Rn 和 imm 计算得到的内存地址必须是读取字节数的倍数,LDR 每次读取一个 WORD,所以使用 LDR 指令时,内存地址必须 4字节对齐。如果地址没有对齐,则会导致 HardFault 异常。


结合 LDR 指令的描述,在调试状态下,通过查看寄存器值,图 2 出错语句中根据 Rn和 imm 计算得到的内存地址为 R0=0x2000000B,imm=4 所以内存地址为 0x2000000F,很显然这个地址不是 4 字节对齐的。



而当我们改变编译优化选项为 Level1 时,得到的内存地址为R0=0x20000000,imm=0x04 显然这个地址是按照 4 字节对齐的,所以这种情况下是不会出现 HardFault 异常的,印证了客户的问题现象。



3.问题解决

通过上一节的分析,明确了导致该问题的本质原因是内存地址没有对齐,这个内存地址实际上是代码中定义的全局变量 g_curPlaySound_app 指向的地址,也就是全局数组变量 SoundFile 的地址,在编译器不同的优化选项下,分配给 SoundFile 变量的地址是不一样的,在本案例中,编译优化选项 Level0 条件下,SoundFile 分配的地址没有按照WORD 对齐,而在优化选项 Level1 条件下,SoundFile 分配的地址是 WORD 对齐,所以在两种优化选项下,出现了不一样的运行结果。


所以要保证程序不出错,当通过指针访问变量的时候,要确保指针指向的地址是 4 字节对齐的,在 Keil 环境下,可以通过__attribute__((aligned (4))) 关键字实现,如下图所示,通过该关键字,对齐了地址,也就不会出现 HardFault 异常了。


图6 确保地址对齐


4.总结

地址未对齐是嵌入式系统中容易忽视的一个细节,忽视这点往往会导致一些奇怪的问题,所以在开发过程中,注意这些细节还是很有必要的。



参考文献:PM0223 Programming maual



长按扫码关注公众号


更多资讯,尽在STM32

点击“阅读原文”,可下载原文档


原文标题:工程师笔记|一个地址未对齐引起的 HardFault 异常

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6002

    文章

    43982

    浏览量

    620900
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348856

原文标题:工程师笔记|一个地址未对齐引起的 HardFault 异常

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    电源工程师的成长路径

    即将走马上任电源工程师这个岗位,请问各位大佬,这个岗位的职业路径般是怎样的?
    发表于 04-08 14:19

    企业老工程师和高校老师有啥区别

    电子工程师硬件
    电子发烧友网官方
    发布于 :2024年02月28日 17:50:00

    如何搞崩硬件工程师心态?试试对ta说这几句

    硬件工程师
    扬兴科技
    发布于 :2024年02月20日 18:05:49

    #人工智能 #FPGA 怎么成为合格的FPGA工程师

    fpga工程师
    明德扬助教小易老师
    发布于 :2023年12月18日 21:19:01

    电子工程师天上班就暴揍师傅。。。#科普 #示波器 #电子工程师 #打工日记

    电子工程师示波器
    安泰小课堂
    发布于 :2023年12月18日 17:36:12

    FPGA工程师需要具备哪些技能?

    上获取。此外,他们还需要知道如何使用现成的PCB和其他电路板,以进行各种通信协议的测试和验证。 六、测试验证 测试验证是FPGA设计中非常关键的环节。FPGA工程师需要利用各种工具
    发表于 11-09 11:03

    ES32F36xx芯片发生HardFault异常时的函数调用关系及问题定位

    ES32F36xx芯片发生HardFault异常时的函数调用关系及问题定位
    的头像 发表于 11-06 17:13 418次阅读
    ES32F36xx芯片发生<b class='flag-5'>HardFault</b><b class='flag-5'>异常</b>时的函数调用关系及问题定位

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

    一个地址对齐引起的 HardFault 异常
    的头像 发表于 09-18 10:57 438次阅读
    一个<b class='flag-5'>地址</b>未<b class='flag-5'>对齐</b>引起的<b class='flag-5'>HardFault</b><b class='flag-5'>异常</b>

    MRS_关于HardFault问题查找思路

    。因进HardFault_Handler中断的原因(RAM溢出/空指针异常/堆栈溢出等等)比较多,情况比较复杂,搞得工程师没有头绪。现提供排查思路如下: HardFault_Ha
    发表于 08-24 10:57

    热门推荐:硬件工程师必备工具

    硬件开发的工作流程般可分为:原理图设计、PCB Layout设计、采购电子BOM、PCB板生产、PCBA组装、功能调试及测试、小批量试产、大批量生产正式投放市场等步骤。 作为名优秀的硬件工程师
    发表于 06-21 10:15

    电子工程师必看书籍推荐#知识分享 #知识科普 #交流#硬声创作季

    电子工程师
    也许吧
    发布于 :2023年05月24日 10:47:34

    RISC-V对齐访问导致问题案例

    转自公众号,欢迎关注 参考https://mp.weixin.qq.com/s/8wfRFg1XcBsXw5gMq-cKaQ前言 本文以实例,讲解RISC-V对齐访问导致的问题.
    发表于 05-06 19:14