Skip to content

Commit 2564b2c

Browse files
author
Jamie Smith
authored
STM32H7: Don't use DTCM memory for heap (#396)
* STM32H7: Don't use DTCM memory for heap * Update CM4 linker script assertion
1 parent 0fb002c commit 2564b2c

File tree

11 files changed

+78
-66
lines changed

11 files changed

+78
-66
lines changed

cmsis/device/rtos/TOOLCHAIN_GCC_ARM/mbed_boot_gcc_arm.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,20 @@ static osMutexId_t env_mutex_id;
2929
static mbed_rtos_storage_mutex_t env_mutex_obj;
3030
static osMutexAttr_t env_mutex_attr;
3131

32+
// Stack symbols from linker script
3233
extern uint32_t __StackLimit;
3334
extern uint32_t __StackTop;
35+
36+
// Heap symbols from linker script
37+
#if defined(MBED_SPLIT_HEAP)
38+
extern uint32_t __mbed_sbrk_start;
39+
extern uint32_t __mbed_krbs_start;
40+
extern uint32_t __mbed_sbrk_start_0;
41+
extern uint32_t __mbed_krbs_start_0;
42+
#else
3443
extern uint32_t __end__;
3544
extern uint32_t __HeapLimit;
45+
#endif
3646

3747
extern void __libc_init_array(void);
3848

