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

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整数的问题。

你可能感兴趣的:(代码分析)