硬汉嵌入式论坛

 找回密码
 立即注册
查看: 771|回复: 6
收起左侧

[其它] MCU 故障管理

[复制链接]

26

主题

161

回帖

239

积分

高级会员

积分
239
发表于 2026-3-15 16:56:56 | 显示全部楼层 |阅读模式

想找那种 FM 或者 DSM 故障管理的模块,甚至不止是自己程序中的故障,把 MCU 本身栈溢出、内存未对齐等故障也统合起来(可能想的太多了)。基于 STM32CubeMX 生成的 MCU 工程框架,有关于故障中断的函数,也有 error_Handler 这种主动调用的错误死循环函数。我想把这些接口用起来,目前是找到一个开源模块 RTEdbg。有没有类似的开源软件可以借鉴的?
RTEdbg/RTEdbg:一款快速灵活的数据记录/追踪工具包,用于软件测试、调试和可视化。


目前想到的功能如下所示:

1.  在 HardFault_Handler() 这种与中断向量表绑定的函数中读取内核寄存器(用于诊断的专用系统寄存器、保存程序运行现场的通用寄存器)然后通过 uart 等接口输出。
2.  在 error_Handler() 这种主动调用的函数,我想在这个函数内输出是哪里调用的这个函数。
       ScreenShot_2026-03-15_164947_433.png
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123390
QQ
发表于 2026-3-16 08:14:30 | 显示全部楼层
这些信息打印处理分享就行

1234.png
回复

使用道具 举报

32

主题

329

回帖

425

积分

高级会员

积分
425
QQ
发表于 2026-3-16 08:57:04 | 显示全部楼层
[C] 纯文本查看 复制代码
/* 兼容cubeMX自动生成的函数,进行函数名重定义 */
#define Error_Handler( ) HardErrorHandler(__FILE__, __LINE__)



[C] 纯文本查看 复制代码
/**
 * @brief 软件产生错误的时候将跳转到这里,将错误信息存入存储介质,不进行循环
 * @param file 源代码文件名
 * @param line 代码行号
*/
uint32_t SoftErrorHandler(char *file, uint32_t line)
{
    /* TODO : 代码报告源代码文件名和代码行号存入存储介质 */

    uint8_t StrSend[30];
    SEGGER_RTT_WriteString(0, (uint8_t *)"Wrong parameters value: file ");
    SEGGER_RTT_WriteString(0, (uint8_t *)file);
    SEGGER_RTT_WriteString(0, (uint8_t *)" line");
    SEGGER_RTT_WriteString(0, StrSend);
    SEGGER_RTT_WriteString(0, (uint8_t *)"\n");

    return 0;
}

/**
 * @brief 硬件产生错误的时候将跳转到这里,将错误信息存入存储介质,并进行死循环
 * @param file 源代码文件名
 * @param line 代码行号
*/
void HardErrorHandler(char *file, uint32_t line)
{
    /* TODO : 代码报告源代码文件名和代码行号存入存储介质 */

    uint8_t StrSend[30];
    SEGGER_RTT_WriteString(0, (uint8_t *)"Wrong parameters value: file ");
    SEGGER_RTT_WriteString(0, (uint8_t *)file);
    SEGGER_RTT_WriteString(0, (uint8_t *)" line");
    SEGGER_RTT_WriteString(0, StrSend);
    SEGGER_RTT_WriteString(0, (uint8_t *)"\n");

    if(line == 0)
    {
        return;
    }

    while(1)
    {
    }
}

回复

使用道具 举报

26

主题

161

回帖

239

积分

高级会员

积分
239
 楼主| 发表于 2026-3-16 09:49:25 | 显示全部楼层
eric2013 发表于 2026-3-16 08:14
这些信息打印处理分享就行

感谢大佬,我研究一下这些寄存器。
回复

使用道具 举报

26

主题

161

回帖

239

积分

高级会员

积分
239
 楼主| 发表于 2026-3-16 10:31:50 | 显示全部楼层
yono 发表于 2026-3-16 08:57
[mw_shl_code=c,true]
/* 兼容cubeMX自动生成的函数,进行函数名重定义 */
#define Error_Handler( ) Har ...

感谢,我尝试一下。
回复

使用道具 举报

26

主题

161

回帖

239

积分

高级会员

积分
239
 楼主| 发表于 2026-3-17 21:11:55 | 显示全部楼层
yono 发表于 2026-3-16 08:57
[mw_shl_code=c,true]
/* 兼容cubeMX自动生成的函数,进行函数名重定义 */
#define Error_Handler( ) Har ...

软件错误函数,我能理解,在判断函数返回值等是否执行成功。硬件错误函数,又是什么时候调用的?
回复

使用道具 举报

32

主题

329

回帖

425

积分

高级会员

积分
425
QQ
发表于 2026-3-17 22:23:23 | 显示全部楼层
本帖最后由 yono 于 2026-3-17 22:24 编辑
刘心武 发表于 2026-3-17 21:11
软件错误函数,我能理解,在判断函数返回值等是否执行成功。硬件错误函数,又是什么时候调用的?

类似你的 HAL_UART_INIT() 分支,调用 Error_Handler 函数。
这时候就可以重定向到硬件错误,因为外设初始化都错了。

软件错误是一些你自己的警告日志,比如收到错误帧,switch 进入了 default 分支,这时候用软件错误,打印或者固化记录,但不死循环打断程序运行。只是记录一下意外情况,但这些意外情况不致命,所以不必死机。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-7-10 07:07 , Processed in 0.526548 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表