通业开发人论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 442|回复: 1

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

[复制链接]
发表于 2015-9-9 11:41:23 | 显示全部楼层 |阅读模式
  1. psr: 0x81000000
  2. pc: 0x080036d0
  3. lr: 0x0800e8b3
  4. r12: 0x00000000
  5. r03: 0x3fffffff
  6. r02: 0x20003ac4
  7. r01: 0x0000714f
  8. r00: 0x00008668
  9. hard fault on thread: RS485
复制代码

系统在运行过程中,出现hard fault,第09行表明崩溃出现在485线程
通过第02行pc指针追踪发现,奔溃出现在CRC校验附近,检查
  1. rt_err_t check_crc(void * buffer, rt_size_t size)
  2. {
  3.     u32 _crc = 0;
  4.     u32 crc32 = (*(u32 *)((u8*)buffer + size - 4));

  5.     CRC_ResetDR();
  6.     _crc = CRC_CalcBlockCRC((u32 *)buffer, (size - 4) / 4);
  7.     if( crc32 == _crc )
  8.     {
  9.         return RT_TRUE;
  10.     }
  11.     return RT_FALSE;
  12. }
复制代码

进一步调试发现size出现小于4的情况,第07行(size - 4) / 4 = -1是导致系统崩溃的原因,源头可能为485通讯收到干扰,接收到一帧错误的信号
修改加入下列语句
  1. if (size < 4)
  2. {
  3.     return RT_FALSE;
  4. }
复制代码

系统不再出现崩溃现象
回复

使用道具 举报

发表于 2015-9-9 12:00:24 | 显示全部楼层
点一个大大的赞
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|TongYe R&D Inc.

GMT+8, 2024-5-15 04:13 , Processed in 0.131007 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2000-2022, Tongye. 粤ICP备17061194号

快速回复 返回顶部 返回列表