参考系统给的样例,封装了写入函数:
int usr_write_config_to_flash() { int ret; U32 offset = 0; // do { // 写入前要先擦除块 info_block_erase(); // 写入配置数据 memset(flash_write_buf, 0, sizeof(flash_write_buf)); memcpy(flash_write_buf, &sys_config, sizeof(sys_config)); offset = 0; ret = am_hal_flash_program_info(AM_HAL_FLASH_PROGRAM_KEY, 0, // we are only supporting INFO on instance 0. flash_write_buf, offset / 4, // offset (sizeof(sys_config) + 3) / 4); // num words //} while (ret); if (ret) { log(ERR, "am_hal_flash_program_info at offset 0x%08x i32ReturnCode = 0x%x.\n", offset, ret); return ERROR; } log(RUN, "flash write success\r\n"); return SUCCESS; }
系统的样例是正常的,因为没有别的业务逻辑,我的代码在开机执行也是正常的,但是在业务中调用 am_hal_flash_program_info 函数时就会随机失败,开始一直怀疑是地址区段的问题,各种尝试都不行,后来看函数的原型,发现下面的文字说明,才恍然一惊:
看到蓝色标识的部分,才想到是不是被系统的定时器中断影响了,因为系统起来后开启了很多定时器中断,于是在擦除和写入的逻辑区间关闭了中断,于是就没有再发现失败了。
浪费了半天时间,惭愧,特此随记,以示教训:在没有相关文档的情况下,要仔细看函数原型的任何一行说明文字