/*******************************/
/* Verify check sum */
/*******************************/
Uart_Printf("Now, Checksum calculation\n");//这个不用解释了吧
cs=0; //这里是初始化cs
i=(downloadAddress);//把downloadAddress赋给i,从上下文来看,i应该是地址指针
j=(downloadAddress+downloadFileSize-10)&0xfffffffc;//指定截止地址
while(i<j)//判断地址是否超出待校验的地址范围,未超出就继续执行以下代码
{
temp=*((U32 *)i);//取出地址i内的数据(32位)
i+=4;//将地址加4,即指向下一个32位的数据
//以下4句是将该32位的数据按字节累加
cs+=(U16)(temp&0xff);
cs+=(U16)((temp&0xff00)>>8);
cs+=(U16)((temp&0xff0000)>>16);
cs+=(U16)((temp&0xff000000)>>24);
}
//将上面的截止地址赋给i,继续校验剩余的字节.
i=(downloadAddress+downloadFileSize-10)&0xfffffffc;
j=(downloadAddress+downloadFileSize-10);
while(i<j)
{
cs+=*((U8 *)i++);//将剩余字节累加到cs中。
}
checkSum=cs;//将cs的值赋给checkSum
//将待校验字段的倒数第10字节和第9字节组合成一个16位数并赋给dnCS
dnCS=*((unsigned char *)(downloadAddress+downloadFileSize-8-2))+
(*( (unsigned char *)(downloadAddress+downloadFileSize-8-1) )<<8);
//对比checkSum和dnCS,若它们不等,就认为是校验错误
if(checkSum!=dnCS)
{
Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
return;
}
|