关于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整数的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值