Skip to content

Commit 85c2fc7

Browse files
authored
Merge pull request #9148 from davidsaada/david_fix_app_end_addr
Fix FLASHIAP_ROM_END macro for GCC_ARM & IAR toolchains
2 parents e245c1e + f3bac34 commit 85c2fc7

File tree

5 files changed

+15
-11
lines changed

5 files changed

+15
-11
lines changed

TESTS/mbed_drivers/flashiap/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ void flashiap_program_test()
5959
// the one before the last sector in the system
6060
uint32_t address = (flash_device.get_flash_start() + flash_device.get_flash_size()) - (sector_size);
6161
TEST_ASSERT_TRUE(address != 0UL);
62-
utest_printf("ROM ends at 0x%lx, test starts at 0x%lx\n", FLASHIAP_ROM_END, address);
63-
TEST_SKIP_UNLESS_MESSAGE(address >= FLASHIAP_ROM_END, "Test skipped. Test region overlaps code.");
62+
utest_printf("ROM ends at 0x%lx, test starts at 0x%lx\n", FLASHIAP_APP_ROM_END_ADDR, address);
63+
TEST_SKIP_UNLESS_MESSAGE(address >= FLASHIAP_APP_ROM_END_ADDR, "Test skipped. Test region overlaps code.");
6464

6565
ret = flash_device.erase(address, sector_size);
6666
TEST_ASSERT_EQUAL_INT32(0, ret);
@@ -128,7 +128,7 @@ void flashiap_cross_sector_program_test()
128128
agg_size += sector_size;
129129
address -= sector_size;
130130
}
131-
TEST_SKIP_UNLESS_MESSAGE(address >= FLASHIAP_ROM_END, "Test skipped. Test region overlaps code.");
131+
TEST_SKIP_UNLESS_MESSAGE(address >= FLASHIAP_APP_ROM_END_ADDR, "Test skipped. Test region overlaps code.");
132132
ret = flash_device.erase(address, agg_size);
133133
TEST_ASSERT_EQUAL_INT32(0, ret);
134134

@@ -184,7 +184,7 @@ void flashiap_program_error_test()
184184
TEST_ASSERT_TRUE(address != 0UL);
185185

186186
// unaligned address
187-
TEST_SKIP_UNLESS_MESSAGE(address >= FLASHIAP_ROM_END, "Test skipped. Test region overlaps code.");
187+
TEST_SKIP_UNLESS_MESSAGE(address >= FLASHIAP_APP_ROM_END_ADDR, "Test skipped. Test region overlaps code.");
188188
ret = flash_device.erase(address + 1, sector_size);
189189
TEST_ASSERT_EQUAL_INT32(-1, ret);
190190
if (flash_device.get_page_size() > 1) {

drivers/FlashIAP.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,18 @@
3333
// Export ROM end address
3434
#if defined(TOOLCHAIN_GCC_ARM)
3535
extern uint32_t __etext;
36-
#define FLASHIAP_ROM_END ((uint32_t) &__etext)
36+
extern uint32_t __data_start__;
37+
extern uint32_t __data_end__;
38+
#define FLASHIAP_APP_ROM_END_ADDR (((uint32_t) &__etext) + ((uint32_t) &__data_end__) - ((uint32_t) &__data_start__))
3739
#elif defined(TOOLCHAIN_ARM)
3840
extern uint32_t Load$$LR$$LR_IROM1$$Limit[];
39-
#define FLASHIAP_ROM_END ((uint32_t)Load$$LR$$LR_IROM1$$Limit)
41+
#define FLASHIAP_APP_ROM_END_ADDR ((uint32_t)Load$$LR$$LR_IROM1$$Limit)
4042
#elif defined(TOOLCHAIN_IAR)
4143
#pragma section=".rodata"
4244
#pragma section=".text"
43-
#define FLASHIAP_ROM_END (std::max((uint32_t) __section_end(".rodata"), (uint32_t) __section_end(".text")))
45+
#pragma section=".init_array"
46+
#define FLASHIAP_APP_ROM_END_ADDR std::max(std::max((uint32_t) __section_end(".rodata"), (uint32_t) __section_end(".text")), \
47+
(uint32_t) __section_end(".init_array"))
4448
#endif
4549

4650
namespace mbed {

features/storage/kvstore/conf/kv_config.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ BlockDevice *_get_blockdevice_FLASHIAP(bd_addr_t start_address, bd_size_t size)
264264
}
265265

266266
//Get flash parameters before starting
267-
flash_first_writable_sector_address = align_up(FLASHIAP_ROM_END, flash.get_sector_size(FLASHIAP_ROM_END));
267+
flash_first_writable_sector_address = align_up(FLASHIAP_APP_ROM_END_ADDR, flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR));
268268
flash_start_address = flash.get_flash_start();
269269
flash_end_address = flash_start_address + flash.get_flash_size();;
270270

@@ -551,7 +551,7 @@ int _storage_config_TDB_INTERNAL()
551551
if (flash.init() != 0) {
552552
return MBED_ERROR_FAILED_OPERATION;
553553
}
554-
internal_start_address = align_up(FLASHIAP_ROM_END, flash.get_sector_size(FLASHIAP_ROM_END));
554+
internal_start_address = align_up(FLASHIAP_APP_ROM_END_ADDR, flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR));
555555
flash.deinit();
556556
}
557557

features/storage/nvstore/TESTS/nvstore/functionality/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static void nvstore_basic_functionality_test()
8888
size_t area_size;
8989
nvstore.get_area_params(area, area_address, area_size);
9090
printf("Area %d: address 0x%08lx, size %d (0x%x)\n", area, area_address, area_size, area_size);
91-
if (area_address < FLASHIAP_ROM_END) {
91+
if (area_address < FLASHIAP_APP_ROM_END_ADDR) {
9292
nvstore_overlaps_code = true;
9393
}
9494
TEST_SKIP_UNLESS_MESSAGE(!nvstore_overlaps_code, "Test skipped. NVStore region overlaps code.");

features/storage/system_storage/SystemStorage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ MBED_WEAK BlockDevice *BlockDevice::get_default_instance()
116116
}
117117

118118
//Find the start of first sector after text area
119-
bottom_address = align_up(FLASHIAP_ROM_END, flash.get_sector_size(FLASHIAP_ROM_END));
119+
bottom_address = align_up(FLASHIAP_APP_ROM_END_ADDR, flash.get_sector_size(FLASHIAP_APP_ROM_END_ADDR));
120120
start_address = flash.get_flash_start();
121121
flash_size = flash.get_flash_size();
122122

0 commit comments

Comments
 (0)