@@ -45,8 +55,15 @@ void software_init_hook(void)
4555
{
4656
mbed_stack_isr_start = (unsigned char *) &__StackLimit;
4757
mbed_stack_isr_size = (uint32_t) &__StackTop - (uint32_t) &__StackLimit;
58+
#if defined(MBED_SPLIT_HEAP)
59+
mbed_heap_start = (unsigned char *) &__mbed_sbrk_start;
60+
mbed_heap_size = (uint32_t) &__mbed_krbs_start - (uint32_t) &__mbed_sbrk_start;
61+
mbed_heap_start_0 = (unsigned char *) &__mbed_sbrk_start_0;
62+
mbed_heap_size_0 = (uint32_t) &__mbed_krbs_start_0 - (uint32_t) &__mbed_sbrk_start_0;
63+
#else
4864
mbed_heap_start = (unsigned char *) &__end__;
4965
mbed_heap_size = (uint32_t) &__HeapLimit - (uint32_t) &__end__;
66+
#endif
5067

5168
mbed_init();
5269
mbed_rtos_start();

cmsis/device/rtos/include/mbed_boot.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ extern "C" {
5858
extern unsigned char *mbed_heap_start;
5959
extern uint32_t mbed_heap_size;
6060

61+
#if defined(MBED_SPLIT_HEAP)
62+
extern unsigned char *mbed_heap_start_0;
63+
extern uint32_t mbed_heap_size_0;
64+
#endif
65+
6166
/* Stack limits */
6267
extern unsigned char *mbed_stack_isr_start;
6368
extern uint32_t mbed_stack_isr_size;

cmsis/device/rtos/source/mbed_boot.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
* - Value INITIAL_SP is ignored
4747
*
4848
* GCC Memory layout :
49-
* - Heap explicitly placed in linker script (*.ld file) and heap start (__end___) and heap end (__HeapLimit) should be defined in linker script
49+
* - Heap explicitly placed in linker script (*.ld file) and heap start (__end___) and heap end (__HeapLimit) should be defined in linker script (or __mbed_sbrk_start/__mbed_sbrk_start_0 and __mbed_krbs_start/__mbed_krbs_start_0 for split heap targets)
5050
* - Interrupt stack placed in linker script **.ld file) and stack start (__StackTop) and stack end (__StackLimit) should be defined in linker script
5151
*
5252
* ARM Memory layout :

platform/source/mbed_retarget.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ extern const char __stderr_name[] = "/stderr";
120120
unsigned char *mbed_heap_start = 0;
121121
uint32_t mbed_heap_size = 0;
122122

123+
#if defined(MBED_SPLIT_HEAP)
124+
unsigned char *mbed_heap_start_0 = 0;
125+
uint32_t mbed_heap_size_0 = 0;
126+
#endif
127+
123128
#if !MBED_CONF_PLATFORM_STDIO_MINIMAL_CONSOLE_ONLY
124129

125130
/* newlib has the filehandle field in the FILE struct as a short, so

platform/source/mbed_sdk_boot.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "mbed_error.h"
1919
#include "mbed_toolchain.h"
20+
#include "mbed_boot.h"
2021
#include <stdlib.h>
2122
#include <stdint.h>
2223
#include "cmsis.h"
@@ -28,10 +29,6 @@
2829
*/
2930
#if !defined(MBED_CONF_RTOS_PRESENT)
3031

31-
/* Heap limits - only used if set */
32-
extern unsigned char *mbed_heap_start;
33-
extern uint32_t mbed_heap_size;
34-
3532
/* Stack limits */
3633
unsigned char *mbed_stack_isr_start = 0;
3734
uint32_t mbed_stack_isr_size = 0;
@@ -154,17 +151,33 @@ const uint32_t os_cb_sections[] __attribute__((section(".rodata"))) = {};
154151

155152
extern uint32_t __StackLimit;
156153
extern uint32_t __StackTop;
154+
155+
#if defined(MBED_SPLIT_HEAP)
156+
extern uint32_t __mbed_sbrk_start;
157+
extern uint32_t __mbed_krbs_start;
158+
extern uint32_t __mbed_sbrk_start_0;
159+
extern uint32_t __mbed_krbs_start_0;
160+
#else
157161
extern uint32_t __end__;
158162
extern uint32_t __HeapLimit;
163+
#endif
159164

160165
extern int __real_main(void);
161166

162167
void software_init_hook(void)
163168
{
164169
mbed_stack_isr_start = (unsigned char *) &__StackLimit;
165170
mbed_stack_isr_size = (uint32_t) &__StackTop - (uint32_t) &__StackLimit;
171+
172+
#if defined(MBED_SPLIT_HEAP)
173+
mbed_heap_start = (unsigned char *) &__mbed_sbrk_start;
174+
mbed_heap_size = (uint32_t) &__mbed_krbs_start - (uint32_t) &__mbed_sbrk_start;
175+
mbed_heap_start_0 = (unsigned char *) &__mbed_sbrk_start_0;
176+
mbed_heap_size_0 = (uint32_t) &__mbed_krbs_start_0 - (uint32_t) &__mbed_sbrk_start_0;
177+
#else
166178
mbed_heap_start = (unsigned char *) &__end__;
167179
mbed_heap_size = (uint32_t) &__HeapLimit - (uint32_t) &__end__;
180+
#endif
168181

169182
mbed_init();
170183
software_init_hook_rtos();

rtos/tests/TESTS/mbed_rtos/heap_and_stack/main.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "greentea-client/test_env.h"
2929
#include "utest/utest.h"
3030
#include "unity/unity.h"
31+
#include "mbed_boot.h"
3132

3233
using utest::v1::Case;
3334

@@ -39,18 +40,9 @@ static const int test_timeout = 30;
3940
// Malloc fill pattern
4041
#define MALLOC_FILL 0x55
4142

42-
extern unsigned char *mbed_heap_start;
43-
extern uint32_t mbed_heap_size;
4443
extern unsigned char *mbed_stack_isr_start;
4544
extern uint32_t mbed_stack_isr_size;
4645

47-
#if defined(TOOLCHAIN_GCC_ARM) && defined(MBED_SPLIT_HEAP)
48-
extern uint32_t __mbed_sbrk_start_0;
49-
extern uint32_t __mbed_krbs_start_0;
50-
unsigned char *mbed_heap_start_0 = (unsigned char *) &__mbed_sbrk_start_0;;
51-
uint32_t mbed_heap_size_0 = (uint32_t) &__mbed_krbs_start_0 - (uint32_t) &__mbed_sbrk_start_0;
52-
#endif
53-
5446
struct linked_list {
5547
linked_list *next;
5648
uint8_t data[MALLOC_TEST_SIZE];

targets/TARGET_STM/TARGET_STM32H7/linker_scripts/STM32H743_STM32H72x_FAMILIES/STM32H743_H72x.ld

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -187,15 +187,14 @@ SECTIONS
187187
_ebss = .;
188188
} > SRAM
189189

190-
.heap (COPY):
190+
/* Check if data + stack will exceed SRAM limit */
191+
ASSERT(_ebss < ORIGIN(SRAM) + LENGTH(SRAM) - MBED_CONF_TARGET_BOOT_STACK_SIZE, "region SRAM does not have enough space for boot stack size")
192+
193+
.heap_0 (NOLOAD):
191194
{
192-
__end__ = .;
193-
PROVIDE(end = .);
194-
PROVIDE(__mbed_sbrk_start = .);
195-
*(.heap*)
195+
PROVIDE(__mbed_sbrk_start_0 = .);
196196
. = ORIGIN(SRAM) + LENGTH(SRAM) - MBED_CONF_TARGET_BOOT_STACK_SIZE;
197-
PROVIDE(__mbed_krbs_start = .);
198-
__HeapLimit = .;
197+
PROVIDE(__mbed_krbs_start_0 = .);
199198
} > SRAM
200199

201200
/* .stack_dummy section doesn't contains any symbols. It is only
@@ -213,9 +212,6 @@ SECTIONS
213212
__StackLimit = __StackTop - MBED_CONF_TARGET_BOOT_STACK_SIZE;
214213
PROVIDE(__stack = __StackTop);
215214

216-
/* Check if data + heap + stack exceeds SRAM limit */
217-
ASSERT(__StackLimit >= __HeapLimit, "region SRAM overflowed with stack")
218-
219215
/* Ethernet DMA descriptors should be at the start of SRAM_D2 because they need an MPU region
220216
and because the CM4 and CM7 have to agree on their location.*/
221217
.eth_descriptors (NOLOAD) : {
@@ -230,11 +226,11 @@ SECTIONS
230226
*(.EthBuffers)
231227
} >SRAM_D2
232228

233-
/* Use the rest of DTCM as additional heap */
234-
.heap_0 (COPY):
229+
/* Use SRAM_D2 as additional heap */
230+
.heap (NOLOAD):
235231
{
236-
PROVIDE(__mbed_sbrk_start_0 = .);
237-
. += (ORIGIN(SRAM_DTC) + LENGTH(SRAM_DTC) - .);
238-
PROVIDE(__mbed_krbs_start_0 = .);
239-
} > SRAM_DTC
232+
PROVIDE(__mbed_sbrk_start = .);
233+
. += (ORIGIN(SRAM_D2) + LENGTH(SRAM_D2) - .);
234+
PROVIDE(__mbed_krbs_start = .);
235+
} > SRAM_D2
240236
}

