最近在做CRC校验的时候,发现一个奇怪的问题。
根据标准,写了一个CRC校验函数,
unsigned char crc8(unsigned char *ptr, unsigned char len,unsigned char poly)
{
unsigned char i;
unsigned char crc;
crc=(unsigned char)crcchushizhi;
while(len-- !=0)
{
for(i = 0x80; i != 0; i /=2)
{
if((crc&0x80)!=0)
{
crc*=2;
crc^=poly;
} /* 余式CRC 乘以2 再求CRC */
else
{
crc*=2;
}
if((*ptr&i)!=0)
{
crc^=poly; /* 再加上本位的CRC */
}
}/*end of for*/
ptr++;
}/*end of while(len -- !=0)*/
return (crc);
}
在调用时候仿真,
test_crc = crc8(HF_Buf,7,0x7);
发现计算的结果一直不正确,在函数里面crc正确的,但是经过调用后返回test_crc就错了。以前也遇到过类似的问题,没有深究。测试即使HF_Buf里全是0,test_crc的值也不是0,总返回0x37,非常奇怪。
分析一下,crc虽然是一个局部变量,但是做为返回值会进栈保存,最终赋值给全局变量test_crc;即使把crc申请成全局变量,问题依然存在。
后来重新编译发现有一个警告,crc8这个函数声明implicitly。发现crc8函数声明没有被调用的.c文件包含进来,把相应头文件包含进来后,问题就解决了。
小结
根据线索发现问题,但是如果发现现有的线索都找不到相关问题的原因,那边就需要扩大搜索范围,或者叫做换一种思路,去解决问题。