上报fault地址寄存器



你好,我正在使用LM3S9B96做一个项目。现在使用的CPU是C3的,目前遇到的问题是:

我们的应用程序运行十多个小时后就死机了,程序进入fault中,打印出状态寄存器的值为:

[Hard fault handler]

R0 = 0xacfd48e1

R1 = 0xfffffffd

R2 = 0x20010640

R3 = 0x2000cd48

R12 = 0x5730

LR = 0x0

PC = 0x0

PSR = 0x514d

BFAR = 0xe000ed38

CFSR = 0x40000

HFSR = 0x40000000

DFSR = 0x0

AFSR = 0x0

使用C5的CPU,情况会好一些,运行时间长了很多。请问这是什么原因?

  • 这个看起来和C3/C5关系不大。你用的什么IDE?怎么没打印堆栈指针? 另外,进入fault后,PC值为0,这个比较怪异。

  •  

    使用的是IAR 6.0。

    打印出来的信息不确定,有时打印出来的是

    [Hard fault handler]

    R0 = 0xd9cd151c

    R1 = 0x78557e4d

    R2 = 0x6b0ce972

    R3 = 0xb2fafbfb

    R12 = 0x89ff0b39

    LR = 0xadf4cf9b

    PC = 0xba9b2533

    PSR = 0x3a0985ad

    BFAR = 0xe000ed38

    CFSR = 0x40000

    HFSR = 0x40000000

    DFSR = 0x0

    AFSR = 0x0

    PC指到无效的位置。

  • 这样,你可以试一下用IDE仿真运行,在各个fault里面设断点,看看程序会不会进到这些断点里面。

    另外,这种怪问题,很可能是非法指针,或者不正确的使用外设模块造成。你仔细查查程序吧。

  • 不可能是外设的问题,频繁操作时没有死机。

    怀疑是指针的问题。

    程序太大,指针很多,很难定位,只能一段一段测试了。有没有好办法直接定位?

  • 指针飞了,查起来比较难,但是也只能着这么样了.

    代码发上来大家帮你看。

    你可以看看死机后全局变量有没有被写坏

    根据写坏的部分慢慢的找对应的代码,然后再怀疑出错的地方加上桩函数来捕获.

  • uCOS-II下中断程序中要向任务发送信号量,中断服务程序:

    // 定时器的中断服务函数

    void Timer1A_ISR(void)

    {

    unsigned long ulStatus;

    OSIntEnter();

    ulStatus = TimerIntStatus(TIMER1_BASE , true); // 读取中断状态

    TimerIntClear(TIMER1_BASE , ulStatus); // 清除中断状态

    if ( ulStatus & TIMER_TIMA_TIMEOUT ) // 如果是定时器超时中断

    {

    .......

    // 发送信号量 OSSemPost();

    ........

    }

    OSIntExit();

    }

    这样写可以吗?,怎么写是最合理的??

  • 可以这么使用.很多时候都是这么用的.