targets/TARGET_STM/TARGET_STM32H7/linker_scripts/STM32H745_47_FAMILY/CM4/STM32H745_H747_CM4.ld

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,14 +182,15 @@ SECTIONS
182182
_ebss = .;
183183
} > SRAM_D2
184184

185+
/* Check if data + stack will exceed SRAM limit */
186+
ASSERT(_ebss < ORIGIN(SRAM_D2) + LENGTH(SRAM_D2) - MBED_CONF_TARGET_BOOT_STACK_SIZE, "region SRAM does not have enough space for boot stack size")
187+
185188
.heap (COPY):
186189
{
187190
__end__ = .;
188191
PROVIDE(end = .);
189-
PROVIDE(__mbed_sbrk_start = .);
190192
*(.heap*)
191193
. = ORIGIN(SRAM_D2) + LENGTH(SRAM_D2) - MBED_CONF_TARGET_BOOT_STACK_SIZE;
192-
PROVIDE(__mbed_krbs_start = .);
193194
__HeapLimit = .;
194195
} > SRAM_D2
195196
/* .stack_dummy section doesn't contains any symbols. It is only
@@ -207,9 +208,6 @@ SECTIONS
207208
__StackLimit = __StackTop - MBED_CONF_TARGET_BOOT_STACK_SIZE;
208209
PROVIDE(__stack = __StackTop);
209210

210-
/* Check if data + heap + stack exceeds SRAM_D2 limit */
211-
ASSERT(__StackLimit >= __HeapLimit, "region SRAM_D2 overflowed with stack")
212-
213211
/* Put crash data in the otherwise unused D3 SRAM */
214212
.crash_data_ram :
215213
{

targets/TARGET_STM/TARGET_STM32H7/linker_scripts/STM32H745_47_FAMILY/CM7/STM32H745_H747_CM7.ld

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,14 @@ SECTIONS
174174
_ebss = .;
175175
} > SRAM
176176

