字节对齐算法

ps:遇见这种算法纯属一个巧合,刚入职的我,在忙着调用各种SDK中的API,无暇顾及代码的具体实现,有些代码还被屏蔽了,在写flash的过程中,参考了前辈们的一些代码,在此记录。

if (!(erase_addr % FLASH_BLOCK_SIZE))
 {
    ret = hal_flash_erase(erase_addr, mem_info_ptr->block_type);
    LOGI("[FOTA] erase flash, ret = %d, address = 0x%x\r\n", ret, (unsigned int)erase_addr);
 }
erase_addr = (erase_addr + FLASH_BLOCK_SIZE) & (~(FLASH_BLOCK_SIZE - 1));

本段代码是需要在内存中寻找一个FLASH_BLOCK_SIZE对齐的地址,然后擦除,

参考来源于网络

原理:

  1.      一般的字节对齐的大小都为2的整数倍,所以能够被整除的地址的后几位一定是0,(e.g.    8字节对齐,能够被整除的数的二进制最后3位一定为0)

  2. + FLASH_BLOCK_SIZE的主要作用是增加步长。

  3. (~(FLASH_BLOCK_SIZE - 1))的主要作用是清除二进制最后几位,使结果可以被整除

    

你可能感兴趣的:(编程语言)