搜索
bottom↓
回复: 356

【开源】ARM Cortex-M 错误追踪库,让 HardFault 不再可怕

  [复制链接]

出0入198汤圆

发表于 2017-4-19 17:39:33 | 显示全部楼层 |阅读模式
本帖最后由 sunnydragon 于 2017-4-19 19:17 编辑

CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库

0、CmBacktrace 是什么
CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
  • 支持的错误包括:
    • 断言(assert)
    • 故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)
  • 故障原因 自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;
  • 输出错误现场的 函数调用栈(需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数调用栈;
  • 支持 裸机 及以下操作系统平台:
  • 根据错误现场状态,输出对应的 线程栈 或 C 主栈;
  • 故障诊断信息支持多国语言(目前:简体中文、英文);
  • 适配 Cortex-M0/M3/M4/M7 MCU;
  • 支持 IAR、KEIL、GCC 编译器;


1、为什么选择 CmBacktrace

入门新人 :对于从 C51 、MSP430 等简单单片机转而使用更加复杂的 ARM 新人来说,时不时出现的 "hard falut" 死机会让新人瞬间懵掉。定位错误的方法也往往是连接上仿真器,一步步 F10/F11 单步,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这种过程十分痛苦。

熟练老手 :慢慢的大家知道可以通过故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是无法解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的,所以还是得一步步 F10/F11 单步去定位错误代码的位置。另外,还有两种场景,

  • 1、很多产品真机调试时必须断开仿真器
  • 2、问题确实存在,但是极难被重现

所以定位这类问题就显得难上加难。

使用本库 :上述所有问题都迎刃而解,可以将错误信息输出到控制台上,还可以将错误信息使用 EasyFlash 的 Log 功能保存至 Flash 中,设备死机后重启依然能够读取上次的错误信息。CmBacktrace 输出的信息包括函数调用栈、故障诊断结果、堆栈、故障寄存器及产品固件信息,极大的提升了错误定位的效率及准确性。

俗话说,工欲善其事,必先利其器。所以有时候做事效率低的原因也许是,你会用的工具种类太少。

合作、贡献 :开源软件的发展离不开大家的支持,欢迎大家多提建议,也希望更多的人一起参与进来,共同提高 。如果觉得这个开源项目很赞,可以点击 项目主页 (Github|OSChina|Coding) 右上角的 Star ,同时把它推荐给更多有需要的朋友。

2、CmBacktrace 如何使用


2.1 演示
该演示分如下几个步骤:
  • 1、制造除零异常(IAR 工程,点击查看源码
  • 2、查看错误诊断信息
  • 3、查看函数调用栈基本信息
  • 4、通过命令行工具进入项目工程存放可执行文件的路径
  • 5、使用 addr2line 命令,查看函数调用栈详细信息,并定位错误代码

[/url]
2.2 Demo
目录
平台
链接
\demos\non_os\stm32f10x
裸机 STM32 Cortex-M3
[url=https://github.com/armink/CmBacktrace/tree/master/demos/non_os/stm32f10x]点击查看
\demos\os\rtthread\stm32f4xx
RT-Thread STM32 Cortex-M4
\demos\os\ucosii\stm32f10x
UCOSII STM32 Cortex-M3
\demos\os\freertos\stm32f10x
FreeRTOS STM32 Cortex-M3


更多移植、 API 说明及常见问题说明文档,详见 :
https://github.com/armink/CmBacktrace  的 2.3 、 2.4 及 2.5 章节

2.3 许可

采用 MIT 开源协议,细节请阅读项目中的 LICENSE 文件内容。


3、下载

最新版请关注 GitHub :https://github.com/armink/CmBacktrace  
本坛:


4、其他

历经半年多的努力 CmBacktrace 终于正式与大家见面,开发在 4 个月前基本都结束了,但迟迟不敢轻易的正式发布。一方面 CmBacktrace 作为很底层的库,同时身兼故障诊断的重任,必须要充分测试,保证其可靠性,再者也想让自己的开源节奏降低些,专注用户的真实需求,培养更多的刚需用户。用户群大了,才能真正体现出开源软件的价值。

最后,要感谢我的老婆,她在家里承担了绝大多数家务以及小孩的教育,这才让我有充足的业余时间去做这些开源软件。

另外,还要感谢我身边那些愿意去试用测试,第一次吃螃蟹的开发者,是他们不停地反馈、交流,才让软件质量和用户体验得到很大的提高。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入198汤圆

 楼主| 发表于 2017-5-22 21:49:28 | 显示全部楼层
CmBacktrace V1.0.0 正式版先已发布,增加对 FreeRTOS 的支持,欢迎大家下载。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-4-19 17:40:29 | 显示全部楼层
好东西啊~

出0入76汤圆

发表于 2017-4-19 17:43:23 | 显示全部楼层
这工具不错,感谢分享

出0入22汤圆

发表于 2017-4-19 17:45:33 | 显示全部楼层
大赞!!!!

出0入93汤圆

发表于 2017-4-19 17:54:27 | 显示全部楼层
好东西! "hard falut" 让人瞬间懵逼,希望这个能很好解决!

出0入0汤圆

发表于 2017-4-19 18:05:45 | 显示全部楼层
挺好的东西

出0入0汤圆

发表于 2017-4-19 18:27:59 来自手机 | 显示全部楼层
好东西 大赞

出20入0汤圆

发表于 2017-4-19 18:35:56 | 显示全部楼层
   太感谢了,从楼主这里学到很多,谢谢。

出0入0汤圆

发表于 2017-4-19 18:42:28 | 显示全部楼层
感谢楼主

楼主的开源让我获益良多啊

每一个开源都是精品,都是戳到用户痛点的好东西。非常难得~~~

出0入4汤圆

发表于 2017-4-19 18:51:53 | 显示全部楼层
好东西,之前碰到过HardFault,很难查原因

出0入0汤圆

发表于 2017-4-19 18:59:35 | 显示全部楼层
真的是好东西,之前看到有人分析如何定位故障代码,就一直想着有没有开源的库可以用,结果真的来了, 太感谢了。    本来还以为这种除错的库会是 ARM 或者 ST 官方会出,结果想错了。

出0入0汤圆

发表于 2017-4-19 19:07:41 | 显示全部楼层
感谢感谢,,我想问问这个适合于我们这种小白的业余爱好者吗?

出0入0汤圆

发表于 2017-4-19 19:13:06 | 显示全部楼层
感谢楼主的分享.

出40入42汤圆

发表于 2017-4-19 19:32:48 | 显示全部楼层
这个实在太实用了,谢谢楼主的分享

出0入0汤圆

发表于 2017-4-19 19:40:14 | 显示全部楼层
好东西,楼主牛人

出0入0汤圆

发表于 2017-4-19 19:41:10 | 显示全部楼层
楼主又出精品,正准备移植楼主Freemodbus的主机到FreeRTOS。

出0入4汤圆

发表于 2017-4-19 19:44:40 来自手机 | 显示全部楼层
嗯 确实是好。但是目前跑的是自己一直的一个轻量级的os不知是否支持。回头测试下。

出90入0汤圆

发表于 2017-4-19 19:46:47 来自手机 | 显示全部楼层
很厉害,精品啊!

出0入0汤圆

发表于 2017-4-19 19:58:08 | 显示全部楼层
厉害了 我的歌

出0入0汤圆

发表于 2017-4-19 20:26:00 | 显示全部楼层
这个比较强大,感谢楼主,下来试试

出0入0汤圆

发表于 2017-4-19 20:26:50 | 显示全部楼层
之前我有写过一篇有异曲同工的文章,在Linux中如何利用backtrace信息解决问题,最后我想MCU也可以这么做,感谢楼主分享出来

出0入0汤圆

发表于 2017-4-19 20:40:46 | 显示全部楼层
楼主出品,必属精品

出0入0汤圆

发表于 2017-4-19 20:55:32 来自手机 | 显示全部楼层
实在看不明白,有什么用

出0入90汤圆

发表于 2017-4-19 21:00:31 | 显示全部楼层
楼主出品,必属精品啊。这个还是挺牛逼的。研究下,加到程序里面去。

出0入42汤圆

发表于 2017-4-19 21:06:17 | 显示全部楼层
好资料 谢谢  来学习一下

出0入0汤圆

发表于 2017-4-19 21:11:01 | 显示全部楼层
楼主的帖子总是那么高上大,厉害!

出0入0汤圆

发表于 2017-4-19 21:18:11 | 显示全部楼层
这个很厉害啊,还有gCC版本

出0入0汤圆

发表于 2017-4-19 21:18:49 | 显示全部楼层
厉害啊  真佩服         

出0入0汤圆

发表于 2017-4-19 21:32:54 | 显示全部楼层
感谢楼主,感谢楼主的老婆!

出0入0汤圆

发表于 2017-4-19 21:33:47 | 显示全部楼层
好东西,HardFault ,标记

出0入0汤圆

发表于 2017-4-19 21:36:25 | 显示全部楼层
好东西,谢谢楼主分享。

出0入0汤圆

发表于 2017-4-19 21:45:17 | 显示全部楼层
感谢楼主的分享。。。。。。

出0入0汤圆

发表于 2017-4-19 21:48:07 | 显示全部楼层
感谢楼主分享,收藏学习了

出0入10汤圆

发表于 2017-4-19 21:49:25 来自手机 | 显示全部楼层
好东西,谢谢楼主分享。

出0入0汤圆

发表于 2017-4-19 22:04:55 来自手机 | 显示全部楼层
好东西,感谢分享

出0入4汤圆

发表于 2017-4-19 22:12:32 来自手机 | 显示全部楼层
大赞咯,感谢分享

出0入0汤圆

发表于 2017-4-19 22:30:59 | 显示全部楼层
谢谢 学习 收藏

出0入0汤圆

发表于 2017-4-19 22:36:15 来自手机 | 显示全部楼层
流弊啊,谢谢!

出0入0汤圆

发表于 2017-4-19 22:37:34 来自手机 | 显示全部楼层
太赞了,满满的干货

出0入0汤圆

发表于 2017-4-19 22:48:20 | 显示全部楼层
不错不错

出0入0汤圆

发表于 2017-4-19 23:15:56 来自手机 | 显示全部楼层
非常感谢啊,回头长时间使用下

出60入85汤圆

发表于 2017-4-19 23:48:50 | 显示全部楼层
好东西,真心赞!!

出0入0汤圆

发表于 2017-4-20 00:25:05 来自手机 | 显示全部楼层
楼主又出好东西了,赞

出150入135汤圆

发表于 2017-4-20 00:57:16 来自手机 | 显示全部楼层
谢谢分享!收藏了

出0入0汤圆

发表于 2017-4-20 07:13:27 来自手机 | 显示全部楼层
linux段错误如何定位

出0入0汤圆

发表于 2017-4-20 07:37:59 来自手机 | 显示全部楼层
大赞,感谢楼主。

出0入0汤圆

发表于 2017-4-20 08:06:34 | 显示全部楼层
好东西,收藏了!

出0入0汤圆

发表于 2017-4-20 08:31:36 | 显示全部楼层
不错,好东西,支持一下。

出0入0汤圆

发表于 2017-4-20 08:34:30 | 显示全部楼层
正在为HardFault头痛呢

出100入101汤圆

发表于 2017-4-20 08:35:09 | 显示全部楼层
单纯顶一下大牛

出0入198汤圆

 楼主| 发表于 2017-4-20 08:35:57 | 显示全部楼层
tim 发表于 2017-4-19 17:54
好东西! "hard falut" 让人瞬间懵逼,希望这个能很好解决!

亲手试试就知道喽~~欢迎反馈体验。。

出0入198汤圆

 楼主| 发表于 2017-4-20 08:37:20 | 显示全部楼层
talkingbeast 发表于 2017-4-19 18:35
太感谢了,从楼主这里学到很多,谢谢。

多谢支持~~

出0入0汤圆

发表于 2017-4-20 08:38:01 | 显示全部楼层
赞! 顶! 支持!

谢谢!

出0入0汤圆

发表于 2017-4-20 08:38:51 | 显示全部楼层
mark 好东西

出0入0汤圆

发表于 2017-4-20 08:40:07 | 显示全部楼层
感谢楼主分享。

出0入198汤圆

 楼主| 发表于 2017-4-20 08:40:27 | 显示全部楼层
FireHe 发表于 2017-4-19 18:42
感谢楼主

楼主的开源让我获益良多啊

多谢支持哈~~

开源也需要更多的人一起参与,不管是设计、开发、测试、反馈等等都行,大家互动起来,软件的生态圈才会更加健康发展起来。

出0入198汤圆

 楼主| 发表于 2017-4-20 08:44:25 | 显示全部楼层
gdoujiajia 发表于 2017-4-19 18:51
好东西,之前碰到过HardFault,很难查原因

那就快来试试 CmBacktrace 吧~~完全颠覆传统的 Handfault 解决方法。

出0入0汤圆

发表于 2017-4-20 08:46:53 | 显示全部楼层
感谢楼主分享,

出0入4汤圆

发表于 2017-4-20 08:50:53 | 显示全部楼层
Handfault 确实是挺不好找原因的,下下来看看

出0入198汤圆

 楼主| 发表于 2017-4-20 08:51:09 | 显示全部楼层
huchunlei 发表于 2017-4-19 18:59
真的是好东西,之前看到有人分析如何定位故障代码,就一直想着有没有开源的库可以用,结果真的来了, 太感 ...

这类小工具 ARM,ST 不一定会在乎了,这也正是我们这些国内开源开发者的优势。更了解开发者,软件才会更接地气~

出0入0汤圆

发表于 2017-4-20 08:53:47 | 显示全部楼层
谢谢楼主!太强了!

出0入0汤圆

发表于 2017-4-20 08:53:57 | 显示全部楼层
造福众生!!

出0入0汤圆

发表于 2017-4-20 08:54:24 | 显示全部楼层
太需要这个功能了,每次硬件异常终端,要从LR寄存器去找在哪里挂掉的,但是往往看不出实际原因。

出0入0汤圆

发表于 2017-4-20 08:55:24 | 显示全部楼层
NICE 啊,楼主用心了!

出0入0汤圆

发表于 2017-4-20 08:56:02 | 显示全部楼层
佩服楼主的开源精神。

出0入198汤圆

 楼主| 发表于 2017-4-20 08:57:36 | 显示全部楼层
mlnet 发表于 2017-4-19 19:07
感谢感谢,,我想问问这个适合于我们这种小白的业余爱好者吗?

完全适合,CmBacktrace 正是为了降低 HardFault 的处理门槛,让所有的开发者都能更加轻松的解决这类问题。减少重复性工作,让开发者的精力更好的聚焦在软件开发上。

所以,你先试试,有啥问题,可以再跟帖。欢迎多多分享你的感受。

出0入0汤圆

发表于 2017-4-20 08:57:59 | 显示全部楼层
这个很方便了

出0入198汤圆

 楼主| 发表于 2017-4-20 08:59:11 | 显示全部楼层
xiaoergao 发表于 2017-4-19 19:44
嗯 确实是好。但是目前跑的是自己一直的一个轻量级的os不知是否支持。回头测试下。 ...

多谢支持,期待你的反馈~~

出0入198汤圆

 楼主| 发表于 2017-4-20 09:00:05 | 显示全部楼层
wmm20031015 发表于 2017-4-19 20:26
这个比较强大,感谢楼主,下来试试

多谢支持哈~~期待你的试用体验~~

出0入8汤圆

发表于 2017-4-20 09:01:23 | 显示全部楼层
怎么说呢?
每一个成功男人的背后,总有那么一个默默支持的女人!楼主是幸福的。

虽然我自己很少触发 hardfault,但对于 team 作战而言,还是要时不时与之打交道,关注下。
给楼主赞一个!

出0入0汤圆

发表于 2017-4-20 09:01:30 | 显示全部楼层
哇塞,我就知道大神都有好东西

出0入12汤圆

发表于 2017-4-20 09:05:45 | 显示全部楼层

感谢楼主分享

出0入0汤圆

发表于 2017-4-20 09:06:58 | 显示全部楼层
楼主开源的几个软件都太给力了  

出0入0汤圆

发表于 2017-4-20 09:14:27 | 显示全部楼层
好东西。。。

出0入0汤圆

发表于 2017-4-20 09:16:26 | 显示全部楼层
感谢开源

出425入0汤圆

发表于 2017-4-20 09:18:33 | 显示全部楼层
我也碰到过几次hardfault,只会追踪LR或者PC,到此为止,更深入的不会了。好在解决了。

出0入0汤圆

发表于 2017-4-20 09:20:27 | 显示全部楼层
mark  很好的东西  感谢楼主分享

出0入0汤圆

发表于 2017-4-20 09:20:53 | 显示全部楼层
这个软件 不错,再遇到问题可以找到原因,不要重累代码

出0入0汤圆

发表于 2017-4-20 09:22:51 | 显示全部楼层
好东西,感谢LZ分享。。。

出0入198汤圆

 楼主| 发表于 2017-4-20 09:23:04 | 显示全部楼层
tianheiGE 发表于 2017-4-19 20:26
之前我有写过一篇有异曲同工的文章,在Linux中如何利用backtrace信息解决问题,最后我想MCU也可以这么做, ...

多谢支持,我也是看到很多高级语言及 Linux 平台有这类功能,才想到设计 CmBacktrace 。欢迎试用哈,希望你能站在 Linux 角度做下对比,反馈下软件的体验。

出0入198汤圆

 楼主| 发表于 2017-4-20 09:28:49 | 显示全部楼层
R8C 发表于 2017-4-19 20:55
实在看不明白,有什么用

具体哪个章节没有看明白?

出0入198汤圆

 楼主| 发表于 2017-4-20 09:29:32 | 显示全部楼层
honami520 发表于 2017-4-19 21:00
楼主出品,必属精品啊。这个还是挺牛逼的。研究下,加到程序里面去。

多谢支持,用完了,记得反馈体验哈~

出0入0汤圆

发表于 2017-4-20 09:32:24 | 显示全部楼层
感谢楼主,辛苦了

出0入0汤圆

发表于 2017-4-20 09:52:33 | 显示全部楼层
下面这个错误不知道你的代码能不能定位出来。就是当用SDRAM作为栈空间,函数返回时执行到pop{Rx,Ry,PC}指令,如果下面这种读取错误发生,就会将错误的值读取到PC,就会发生HardFault。这种HardFault发生有很大的不确定性,有时运行10个小时都不发生,有时运行10分钟就发,HardFault的种类也会有变化。若有多个任务,HardFault的位置可能有多个,代码上看不出任何问题,极难定位。
而且由于发生HardFault时,R0~R3,R12,LR,PC,XPSR,这8个寄存器会自动入栈,正好会把栈空间上发生读取错误的位置上的数据覆盖掉,就无法确认是否是栈上的数据真的错了。当然HardFault时入栈的PC值是个异常值,这是可以清楚看到的。

STM32F42xx and STM32F43xx silicon limitations
DocID023833 Rev 10

2.11.5 Interruption of CPU read burst access to an end of SDRAM row

Description:
If an interrupt occurs during an CPU AHB burst read access to an end of SDRAM row, it may result in wrong data read from the next row if all the conditions below are met:
• The SDRAM data bus is 16-bit or 8-bit wide. 32-bit SDRAM mode is not affected.
• RBURST bit is reset in the FMC_SDCR1 register (read FIFO disabled).
• An interrupt occurs while CPU is performing an AHB incrementing bursts read access of unspecified length (using LDM = Load Multiple instruction).
• The address of the burst operation includes the end of an SDRAM row.

Workaround:
Enable the read FIFO by setting the RBURST bit in the FMC_SDCR1 register.

出0入0汤圆

发表于 2017-4-20 09:58:35 | 显示全部楼层
本帖最后由 myxiaonia 于 2017-4-20 11:00 编辑

打算尝试一下,不过要是能够步骤简单一点就更牛了


其实我现在处理hardfalt是用一个结构体恢复出错前的寄存器结构,这个方法也是st的一个应用笔记里提到的,当然arm文档里也有,就是那个权威指南了,rtt的代码里也有这个实现啊

一般情况下很快就能定位到出错时的pc指针

出0入0汤圆

发表于 2017-4-20 10:19:19 | 显示全部楼层
已粉楼主

出0入0汤圆

发表于 2017-4-20 10:25:23 | 显示全部楼层
太感谢了,建议申请精华帖,这个东西很有用的。楼主无私

出0入0汤圆

发表于 2017-4-20 10:30:14 | 显示全部楼层
给楼主赞一个

出0入0汤圆

发表于 2017-4-20 11:07:10 | 显示全部楼层
楼主厉害,前几次小项目遇到硬件中断也是生不如死,调试好久才解决。到时试试这个库

出0入0汤圆

发表于 2017-4-20 11:32:18 | 显示全部楼层
楼主真是开源达人。

出0入0汤圆

发表于 2017-4-20 11:36:22 | 显示全部楼层
太强了哈

出0入0汤圆

发表于 2017-4-20 11:50:33 | 显示全部楼层
这个好,HardFault有时候真的够烦的

出0入0汤圆

发表于 2017-4-20 12:00:39 | 显示全部楼层
好东西,感谢楼主分享

出0入0汤圆

发表于 2017-4-20 12:19:29 | 显示全部楼层
楼主的几个项目都很牛,elog现在好在用。

出0入0汤圆

发表于 2017-4-20 12:27:21 | 显示全部楼层
前排留名,顶大神

出0入0汤圆

发表于 2017-4-20 12:32:38 | 显示全部楼层
牛叉,精品,酷前马克~~~~~~

出0入0汤圆

发表于 2017-4-20 12:43:16 来自手机 | 显示全部楼层
牛人历害,改天试试

出0入0汤圆

发表于 2017-4-20 12:46:46 | 显示全部楼层
很不错,开源的都值得称赞

出0入0汤圆

发表于 2017-4-20 12:51:13 | 显示全部楼层
sunnydragon经常开源一些好东西啊,大赞!

出0入0汤圆

发表于 2017-4-20 13:03:39 | 显示全部楼层
感谢牛人的分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 18:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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