校验头的作用:是为BL1(裸机中的源代码如led.bin)添加校验头。
- 除了usb启动和uart启动外,其余的启动方式BL0都会对可执行文件进行校验。
- 以0x20000000为起始地址的前16个字节(结束地址0x20000010)用于存放校验头。
- 实际不管是usb还是sd卡,被拷贝到SRAM中都有校验头,只是usb方式启动时,bl0不管,字节跳到20000010开始执行。
- 校验头各地址的作用:
第一个字节(0x20000000):校验头的大小,固定为16byte
第二个字节(0x20000004):保留,写0
第三个字节(0x20000008):校验数据(校验和)
第四个字节(0x2000000B):保留,写0
- main函数的传参:
main(int argc,char *argv[ ])
argc-是传入参数的数量,包含执行命令如 ./led.bin led.bin 210.bin,数量为3;
argv-是一个字符串数组,存放命令以空格分开;
argv[0]= ./led.bin;
argv[1]= led.bin ;
argv[2]= 210.bin;
校验过程:
- 检查输入argc命令数量 if (argc != 4)
- 将文件大小由字符串转数字,根据数字大小申请堆内存。malloc(atoi(argv[3]))
- 打开源bin文件,获取文件大小fseek(fp,0L,SEEK_END),ftell(fp);
- 对比文件大小是否小于等于申请的堆内存空间。
- 读取文件后关闭文件。
- 计算16字节后的数据低8位的和。
- 将计算结果写入起始的第8字节
- 创建校验后的bin文件,将堆内存中的源文件和校验头写入。
- 释放堆内存,关闭文件