论坛元老
- 积分
- 4133
- 金钱
- 4133
- 注册时间
- 2018-5-14
- 在线时间
- 902 小时
|
发表于 2024-9-12 16:35:42
|
显示全部楼层
没有这个说法的,片外内存是因为链接脚本没有添加section所以定义数据和变量无法定义在外部,一般做法就是通过直接指定地址使用。
做法1:freertos可以魔改heap_4.c文件直接指定地址。
做法2:在keil sct文件添加外部ram的section(stmcube中修改stm32xxx.ld文件添加section),然后找到heap.c指定heapbuff到外部ram的section中。
stm32cube示例:
MEMORY
{
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
//外部ram
SDRAM (xrw) : ORIGIN = 0xD0000000, LENGTH = 4M
}
//添加外部RAM的section
_sidramdata = LOADADDR(.sdram);
.sdram :
{
. = ALIGN(4);
_sdramdata = .;
*(.sdram)
. = ALIGN(4);
_edramdata = .;
} >SDRAM AT> FLASH
C 代码 heap_4.c 中:
uint8_t __attribute__((section(".sdram"))) ucHeap[ configTOTAL_HEAP_SIZE ];
//SDRAM初始化后执行把代码中定义的常量拷贝到SDRAM
extern unsigned int _sidramdata;
extern unsigned int _sdramdata;
extern unsigned int _edramdata;
static void LoopCopyDataInit(unsigned int* from, unsigned int* region_begin,
unsigned int* region_end)
{
unsigned int *p = region_begin;
while (p < region_end)
*p++ = *from++;
}
void sdram_init(void)
{
//初始化总线
//初始化时序
//拷贝常量
LoopCopyDataInit(&_sidramdata, &_sdramdata, &_edramdata);
}
|
|