- /*******************************/
- /* 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;
- }
|