Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Hardfault
log
RT-Thread 应用笔记 - 不正确使用LOG也会引发hard fault
发布于 2020-11-28 10:31:06 浏览:2228
订阅该版
[tocm] [RT-Thread 入门学习笔记 - 目录](https://club.rt-thread.org/ask/article/3420.html) [RT-Thread 应用笔记 - 不正确使用LOG也会引发hard fault](https://club.rt-thread.org/ask/article/2329.html) [RT-Thread 应用笔记 - RTC Alarm 组件的使用](https://club.rt-thread.org/ask/article/2312.html) [RT-Thread 应用笔记 - freemodbus RTU RS485 从机](https://club.rt-thread.org/ask/article/2346.html) [RT-Thread 应用笔记 - freemodbus RTU RS485 主机](https://club.rt-thread.org/ask/article/2353.html) [RT-Thread 应用笔记 - libmodbus RTU RS485 从机](https://club.rt-thread.org/ask/article/2378.html) [RT-Thread 应用笔记 - libmodbus RTU RS485 主机](https://club.rt-thread.org/ask/article/2382.html) [RT-Thread 应用笔记 - STM32 CAN 通信双机](https://club.rt-thread.org/ask/article/2385.html) ## 前言 * 最近在调试RT-Thread的代码时,使用了 **LOG_D** 这样的基于串口输出的调试方式进行调试信息或错误信息的打印。 * 调试的LOG输出,在代码发布时,不需要逐行的注释掉,只需要更改DBG_LEVEL,可以【一键关闭所有LOG,或LOG分级过滤输出】,大大提高调试效率。 * 大部分的代码是调试出来的,LOG是比较实用的调试方法之一。 ## DEBUG LOG开启的方式如下: ```c #define DBG_ENABLE #define DBG_SECTION_NAME "main" #define DBG_LEVEL DBG_LOG #include
``` ## DEBUG LOG 的使用方法如下: ```c void dump_system_clk(void) { LOG_D("%s:SysClockFreq=%d, HCLKFreq=%d,PCLK1Freq=%d,PCLK2Freq=%d\n", __func__, HAL_RCC_GetSysClockFreq(), HAL_RCC_GetHCLKFreq(), HAL_RCC_GetPCLK1Freq(), HAL_RCC_GetPCLK2Freq() ); } MSH_CMD_EXPORT(dump_system_clk, dump system clock); ``` ## 问题描述 * 为了快速定位,在调试的时候,一般会把函数名与行号都打印出来,__func__, __line__等。 * 但是如果打印时,前面的打印格式:如%s:%d,%d,%d,与后面的参数,没有一一对应好,就会引发各种【奇怪】问题! * 问题轻点的:打印的数据不对,甚至有乱码出现。 * 严重的:产生了断言与hardfault。 * 如果前期没有规范LOG输出,后期规范了,但忘记一一测试LOG的输出,某个参数巨多的LOG输出,需要额外注意下。 * 如果LOG_E这样的,一般不会进入触发,但特殊条件触发了,出现了由于打印引发的【hard fault】。 * 如果你根本分不清除是代码引起的,还是LOG输出引起的,调试起来很头疼 * 我的问题是:**关闭LOG后,测试没问题,开启LOG后,高概率会hardfault** * 【排雷】过程中,发现自己在LOG_D时,多了个%s,或者少了个__func__,就出现了【hardfault】。 * 经过反复的确认代码,发现没有更多的异常,最终确认这个问题的根因:LOG打印时,少了参数,并且这个LOG打印,是在极端情况下才会打印! * 所以代码编写后,需要细心,还要大面积的【覆盖】测试与验证 ## Bad Code 示例 * 参数多了,可能遗漏__func__,多加了%d,等等,需要认真对待。 * 例子:以下为漏了__func__: ```c void dump_system_clk(void) { LOG_D("%s:SysClockFreq=%d, HCLKFreq=%d,PCLK1Freq=%d,PCLK2Freq=%d\n", HAL_RCC_GetSysClockFreq(), HAL_RCC_GetHCLKFreq(), HAL_RCC_GetPCLK1Freq(), HAL_RCC_GetPCLK2Freq() ); } ``` 执行MSH cmd命令后: ```c msh >dump_system_clk [D/main] psr: 0x01000000 r00: 0x04c4b400 r01: 0x04c4b400 r02: 0x04c4b400 r03: 0x20003ed4 r04: 0x2000161c r05: 0x00000000 r06: 0x2000171b r07: 0xffffffff r08: 0x2000161c r09: 0xffffffff r10: 0xdeadbeef r11: 0xdeadbeef r12: 0x00000001 lr: 0x0800f0cf pc: 0x0800dd32 hard fault on thread: tshell thread pri status sp stack size max used left tick error -------- --- ------- ---------- ---------- ------ ---------- --- emq_pms 28 suspend 0x0000007c 0x00000800 08% 0x0000002c 000 tshell 20 running 0x00000084 0x00001000 07% 0x0000000a 000 serial 25 suspend 0x00000088 0x00000400 13% 0x00000007 000 tidle0 31 ready 0x00000050 0x00000800 05% 0x0000000a 000 main 10 suspend 0x0000009c 0x00000800 41% 0x0000000c 000 bus fault: SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:04C4B400 ``` * 修复的方法:补充上__func__即可 * LOG_D、 LOG_I、LOG_E等调试信息输出,是用来定位程序问题的,本身不能成为问题。 ## 小结 * 增强LOG输出时的检查,格式化输出时,参数的数量、格式,都要认真处理好,很长的LOG确认是否可以精简。 * 代码调试中,遇到各种【诡异】的问题,只要细心,总能找到【准确】的解释或【正确】的答案。 * 代码编写要细心,调试要细心,这样才能产出高质量的代码。 * 正确使用LOG_D、 LOG_E等,大大提高程序的移植性、可调试性,能提高调试的效率。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
801
被采纳
173
关注TA
发私信
相关文章
1
RTT1.0,STM32调试时会跑到HardFault【已解决】,出现新问题
2
新手请教关于hardfault怎么查
3
github最新版本库中stm32f0X分支,运行切换任务时候出现hardfault[已解决]
4
实现iap功能,bootloader使用了rtt操作系统,在跳转到app代码的时候提示出现hardfault的问题
5
ymodem在on_begin内发送can无法断开连接,而且RTT会报hardfault
6
挂载UFFS文件系统执行到退出_BuildTreeStepOne函数时hardfault异常
7
STM32F1+RTT串口接收中断进入hardfault
8
STM32F746NG随机进入hardfault(已解决)
9
[已解决]自已建了个STM32F103的MDK工程,初始化时总是进入HardFault,求教!
10
将 Cortex M3 的 hardfault 处理与 M4、M7、M0 保持一致?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部