我想创建两个堆区域,一个使用内部 RAM,另一个使用外部 SRAM。但代码在某个时刻崩溃并产生HardFault错误。
代码如下
//in .ld file
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 512K
EXT_SRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 512K
EXT_PSRAM(xrw) : ORIGIN = 0x6C000000, LENGTH = 8M
}
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */
_Min_Heap_Size = 0x0;
_Min_Stack_Size = 0x400;
._user_heap_stack (NOLOAD) :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >RAM
.heap_internal (NOLOAD):
{
. = ALIGN(8);
_heap_internal_start = .;
. = . + 0x2000; /* 8 KB internal heap */
_heap_internal_end = .;
. = ALIGN(8);
} >RAM
.heap_ext (NOLOAD) :
{
. = ALIGN(8);
_heap_start = .;
. = . + 0x40000; /* 256 KB for heap */
_heap_end = .;
. = ALIGN(8);
} >EXT_SRAM
/* ========== Stack in External SRAM ========= */
.stack_ext (NOLOAD) :
{
. = ALIGN(8);
_ext_stack_start = .;
. = . + 0x40000; /* 256 KB for stack */
_ext_stack_end = .;
. = ALIGN(8);
} >EXT_SRAM
为了管理外部heap,创建了external_heap.c
#define EXTERNAL_HEAP_SIZE (400 * 1024) // 400 KB
#define INTERNAL_HEAP_SIZE (8 * 1024) // 8 KB
extern uint8_t _heap_internal_start;
extern uint8_t _heap_internal_end;
extern uint8_t _heap_start;
extern uint8_t _heap_end;
HeapRegion_t xHeapRegions[] =
{
{ &_heap_internal_start, (size_t)(INTERNAL_HEAP_SIZE) },
{ &_heap_start, (size_t)(EXTERNAL_HEAP_SIZE) },
{ NULL, 0 }
};
|
|