在info的逻辑函数中:没有就不行!!
#pragma pack(1) typedef struct { uint16_t size; uint8_t uid[12]; }SystemInfo_FlashType; typedef struct { char projectkey[32+1]; char devid[16+1]; uint8_t rsakey[256]; size_t rsakeylen; //unsigned int char rsaCer[300]; }Service_ParameterType; typedef struct { SystemInfo_FlashType flash; Service_ParameterType service; uint16_t crc; }SystemInfoType; #pragma pack()WHY?
我看到了 最后的U16
必须pack!!
git提交:
本次重新整理info逻辑-保存的这个逻辑-惊天bug-需要pack否则失败-WHY-它不是crc16的了-看文章惊天
+++++++++++++++补充另外一个办法TOUCH++++++++
也可以不PASK就那样放置 但是需要保证CRC算法的一致性
void sysCfg_save( void ) { cfg.crc16 = 0; memset(fb , 0xFF , sizeof(fb)); memcpy(fb , &cfg , sizeof(SystemConfigType)); cfg.crc16 = crc16_ccitt(fb , sizeof(fb)); sys_cfg_write(&cfg);//----写到CHIP }
看!这就是我们的保存函数!它自己设计了容器,放进去的!!
BOOT工程去读的时候:
uint8_t read_sys_cfg( void ) { uint16_t crc , calcCrc; uint8_t cnt = 20; do { sys_cfg_read(&cfg);//读CHIP crc = cfg.crc16;//拿出来 后面需要比较 这就是原来算的 cfg.crc16 = 0;//看到没有 这就是WRITE时候的动作 再来一次 memset(fb , 0xFF , sizeof(fb));//放到容器 memcpy(fb , &cfg , sizeof(SystemConfigType)); calcCrc = crc16_ccitt(fb , sizeof(fb));
log(ERR,"读取系统配置文件,计算的CRC16 = %x, 读取到的cfg.crc16 = %x \n" , calcCrc , crc); }while((calcCrc != crc)&& (--cnt) );
if( cnt ==0 ) { log(WARN,"配置文件被修改 ,需要重新加载配置未见 return FALSE\n");
return FALSE; }
return TRUE; }