[STM32H7] 在 FreeRTOS 中使用 SRAM 创建内部堆加外部堆

[复制链接]
6|0
我的牙白 发表于 2026-9-19 18:06 | 显示全部楼层 |阅读模式

我想创建两个堆区域,一个使用内部 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 }
};

您需要登录后才可以回帖 登录 | 注册

本版积分规则

203

主题

204

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0