news 2026/10/11 1:55:59

除数为0进入HardFault

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
除数为0进入HardFault

新建一个STMF103C8T6 CUMX工程:只是使能SWD口,其他保存默认。

代码

代码运行进入Harldfault

程序转bin文件:

    fromelf --text -a -c --output=Divisor.dis Divisor\Divisor.axf

    首先声明,除数为0进入HardFault的前提条件是 把SCB_CCR寄存器bit4置1才会进入HardFault。

    Jlink命令工具:

    输入:

    1.USB

    2.HALT 单片机停止工作

    3.这里是STM32F103C8 输入单片机相关信息,和连接模式这里选择SWD

    4.然后回车

    看到PC执行08000ACA,SP 指向2000063C

    打开反汇编代码:看到0800ACA是Hardfault函数,说明程序已经死了。

    现在查找原因为什么进入Hardfault

    5.把栈里的内容保存到电脑savebin f:/RAM.bin 0x20000000 0x10000

    f:是我电脑的F盘, RAM.bin是文件名字; 0x20000000 是栈基地址;0x10000是栈大小。把整个栈的内存全部保存下来。

    6.打开RAM.bin文件,0x2 后面7个0

    定位到SP 2000063C

    首先要明确一个机制:

    Cortex-M 的异常自动压栈(Exception Stacking)

    当 (Cortex-Mx)发生硬件异常(例如 HardFault、内存越界、取指错误)时,硬件会自动将 8 个寄存器( R0, R1, R2, R3, R12, LR,PC,xPSR,)压入当前使用的栈(MSP 或 PSP)。

    LR: 08000B29; PC :08000294; XPSR:61000000

    我们看一下PC :08000294

    进入Hardfault,是Caculate函数执行的;我们查一下LR: 08000B29是保存的Caculate函数的返回地址:

    为什么0x8000b29,汇编时08000b28 ?

    1. 直接回答:Thumb 模式。0x08000B29的 LSB 为 1。实际指令位于0x08000B28。

    代码思路来自郭天祥。

    注意:代码优化为0

    如果代码不优化时,会警告除数为0

    ../Core/Src/main.c(59): warning: C4018W: division by zero: /

    return val1 / val2;

    版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
    网站建设 2026/10/11 1:55:47

    超材料机器学习闭环:从S参数表征到逆向设计实战

    /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

    作者头像 李华
    网站建设 2026/10/11 1:55:11

    第1章,[Win32 章节]:编程语言与框架选择

    专栏导航 上一篇:第1章,[Win32 章节]:API 及 内存管理模式 回到目录 下一篇:第1章,[Win32 章节]:编程环境与 MSDN 本专栏课件 关于本专栏课件的获取方法,请参考下述课节。 参考课节&#x…

    作者头像 李华
    网站建设 2026/10/11 1:53:17

    我常用的RFID计算工具,免费又好用

    做射频的人,经常要算东西。 链路预算、波长、自由空间损耗、馈线损耗、功率换算…… 新手容易犯两个错误:要么硬背公式,每次都要翻笔记;要么凭感觉估,估错了就踩坑。 我刚开始也是这样。后来攒了几个小工具&#xf…

    作者头像 李华
    网站建设 2026/10/11 1:52:57

    LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?

    目录LeetCode 15:三数之和|排序 双指针,如何避免重复答案?一、题目要求二、思路:三个数字,真的需要同时寻找吗?三、排序 双指针:寻找剩下两个数字1. 当前总和太小2. 当前总和太大3…

    作者头像 李华
    网站建设 2026/10/11 1:52:53

    智诺方AI|论文案例分析章节,淡化AIGC行文痕迹章节改法

    智诺方AI|论文案例分析章节降重降AIGC,案例论述避免同质化写作|官网https://www.znfai.cn,微信服务号搜一搜 智诺方AI 案例分析是经管、法学、新闻等学科论文常用写作形式,依靠典型案例展开分析论证。案例章节包含案例…

    作者头像 李华