news 2026/8/18 13:52:53

嵌入式踩坑:printf 未重定向引发 Semihosting BKPT 异常导致 HardFault 深度排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式踩坑:printf 未重定向引发 Semihosting BKPT 异常导致 HardFault 深度排查

项目场景:

工况:移动电源进行AC充电测试。

环境:GD32F305 + FreeRTOS,故障出在 BmsManageTask 任务。


问题描述

移动电源在AC充电时偶发性出现屏幕停止刷新并在几秒后重启。

移动电源是新开发的还没有测试过稳定性。


排查步骤:

步骤一:通过问题现象大概推测导致此问题的原因。

可能的原因:1. 内存踩踏或任务栈越界导致程序进入Hardfault(),最终看门狗复位系统。

2. 喂狗任务和显示任务异常阻塞得不到运行,最终看门狗复位系统。

3. 程序不断进入中断导致喂狗任务和显示任务得不到运行,最终看门狗复位系统。

步骤二:通过增加打印日志信息、仿真或其它方式来验证复位原因。

1. 使用Cmbacktrace来排查程序异常时是否进入了Hardfault()和分析出Hardfault()的原因。

当程序进入Hardfault()时会打印进入Hardfault()的原因和进入之前的调用了那些函数。

2. 在每个业务任务入口打印独立标记,例如,温度、电压、电流采样任务:LOG_ADC; Bms通信任务:LOG_BMS;显示任务:LOG_LCD等。当某个任务被永久阻塞时它的独立 标记不会被打印。

3. 在可能连续进入的中断里添加电平翻转测试函数。当连续进入中断时电平会以极快速度进 行翻转。

步骤三: 还原当时设备运行的工况尝试复现问题。

我当时复现出问题时,设备打印了进入Hardfault()的原因和进入前的函数调用关系。

进入Hardfault()原因:

函数调用关系:

步骤四: 根据现象和打印的信息分析原因

原因分析:

进入Hardfault()的原因是程序调用printf()打印接口但程序缺失printf()串口底层重定向;标准库启用半主机机制,执行BKPT指令触发DebugFault异常,因未做对应异常拦截处理,工程未实现Debug_HardFault异常处理函数,故障级联升级进入HardFault中断,同时造成JLINK仿真会话断开。

为什么调用了printf,当时是对系统添加系统日志,使用log输出接口替换printf()函数,但是由于printf()分散在各个文件比较零散,bms的iic通信相关.c文件的printf()没有替换干净。当IIC受干扰出现偶发通信异常时,程序会调用printf()打印IIC通信异常。

补充:

1. semihosting(半主机调试):

ARM 单片机专属调试功能仅插上 JLINK 仿真器时才能正常工作作用:没有自定义串口打印时,C 标准库借助仿真器,把printf文字打印到电脑 Keil 调试控制台。 实现方式:库内部自动插入BKPT硬件断点指令和调试器通信。

2. BKPT

ARM 汇编硬件断点指令BKPT,专门给调试器用:

  • 正常调试:JLINK 识别这条指令,接收 printf 数据,程序继续跑;
  • 无仿真器 / 调试配置不对CPU 识别到 BKPT,但没人处理,直接抛出异常。

3. DebugFault

单片机内核调试专用异常,只要执行 BKPT 断点指令,就会进入这个异常。 工程没有写DebugFault_Handler专门处理半主机断点,这个异常无法正常释放。

4. 级联进入HardFault

嵌入式内核异常有优先级:DebugFault 处理失败 → 异常升级,统一进入总故障中断HardFault_Handler,这就是调试看到进 HardFault 的根本原因。


解决:

方案一:

检查工程里调用了printf()的地方,删除干净并使用log打印接口替代。

方案二:

自定实现fputc()输出函数。

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

Starward米哈游游戏启动器:抽卡、时长、账号一站式管理指南

Starward米哈游游戏启动器:抽卡、时长、账号一站式管理指南 【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward 深夜打完深渊,你切回桌面想截个图发群里,却…

作者头像 李华
网站建设 2026/8/18 13:50:58

人机对比:游戏学习中的经验敏感性行为研究与应用

1. 项目缘起:当游戏学习遇上“经验敏感度” 最近在琢磨一个挺有意思的事儿:我们总说AI智能体,特别是基于大语言模型的智能体,越来越像人了,能对话、能推理、能写代码。但真把它们扔进一个需要“学习”的游戏环境里&…

作者头像 李华
网站建设 2026/8/18 13:50:53

基于层理论的多智能体系统建模:统一共识与博弈均衡的代数拓扑框架

1. 项目概述:从共识到均衡的“拓扑”视角最近在复现和优化一些多智能体协同决策的仿真项目时,我遇到了一个挺有意思的瓶颈。传统的基于图论的方法,在处理智能体间存在异构信息流、动态拓扑甚至局部目标冲突的场景时,常常显得力不从…

作者头像 李华
网站建设 2026/8/18 13:50:49

基于广义沃罗诺伊图与效用梯度的多智能体协同覆盖控制

1. 项目概述:当智能体遇上广义沃罗诺伊图最近在搞多智能体系统(Multi-Agent System, MAS)的路径规划和协同控制,发现一个挺有意思的切入点:如何让一群智能体(Agent)在复杂环境里既高效又安全地“…

作者头像 李华
网站建设 2026/8/18 13:50:35

反者道之动 深度释义|联动 唯有变是不变的(无漏究竟版)

反者道之动 深度释义|联动 唯有变是不变的(无漏究竟版)一、先讲人话:「反者道之动」到底是什么意思?原文极简翻译:万物运行的唯一动态规律,就是「向对立面转化、走到极致必反转」。拆解三个字&a…

作者头像 李华
网站建设 2026/8/18 13:50:35

怎么快速全部重命名001到100?这个方法足够了

在数字时代,文件管理和组织成为了我们日常生活中不可或缺的一部分,无论是在个人电脑的文档整理,还是在企业级的项目资料归档中,文件的命名都扮演着至关重要的角色。批量重命名文件,尤其是将一系列文件从001编号到100&a…

作者头像 李华