Advertisement

硬件故障排查

阅读量:

导致HardFault原因

  • 数组越界与内存溢出问题,例如在进行数组访问时,动态获取的索引值超出数组实际长度,或在动态分配内存时所设定的空间不足;
    • 堆栈溢出现象,比如在程序运行过程中,局部变量所占用的空间过大,超出栈区可分配范围,从而引发程序异常;
    • 在启动外设时钟之前即尝试访问相关外设寄存器,如在Kinetis系列芯片中,在未开启外设时钟的情况下对寄存器进行配置;
    • 不规范的操作行为,例如执行非对齐的数据读写、进行除以零的运算(在M3/M4/M7系列处理器中,默认情况下不会触发异常,因为ARM内核CCR寄存器中的DIV_0_TRP位默认为0;而在M0系列中该位为保留位,同样不会产生异常)以及强制访问受保护的内存区域等;

HardFault代码定位方法

1、通过仿真方法:

为查明Hard Fault的成因及其触发的代码段,必须深入理解系统在发生异常时MCU的处理流程:当处理器接收到异常信号后,芯片硬件会自动将当前8个通用寄存器组压入栈空间中(依次包括xPSR、PC、LR、R12以及R3~R0)。若异常发生时当前代码正在使用PSP,则上述8个寄存器会被压入PSP;否则则压入MSP。接下来的问题是,如何确定这个栈空间的具体地址?答案是SP寄存器。然而,由于压栈过程中存在MSP与PSP两种情况,如何判断触发异常时所使用的为MSP还是PSP

全部评论 (0)

还没有任何评论哟~