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:
parent
4ea74d4600
commit
b8a0551678
@ -123,35 +123,37 @@ static FAT_BootBlock const BootBlock = {
|
|||||||
static uint32_t current_flash_size(void)
|
static uint32_t current_flash_size(void)
|
||||||
{
|
{
|
||||||
static uint32_t flash_sz = 0;
|
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
|
// only need to compute once
|
||||||
if ( flash_sz == 0 )
|
if ( result == 0 )
|
||||||
{
|
{
|
||||||
// return 1 block of 256 bytes
|
// return 1 block of 256 bytes
|
||||||
if ( !bootloader_app_is_valid(DFU_BANK_0_REGION_START) )
|
if ( !bootloader_app_is_valid(DFU_BANK_0_REGION_START) )
|
||||||
{
|
{
|
||||||
flash_sz = 256;
|
result = 256;
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
bootloader_settings_t const * boot_setting;
|
bootloader_settings_t const * boot_setting;
|
||||||
bootloader_util_settings_get(&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
|
// Copy size must be multiple of 256 bytes
|
||||||
// else we will got an issue copying current.uf2
|
// 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
|
// if bank0 size is not valid, happens when flashed with jlink
|
||||||
// use maximum application size
|
// 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;
|
return flash_sz;
|
||||||
|
Loading…
Reference in New Issue
Block a user