打印
[文档下载]

Nuvoton开发流程 初级篇 5 -- Hard Fault 分享

[复制链接]
1612|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Nuvoton开发流程 初级篇 5 -- Hard Fault分享

首先,我们来了解下什么Hard Fault?从字面意思理解就是硬件故障,根本原因是非法的存储器访问(比如访问0地址、写只读存储位置等)和非法的程序行为(比如除以0等)等造成的。
        接着,我们来了解下产生的实际案例有哪些呢?
        1、内存的溢出,包括堆栈的溢出,其中单片机内存和堆栈的关系。
       参考链接:
http://blog.csdn.net/c12345423/article/details/53004747
        2、越界访问。
        这常指数组的使用,具体来说,访问只有5个元素的数组的第6个元素时,就出现了越界访问。而这一错误,常常出现于数组作为函数参数传入时,由于只传入指针,而函数中不确定指针访问的平移量,就可能出现越界访问的错误。值得注意的是,C语言并没有越界访问的编译查询,也就是说,在编译时不会检测是否存在越界访问。
        3、错误使用flash造成的异常错误。
一是由于在使用flash存储数据时,其存储空间有可能和代码区重叠;二是由于 自身需求,需要转换指向flash的指针的指向类型,如转换成float*,使指针在 flash上以4个单位的间隔移动,但是由于flash是分区的,如果区首地址和被转换指针之间的间隔不是4的倍数也会出现错误。
        4、这一年大家都是自己画PCB,自己写程序,有时候会发现PCB的焊接也会造成HardFault,并且这种错误从程序开始就会存在。
        5、野指针寻址,除以0(也可能得出inf而不会产生错误)等常见C语法错误。

       最常见的就是:
       甲、访问未定义的区域。超过SRAM区域。Int SUM[5],实际使用到SUM[6]。
       乙、写只读区域。在闪存地址写入数据。
       丙、非法程序。除法等于零。 函数除以0。
       丁、非法指针地址。Ex.指针变量类型为uint32_t*,指针地址不是4的倍数。


使用特权

评论回复
沙发
goodluck09876|  楼主 | 2021-10-14 11:19 | 只看该作者
最后,当我们出现Hard Fault时,如何找到代码位置,在进行修改呢?我们有两种方式快速找到Hard Fault出现的位置。
       第一种:
       参考BSP开发包中SampleCode\Hard_Fault_Sample\KEIL\ Hard_Fault_Sample程序,里面有三种情况都会进入Hard Fault。默认的硬故障处理程序在retarget.c中实现,称为Hard_Fault_Handler。当出现Hard_Fault时,Hard_Fault_Handler会打印r0、r1、r2、r3、r12、lr、pc和psr的信息。通过pc指针地址,找到Hard Fault出现的位置。



使用特权

评论回复
板凳
goodluck09876|  楼主 | 2021-10-14 11:20 | 只看该作者


使用特权

评论回复
地板
goodluck09876|  楼主 | 2021-10-14 11:21 | 只看该作者
第二种:
       通过R13(sp)去反推进入Hard Fault中断前,在栈中存放的程序位置,取栈的第7个地址内容去查找进入前的函数位置。

使用特权

评论回复
5
goodluck09876|  楼主 | 2021-10-14 11:22 | 只看该作者
参考链接:http://www.nuvoton.com.cn/support/technical-support/faq/d5c135b3-04f1-11ea-b113-05daf7eedf03/

使用特权

评论回复
6
豌豆爹| | 2021-10-19 11:27 | 只看该作者
收藏,学习一下

使用特权

评论回复
7
kiwis66| | 2021-10-27 13:30 | 只看该作者
这个倒是经常遇到,mark,下次回来对照

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

21

粉丝