结构体技巧-对齐--惊天bug-没有pack就是失败!--增加一种别的办法

    xiaoxiao2023-10-26  156

    在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; }

    最新回复(0)