177+
/* Check if data + stack will exceed SRAM limit */
178+
ASSERT(_ebss < ORIGIN(SRAM) + LENGTH(SRAM) - MBED_CONF_TARGET_BOOT_STACK_SIZE, "region SRAM does not have enough space for boot stack size")
179+
177180
.heap (COPY):
178181
{
179182
__end__ = .;
180183
PROVIDE(end = .);
181-
PROVIDE(__mbed_sbrk_start = .);
182-
*(.heap*)
183184
. = ORIGIN(SRAM) + LENGTH(SRAM) - MBED_CONF_TARGET_BOOT_STACK_SIZE;
184-
PROVIDE(__mbed_krbs_start = .);
185185
__HeapLimit = .;
186186
} > SRAM
187187

@@ -230,12 +230,4 @@ SECTIONS
230230
. = ALIGN(8);
231231
__CRASH_DATA_RAM_END__ = .; /* Define a global symbol at data end */
232232
} > SRAM_D3
233-
234-
/* Use the rest of DTCM as additional heap */
235-
.heap_0 (COPY):
236-
{
237-
PROVIDE(__mbed_sbrk_start_0 = .);
238-
. += (ORIGIN(SRAM_DTC) + LENGTH(SRAM_DTC) - .);
239-
PROVIDE(__mbed_krbs_start_0 = .);
240-
} > SRAM_DTC
241233
}

targets/TARGET_STM/TARGET_STM32H7/linker_scripts/STM32H7Ax_FAMILY/STM32H7Ax.ld

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -174,15 +174,14 @@ SECTIONS
174174
_ebss = .;
175175
} > SRAM
176176

177-
.heap (COPY):
177+
/* Check if data + stack will exceed SRAM limit */
178+
ASSERT(_ebss < ORIGIN(SRAM) + LENGTH(SRAM) - MBED_CONF_TARGET_BOOT_STACK_SIZE, "region SRAM does not have enough space for boot stack size")
179+
180+
.heap_0 (NOLOAD):
178181
{
179-
__end__ = .;
180-
PROVIDE(end = .);
181-
PROVIDE(__mbed_sbrk_start = .);
182-
*(.heap*)
182+
PROVIDE(__mbed_sbrk_start_0 = .);
183183
. = ORIGIN(SRAM) + LENGTH(SRAM) - MBED_CONF_TARGET_BOOT_STACK_SIZE;
184-
PROVIDE(__mbed_krbs_start = .);
185-
__HeapLimit = .;
184+
PROVIDE(__mbed_krbs_start_0 = .);
186185
} > SRAM
187186

188187
/* .stack_dummy section doesn't contains any symbols. It is only
@@ -200,9 +199,6 @@ SECTIONS
200199
__StackLimit = __StackTop - MBED_CONF_TARGET_BOOT_STACK_SIZE;
201200
PROVIDE(__stack = __StackTop);
202201

203-
/* Check if data + heap + stack exceeds SRAM limit */
204-
ASSERT(__StackLimit >= __HeapLimit, "region SRAM overflowed with stack")
205-
206202
/* Put crash data in the otherwise unused D3 SRAM */
207203
.crash_data_ram :
208204
{
@@ -229,11 +225,11 @@ SECTIONS
229225
*(.EthBuffers)
230226
} >SRAM_AXI
231227

232-
/* Use the rest of DTCM as additional heap */
233-
.heap_0 (COPY):
228+
/* Use SRAM_AXI as additional heap */
229+
.heap (NOLOAD):
234230
{
235-
PROVIDE(__mbed_sbrk_start_0 = .);
236-
. += (ORIGIN(SRAM_DTC) + LENGTH(SRAM_DTC) - .);
237-
PROVIDE(__mbed_krbs_start_0 = .);
238-
} > SRAM_DTC
231+
PROVIDE(__mbed_sbrk_start = .);
232+
. += (ORIGIN(SRAM_AXI) + LENGTH(SRAM_AXI) - .);
233+
PROVIDE(__mbed_krbs_start = .);
234+
} > SRAM_AXI
239235
}

0 commit comments

Comments
 (0)