关于flash擦除引起的bug问题小结

来源:互联网 发布:c语言调试工具 编辑:程序博客网 时间:2024/05/17 21:43
u16 irlib_get_free_block(const u8 * libno){    u8 i;    vu16 low, up;    u16 _libno = le16_to_cpu(*(u16*)libno);    u16 test = 0;    if (_libno == 0)    {        irlib.libno0_use_sec = 1-irlib.libno0_use_sec;    }    get_limitidx_by_libno(libno, &low, &up);    spi_flash_erase(IrLibInfoAddr(low), IrLibInfoAddr(up - low));    spi_flash_erase(IrLibDataAddr(low), IrLibDataAddr(up - low));    if (_libno == 0)    {        irlib.libno0_use_sec = 1-irlib.libno0_use_sec;    }     else     {        irlib.libno[i] = _libno;        irlib.lib_cycle[i]++;        eeprom_write(OF_IRLIB_PARAM+offsetof(struct IrLib_EEProm, libno)+i*sizeof(irlib.libno[i]),                      &irlib.libno[i], sizeof(irlib.libno[i]));        eeprom_write(OF_IRLIB_PARAM+offsetof(struct IrLib_EEProm, lib_cycle)+i*sizeof(irlib.lib_cycle[i]),                      &irlib.lib_cycle[i], sizeof(irlib.lib_cycle[i]));    }    return low;}
spi_flash_erase(IrLibDataAddr(low), IrLibDataAddr(up - low));
typedef volatile unsigned short vu16;
此函数经过传递会在传递函数里,出现参数的传递错误。原因是up和low参数被优化了。
解决的办法是定义为vu16
void spi_flash_erase(u32 addr, u32 len){    u32 eraselen;    len += addr & (u32) (SPI_FLASH_SectorSize - 1);#if 0    len += SPI_FLASH_SectorSize - (len & (u32) (SPI_FLASH_SectorSize - 1));    addr &= (u32) (~(SPI_FLASH_SectorSize - 1));    if (addr == FLASH_START_ADDR && len >= FLASH_SIZE)    {        spi_flash_chip_erase();        return;    }#endif    while (len > 0)    {        eraselen = len;        if(eraselen > SPI_FLASH_SectorSize)             eraselen = SPI_FLASH_SectorSize;        spi_flash_sector_erase(addr);        addr += SPI_FLASH_SectorSize;        len -= eraselen;    }}
void spi_flash_erase(u32 addr, s32 len){    len += addr & (u32) (SPI_FLASH_SectorSize - 1);#if 0    len += SPI_FLASH_SectorSize - (len & (u32) (SPI_FLASH_SectorSize - 1));    addr &= (u32) (~(SPI_FLASH_SectorSize - 1));    if (addr == FLASH_START_ADDR && len >= FLASH_SIZE)    {        spi_flash_chip_erase();        return;    }#endif    while (len >= 0)    {        spi_flash_sector_erase(addr);        addr += SPI_FLASH_SectorSize;        len -= SPI_FLASH_SectorSize;    }}
上面两个函数都完美解决了,传进来的长度不是4K整数的问题。
0 0