zhangkai 发表于 2015-9-9 11:41:23

『案例』CRC校验导致系统崩溃

psr: 0x81000000
pc: 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;
}

系统不再出现崩溃现象

wangxin 发表于 2015-9-9 12:00:24

点一个大大的赞
页: [1]
查看完整版本: 『案例』CRC校验导致系统崩溃