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的倍数。


       最后,当我们出现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出现的位置。
         
        

        

           
 
       第二种:
       通过R13(sp)去反推进入Hard Fault中断前,在栈中存放的程序位置,取栈的第7个地址内容去查找进入前的函数位置。

        
     
       参考链接:
http://www.nuvoton.com.cn/support/technical-support/faq/d5c135b3-04f1-11ea-b113-05daf7eedf03/

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論