问题描述
在使用 easy_falsh 的是时候出现问题,这个问题是发现在 触发 gc 的时候突然断电就出现了错误,一旦出现这个问题无论怎样都无法恢复,除非重新擦除数据区
需要擦除才能恢复,这个问题是不可接受的
问题分析
估计是触发在STM32上面触发GC机制的问题在备份在转移数据的时候突然断电会导致状态异常,这个异常的状态是写入在FLASH中的,导致即使上电数据也不能恢复,于是查找数据出错的地方:
int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size)
{
rt_err_t result = RT_EOK;
rt_uint32_t end_addr = addr + size;
if (addr % 4 != 0)
{
LOG_E("write addr must be 4-byte alignment");
return -RT_EINVAL;
}
if ((end_addr) > STM32_FLASH_END_ADDRESS)
{
LOG_E("write outrange flash size! addr is (0x%p)", (void *)(addr + size));
return -RT_EINVAL;
}
HAL_FLASH_Unlock();
while (addr < end_addr)
{
+ /* 写数据之前会进行错误检查,如果之前操作有错误积累,则之后无法操作成功,需要清除一下 */
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR |
+ FLASH_FLAG_BSY | FLASH_FLAG_EOP);
if