定义数据结构体
#pragma pack(1)
typedef union
{
uint8_t data[0];
struct
{
uint32_t crc;
uint8_t a;
uint8_t b[32];
} info;
} DEV_INFO_T;
#pragma pack()
注:#pragma pack(1) 进行1个字节对齐
将数据结构体存储至flash中
定义flash写入地址
#define DEVICE_INFO_ADDR (0x003cc000)
#define DEVICE_INFO_OFFSET (4096)
#define DEVICE_INFO_END (DEVICE_INFO_ADDR + DEVICE_INFO_OFFSET)
读写相关代码
crc校验
uint32_t crc32_compute(const void *data, size_t size, uint32_t poly)
{
uint32_t crc = 0xFFFFFFFF;
const uint8_t *buffer = (const uint8_t *)data;
size_t i;
for (i = 0; i < size; ++i)
{
crc ^= buffer[i];
for (int j = 0; j < 8; ++j)
{
if (crc & 1)
{
crc = (crc >> 1) ^ poly;
}
else
{
crc = crc >> 1;
}
}
}
return crc ^ 0xFFFFFFFF;
}
数据更新代码
void dev_info_flash_update(DEV_INFO_T *dev)
{
dev->info.crc = crc32_compute((uint8_t *)(dev->data + sizeof(uint32_t)), sizeof(DEV_INFO_T) - sizeof(uint32_t), POLYNOMIAL);
luat_flash_erase(DEVICE_INFO_ADDR, ONE_SECTOR_SIZE);
luat_flash_write(dev->data, DEVICE_INFO_ADDR, sizeof(DEV_INFO_T));
}
整体代码
DEV_INFO_T *g_dev_info = (DEV_INFO_T *)malloc(sizeof(DEV_INFO_T));
memset(g_dev_info->data, 0, sizeof(DEV_INFO_T));
luat_flash_read(g_dev_info->data, DEVICE_INFO_ADDR, sizeof(DEV_INFO_T));
uint32_t crc = crc32_compute((uint8_t *)(g_dev_info->data + sizeof(uint32_t)), sizeof(DEV_INFO_T) - sizeof(uint32_t), POLYNOMIAL);
if (crc != g_dev_info->info.crc)
{
/*初始化设备信息*/
***添加初始化相关代码***
usr_log("dev info use default");
dev_info_flash_update(g_dev_info);
}