From 810cb8de4ad91f36c5592b8eb1d9bd4e3fc5f760 Mon Sep 17 00:00:00 2001 From: Kevin Bracey Date: Wed, 3 Jul 2019 11:47:32 +0300 Subject: [PATCH 1/3] Enable split heap in K64F/K66F devices -Enable MBED_SPLIT_HEAP for K64F and K66F -Allow GCC_ARM toolchain to utilize remaining 64K memory area -Make ARM toolchain to start memory filling from 64K region to leave more space to bigger 192K region. --- .../device/TOOLCHAIN_ARM_STD/MK66FN2M0xxx18.sct | 6 +++--- .../device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld | 10 ++++++++++ .../device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct | 6 +++--- .../device/TOOLCHAIN_GCC_ARM/MK64FN1M0xxx12.ld | 11 ++++++++++- targets/targets.json | 4 ++-- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_ARM_STD/MK66FN2M0xxx18.sct b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_ARM_STD/MK66FN2M0xxx18.sct index 6b60940001..431933c8ef 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_ARM_STD/MK66FN2M0xxx18.sct +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_ARM_STD/MK66FN2M0xxx18.sct @@ -114,12 +114,12 @@ LR_IROM1 m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; lo RW_m_crash_data m_crash_report_ram_start EMPTY m_crash_report_ram_size { ; RW data } RW_m_data m_data_start m_data_size { ; RW data - .ANY (+RW +ZI) + .ANY2 (+RW +ZI) } RW_m_data_2 m_data_2_start m_data_2_size { ; RW data - .ANY (+RW +ZI) + .ANY1 (+RW +ZI) } - RW_IRAM1 ImageLimit(RW_m_data_2) { + RW_IRAM1 ImageLimit(RW_m_data_2) EMPTY 0 { } ARM_LIB_HEAP AlignExpr(+0, 16) EMPTY (m_data_2_start + m_data_2_size - Stack_Size - AlignExpr(ImageLimit(RW_IRAM1), 16)) { ; Heap region growing up } diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld index be721cab0f..1fbd1d7731 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld @@ -210,6 +210,14 @@ SECTIONS __CRASH_DATA_RAM_END__ = .; /* Define a global symbol at data end */ } > m_data + .heap_0 : + { + . = ALIGN(8); + __mbed_sbrk_start_0 = .; + . += (ORIGIN(m_data) + LENGTH(m_data) - .); + __mbed_krbs_start_0 = .; + } > m_data + __VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts); __RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0; @@ -249,8 +257,10 @@ SECTIONS . = ALIGN(8); __end__ = .; PROVIDE(end = .); + __mbed_sbrk_start = .; __HeapBase = .; . = ORIGIN(m_data_2) + LENGTH(m_data_2) - STACK_SIZE; + __mbed_krbs_start = .; __HeapLimit = .; __heap_limit = .; /* Add for _sbrk */ } > m_data_2 diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct index 9d890e9086..9becd9b428 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_ARM_STD/MK64FN1M0xxx12.sct @@ -118,12 +118,12 @@ LR_IROM1 m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load RW_m_crash_data m_crash_report_ram_start EMPTY m_crash_report_ram_size { ; RW data } RW_m_data m_data_start m_data_size { ; RW data - .ANY (+RW +ZI) + .ANY2 (+RW +ZI) } RW_m_data_2 m_data_2_start m_data_2_size { ; RW data - .ANY (+RW +ZI) + .ANY1 (+RW +ZI) } - RW_IRAM1 ImageLimit(RW_m_data_2) { + RW_IRAM1 ImageLimit(RW_m_data_2) EMPTY 0 { } ARM_LIB_HEAP AlignExpr(+0, 16) EMPTY (m_data_2_start + m_data_2_size - Stack_Size - AlignExpr(ImageLimit(RW_IRAM1), 16)) { ; Heap region growing up } diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_GCC_ARM/MK64FN1M0xxx12.ld b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_GCC_ARM/MK64FN1M0xxx12.ld index cbfd3cc1bc..4871eed9f3 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_GCC_ARM/MK64FN1M0xxx12.ld +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/device/TOOLCHAIN_GCC_ARM/MK64FN1M0xxx12.ld @@ -196,7 +196,7 @@ SECTIONS . = ALIGN(8); __interrupts_ram_end__ = .; /* Define a global symbol at data end */ } > m_data - + .crash_data_ram : { . = ALIGN(8); @@ -209,6 +209,13 @@ SECTIONS __CRASH_DATA_RAM_END__ = .; /* Define a global symbol at data end */ } > m_data + .heap_0 : + { + . = ALIGN(8); + __mbed_sbrk_start_0 = .; + . += (ORIGIN(m_data) + LENGTH(m_data) - .); + __mbed_krbs_start_0 = .; + } > m_data __VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts); __RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0; @@ -270,8 +277,10 @@ SECTIONS . = ALIGN(8); __end__ = .; PROVIDE(end = .); + __mbed_sbrk_start = .; __HeapBase = .; . = ORIGIN(m_data_2) + LENGTH(m_data_2) - STACK_SIZE; + __mbed_krbs_start = .; __HeapLimit = .; __heap_limit = .; /* Add for _sbrk */ } > m_data_2 diff --git a/targets/targets.json b/targets/targets.json index b6d53a24d7..4d688ec077 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -1489,7 +1489,7 @@ "PSA" ], "is_disk_virtual": true, - "macros": ["CPU_MK64FN1M0VMD12", "FSL_RTOS_MBED"], + "macros": ["CPU_MK64FN1M0VMD12", "FSL_RTOS_MBED", "MBED_SPLIT_HEAP"], "inherits": ["Target"], "detect_code": ["0240"], "device_has": [ @@ -1777,7 +1777,7 @@ "PSA" ], "is_disk_virtual": true, - "macros": ["CPU_MK66FN2M0VMD18", "FSL_RTOS_MBED"], + "macros": ["CPU_MK66FN2M0VMD18", "FSL_RTOS_MBED", "MBED_SPLIT_HEAP"], "inherits": ["Target"], "detect_code": ["0311"], "device_has": [ From 5ab714e604a8e85e1331d99d60ed7d918f9d004d Mon Sep 17 00:00:00 2001 From: Kevin Bracey Date: Wed, 3 Jul 2019 15:36:49 +0300 Subject: [PATCH 2/3] ARM linker: add --any_contingency option When packing data into multiple regions using the `.ANY` directive, the linker can accidentally overfill an area. This doesn't normally happen because it defaults to `--any_placement=worst_fit`, which puts data in the region with most space. When we prioritise regions with `.ANY1`/`.ANY2`, it may totally fill an area, then fail to leave enough space for linker-generated veneers. We've just seen this error with the new K64F linker map. Adding `--any-contingency` makes it lower priority when a region is 98% full, avoiding this error. The option should not have any effect on targets with scatter files without prioritised `.ANY` directives. --- tools/profiles/debug.json | 5 +++-- tools/profiles/develop.json | 5 +++-- tools/profiles/release.json | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/profiles/debug.json b/tools/profiles/debug.json index 4f8882b8ea..ada70e30ae 100644 --- a/tools/profiles/debug.json +++ b/tools/profiles/debug.json @@ -26,7 +26,8 @@ "asm": [], "c": ["-D__ASSERT_MSG", "-std=gnu11"], "cxx": ["-fno-rtti", "-std=gnu++14"], - "ld": ["--verbose", "--remove", "--show_full_path", "--legacyalign", "--keep=os_cb_sections"] + "ld": ["--verbose", "--remove", "--show_full_path", "--legacyalign", + "--any_contingency", "--keep=os_cb_sections"] }, "ARM": { "common": ["-c", "--gnu", "-Otime", "--split_sections", @@ -36,7 +37,7 @@ "asm": [], "c": ["--md", "--no_depend_system_headers", "--c99", "-D__ASSERT_MSG"], "cxx": ["--cpp11", "--no_rtti", "--no_vla"], - "ld": ["--show_full_path", "--keep=os_cb_sections"] + "ld": ["--show_full_path", "--any_contingency", "--keep=os_cb_sections"] }, "uARM": { "common": ["-c", "--gnu", "-Otime", "--split_sections", diff --git a/tools/profiles/develop.json b/tools/profiles/develop.json index c0b9f3802b..3360c696fd 100644 --- a/tools/profiles/develop.json +++ b/tools/profiles/develop.json @@ -24,7 +24,8 @@ "asm": [], "c": ["-D__ASSERT_MSG", "-std=gnu11"], "cxx": ["-fno-rtti", "-std=gnu++14"], - "ld": ["--show_full_path", "--legacyalign", "--keep=os_cb_sections"] + "ld": ["--show_full_path", "--legacyalign", "--any_contingency", + "--keep=os_cb_sections"] }, "ARM": { "common": ["-c", "--gnu", "-Otime", "--split_sections", @@ -33,7 +34,7 @@ "asm": [], "c": ["--md", "--no_depend_system_headers", "--c99", "-D__ASSERT_MSG"], "cxx": ["--cpp11", "--no_rtti", "--no_vla"], - "ld": ["--show_full_path", "--keep=os_cb_sections"] + "ld": ["--show_full_path", "--any_contingency", "--keep=os_cb_sections"] }, "uARM": { "common": ["-c", "--gnu", "-Otime", "--split_sections", diff --git a/tools/profiles/release.json b/tools/profiles/release.json index 99bd09fdb3..4007eaf581 100644 --- a/tools/profiles/release.json +++ b/tools/profiles/release.json @@ -24,7 +24,8 @@ "asm": [], "c": ["-D__ASSERT_MSG", "-std=gnu11"], "cxx": ["-fno-rtti", "-std=gnu++14"], - "ld": ["--show_full_path", "--legacyalign", "--keep=os_cb_sections"] + "ld": ["--show_full_path", "--legacyalign", "--any_contingency", + "--keep=os_cb_sections"] }, "ARM": { "common": ["-c", "--gnu", "-Ospace", "--split_sections", @@ -33,7 +34,7 @@ "asm": [], "c": ["--md", "--no_depend_system_headers", "--c99", "-D__ASSERT_MSG"], "cxx": ["--cpp11", "--no_rtti", "--no_vla"], - "ld": ["--show_full_path", "--keep=os_cb_sections"] + "ld": ["--show_full_path", "--any_contingency", "--keep=os_cb_sections"] }, "uARM": { "common": ["-c", "--gnu", "-Ospace", "--split_sections", From d7190c8af4ec68576f71c577cd5708e342f1d582 Mon Sep 17 00:00:00 2001 From: Arto Kinnunen Date: Fri, 5 Jul 2019 14:59:35 +0300 Subject: [PATCH 3/3] Adjust K66F GCC_ARM linker file Move heap_0 after .data as it is also placed to m_data. --- .../device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld index 1fbd1d7731..f1af08f19e 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/device/TOOLCHAIN_GCC_ARM/MK66FN2M0xxx18.ld @@ -210,14 +210,6 @@ SECTIONS __CRASH_DATA_RAM_END__ = .; /* Define a global symbol at data end */ } > m_data - .heap_0 : - { - . = ALIGN(8); - __mbed_sbrk_start_0 = .; - . += (ORIGIN(m_data) + LENGTH(m_data) - .); - __mbed_krbs_start_0 = .; - } > m_data - __VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts); __RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0; @@ -233,6 +225,14 @@ SECTIONS __data_end__ = .; /* define a global symbol at data end */ } > m_data + .heap_0 : + { + . = ALIGN(8); + __mbed_sbrk_start_0 = .; + . += (ORIGIN(m_data) + LENGTH(m_data) - .); + __mbed_krbs_start_0 = .; + } > m_data + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); text_end = ORIGIN(m_text) + LENGTH(m_text); ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")