硬汉嵌入式论坛

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

HAL库函数中经常调用的函数Error_Handler(__FILE__, __LINE__)可以考虑用软件断点实现

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2021-1-7 08:27:41 | 显示全部楼层 |阅读模式

我们经常会看到类似这种的代码:
  1. if (HAL_TIM_Base_DeInit(&TimHandle) != HAL_OK)
  2.     {
  3.         Error_Handler(__FILE__, __LINE__);
  4.     }
  5.    
  6.     if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
  7.     {
  8.         Error_Handler(__FILE__, __LINE__);
  9.     }
复制代码


而Error_Handler的实现如下:
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: Error_Handler
  4. *        形    参: file : 源代码文件名称。关键字 __FILE__ 表示源代码文件名。
  5. *                          line :代码行号。关键字 __LINE__ 表示源代码行号
  6. *        返 回 值: 无
  7. *                Error_Handler(__FILE__, __LINE__);
  8. *********************************************************************************************************
  9. */
  10. void Error_Handler(char *file, uint32_t line)
  11. {
  12.         /*
  13.                 用户可以添加自己的代码报告源代码文件名和代码行号,比如将错误文件和行号打印到串口
  14.                 printf("Wrong parameters value: file %s on line %d\r\n", file, line)
  15.         */
  16.         
  17.         /* 这是一个死循环,断言失败时程序会在此处死机,以便于用户查错 */
  18.         if (line == 0)
  19.         {
  20.                 return;
  21.         }
  22.         
  23.         while(1)
  24.         {
  25.         }
  26. }
复制代码


通过打印的方式来查看死机的位置,非常不方便,这里可以考虑采用软件断点,调试状态全速运行,如果出现错误会直接卡在配置错误的地方,用户此时再单步就可以方便看到出错位置。

详情看下面的帖子:

关于DAPLINK调试支持的硬件断点个数和软件断点个数
https://forum.anfulai.cn/forum.php?m ... d=101831&fromuid=58
(出处: 硬汉嵌入式论坛)


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
 楼主| 发表于 2021-1-7 08:29:11 | 显示全部楼层
很多时候用show caller code并不好用,弹不到原始调用的地方

MDK快速定位硬件异常位置方法,调用show caller code即可快速锁定
https://forum.anfulai.cn/forum.php?m ... id=94364&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

81

回帖

93

积分

初级会员

积分
93
发表于 2021-1-7 08:53:02 | 显示全部楼层
  1. /**
  2.   \brief   Breakpoint
  3.   \details Causes the processor to enter Debug state.
  4.            Debug tools can use this to investigate system state when the instruction at a particular address is reached.
  5.   \param [in]    value  is ignored by the processor.
  6.                  If required, a debugger can use it to store additional information about the breakpoint.
  7. */
  8. #define __BKPT(value)                       __ASM volatile ("bkpt "#value)
复制代码


在死循环前直接加个断点也行
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 21:20 , Processed in 0.040334 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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