各位大佬好,我的程序是基于阿波罗
STM32F429的BSP开发的。现在每运行2个小时左右就会死机,打印出来的消息如下:
runThread Rpsr: 0x40000000
r00: 0x200082c0
r01: 0x00000000
r02: 0x00000000
r03: 0x00000000
r04: 0x00000000
r05: 0x00000000
r06: 0x00000064
r07: 0x00000000
r08: 0x00000003
r09: 0x00000000
r10: 0xdeadbeef
r11: 0xdeadbeef
r12: 0x20009508
lr: 0x0801d9ad
pc: 0x20009508
hard fault on thread: cantxmo
thread pri status sp stack size max used left
tick error
-------- --- ------- ---------- ---------- ------ ---------- ---
louimb 15 ready 0x000004ac 0x00000c00 38% 0x00000002 -02
runTd 23 ready 0x0000014c 0x00000c00 17% 0x00000002 000
alarmTd 22 suspend 0x000000e4 0x00000400 33% 0x00000002 000
taskTd 21 ready 0x00000104 0x00000200 69% 0x00000001 -02
thTxTd 3 suspend 0x00000100 0x00000400 25% 0x00000005 000
thTd 2 suspend 0x00000088 0x00000400 13% 0x00000001 000
uiTxTd 16 ready 0x00000100 0x00000400 28% 0x00000003 -02
uiTd 17 ready 0x00000088 0x00000400 15% 0x00000003 000
loTxTd 6 suspend 0x00000100 0x00000400 28% 0x00000002 000
loTd 7 suspend 0x00000088 0x00000400 15% 0x00000004 000
cantxmo 7 ready 0x0000009c 0x00000200 30% 0x00000002 000
canrxmo 6 suspend 0x00000094 0x00000200 28% 0x00000002 000
txCan2Td 10 suspend 0x00000094 0x00000200 46% 0x00000002 000
rxCan2Td 8 ready 0x00000094 0x00000200 38% 0x00000002 000
txCan1Td 10 ready 0x00000094 0x00000200 28% 0x00000002 -02
rxCan1Td 8 suspend 0x00000094 0x00000200 28% 0x00000002 000
thmbTx 13 suspend 0x0000018c 0x00000c00 12% 0x00000002 000
thmbRx 12 ready 0x0000018c 0x00000c00 14% 0x00000002 -02
addTimeT 20 suspend 0x0000007c 0x00000200 28% 0x00000001 000
adcTd 5 suspend 0x00000114 0x00000400 29% 0x00000003 000
toaoTd 5 suspend 0x00000104 0x00000400 58% 0x00000005 000
didoTd 4 suspend 0x0000007c 0x00000200 24% 0x00000001 000
eepTd 5 suspend 0x0000007c 0x00000400 35% 0x00000002 000
wdgTd 3 suspend 0x0000007c 0x00000200 24% 0x00000001 000
tshell 20 suspend 0x00000084 0x00000800 07% 0x0000000a 000
tidle 31 ready 0x00000048 0x00000400 11% 0x00000014 000
usage fault:
SCB_CFSR_UFSR:0x02 INVSTATE
于是我根据lr: 0x0801d9ad定位到发生Hard_Fault前的程序代码段。具体内容如下:
函数内的的内容如下:
我确信的是传入的参数没有导致内存溢出,因为我加过对传入参数的检测,发生死机时,都没有触发。每次死机时都发生在同一个位置。找不出原因,于是我又把发生问题的语句直接改成函数名的形式(原来是函数指针指向这个被调用的函数),结果下次死机时不再停在原来的位置,而是顺着往下移了下,停在了下面的函数中。如下:
于是我把所有的都替换掉,结果程序又会死在其它线程中,也是函数指针调用的地方,于是我又改,结果程序还是会死。于是怀疑不是这个问题导致的。因为程序在跑的时候,有两个串口一直在走485通讯(我的设备是从设备)。我发现每次死机时,查看串口寄存器状态时,ORE溢出位都为1,如下:
于是我在驱动程序中,增加了对ORE溢出的处理,如下:
改了有效果,程序不固定每2小时左右死机了,但过了7个多小时后,程序还是死机了,死机时根据打印的信息,程序停在了这里,如下:
下面不知道,该怎么定位问题了,因为我看这边的程序也没有问题。各位大佬帮忙看看,感谢
原作者:LordYuan
0