『案例』CRC校验导致系统崩溃
psr: 0x81000000pc: 0x080036d0
lr: 0x0800e8b3
r12: 0x00000000
r03: 0x3fffffff
r02: 0x20003ac4
r01: 0x0000714f
r00: 0x00008668
hard fault on thread: RS485
系统在运行过程中,出现hard fault,第09行表明崩溃出现在485线程
通过第02行pc指针追踪发现,奔溃出现在CRC校验附近,检查
rt_err_t check_crc(void * buffer, rt_size_t size)
{
u32 _crc = 0;
u32 crc32 = (*(u32 *)((u8*)buffer + size - 4));
CRC_ResetDR();
_crc = CRC_CalcBlockCRC((u32 *)buffer, (size - 4) / 4);
if( crc32 == _crc )
{
return RT_TRUE;
}
return RT_FALSE;
}
进一步调试发现size出现小于4的情况,第07行(size - 4) / 4 = -1是导致系统崩溃的原因,源头可能为485通讯收到干扰,接收到一帧错误的信号
修改加入下列语句
if (size < 4)
{
return RT_FALSE;
}
系统不再出现崩溃现象
点一个大大的赞
页:
[1]