|
最近在做项目时用到硬汉的bsp_spi_flash.c的代码,但是发现了一个bug,主要在
static uint8_t sf_NeedErase(uint8_t * _ucpOldBuf, uint8_t *_ucpNewBuf, uint16_t _usLen)函数中,该算法如下:
/*
算法第1步:old 求反, new 不变
old new
1101 0101
~ 1111
= 0010 0101
算法第2步: old 求反的结果与 new 位与
0010 old
& 0101 new
=0000
算法第3步: 结果为0,则表示无需擦除. 否则表示需要擦除
*/
算法是基于在一没有写的区域中(全是0xFF),太过理想化了。
假如有一数组a[0x77,0x88,0x99,0xaa,0x00,0x00,0xbb,0xcc]写到flash中的4096地址,
而flash的4096地址读出相同长度的数据是b[0x77,0x88,0x99,0xaa,0x22,0x55,0xbb,0xcc],
执行sf_NeedErase(b,a,8)恒为0,即无需擦除,导致写不成功,原因是数组a中的a[4]和a[5]为0x00。
避免这个bug只能写之前就执行擦除。
|
|