Use local variable to store partially-calculated size.
This avoid re-entrancy problems, such as if this is ever interrupted mid-execution, and called a second time before the initial execution completes.
This commit is contained in:
		@@ -123,35 +123,37 @@ static FAT_BootBlock const BootBlock = {
 | 
			
		||||
static uint32_t current_flash_size(void)
 | 
			
		||||
{
 | 
			
		||||
  static uint32_t flash_sz = 0;
 | 
			
		||||
  uint32_t result = flash_sz; // presumes atomic 32-bit read/write and static result
 | 
			
		||||
 | 
			
		||||
  // only need to compute once
 | 
			
		||||
  if ( flash_sz == 0 )
 | 
			
		||||
  if ( result == 0 )
 | 
			
		||||
  {
 | 
			
		||||
    // return 1 block of 256 bytes
 | 
			
		||||
    if ( !bootloader_app_is_valid(DFU_BANK_0_REGION_START) )
 | 
			
		||||
    {
 | 
			
		||||
      flash_sz = 256;
 | 
			
		||||
      result = 256;
 | 
			
		||||
    }else
 | 
			
		||||
    {
 | 
			
		||||
      bootloader_settings_t const * boot_setting;
 | 
			
		||||
      bootloader_util_settings_get(&boot_setting);
 | 
			
		||||
 | 
			
		||||
      flash_sz = boot_setting->bank_0_size;
 | 
			
		||||
      result = boot_setting->bank_0_size;
 | 
			
		||||
 | 
			
		||||
      // Copy size must be multiple of 256 bytes
 | 
			
		||||
      // else we will got an issue copying current.uf2
 | 
			
		||||
      if (flash_sz & 0xff)
 | 
			
		||||
      if (result & 0xff)
 | 
			
		||||
      {
 | 
			
		||||
        flash_sz = (flash_sz & ~0xff) + 256;
 | 
			
		||||
        result = (result & ~0xff) + 256;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // if bank0 size is not valid, happens when flashed with jlink
 | 
			
		||||
      // use maximum application size
 | 
			
		||||
      if ( (flash_sz == 0) || (flash_sz == 0xFFFFFFFFUL) )
 | 
			
		||||
      if ( (result == 0) || (result == 0xFFFFFFFFUL) )
 | 
			
		||||
      {
 | 
			
		||||
        flash_sz = FLASH_SIZE;
 | 
			
		||||
        result = FLASH_SIZE;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    flash_sz = result; // presumes atomic 32-bit read/write and static result
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return flash_sz;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user