C动态分配如何与链接器一起使用来定义堆位置

时间:2016-04-12 16:57:02

标签: c linker malloc heap gnu

我正在开发一个嵌入式系统,并编写了一个链接描述文件,将某些部分放在外部ram中。我也试图在外部ram中设置堆。

我似乎无法“轻松”找到gnu或libc的任何文档,这些文档会告诉我可能存在哪些符号以及它们应该指向什么。如果有人能够指出我的文档或快速下来,这将是伟大的。

我想在ram中留下.data,而不是使用sbrk扩展.data只需使用外部ram中的.heap部分。

1 个答案:

答案 0 :(得分:0)

我发布了一些更多细节和我的解决方案,以防其他任何人遇到此问题。

我正在为stm32f7手臂皮质uC开发。我们开发了一块带有外部撞锤的板,需要将堆放在那里。

stm32上ram的地址是0x20000000。 FMC(外部ram)的地址是0x90000000。

_sbrk函数的arm-none-eabi实现扩展了堆,并检查堆和堆栈的切割。在正常构建中,堆和堆栈都在ram的末尾。但是,一旦我将堆移动到外部ram(0x90000000),它总是>堆栈的结尾会导致_sbrk失败。

由于_sbrk函数是弱链接的,因此需要重新实现它才能验证我的分配是否保留在我定义的堆位置。

另外需要注意的是:链接器必须将end声明为欲望堆位置的开头。我还添加了一个_endheap符号,这样我就可以将堆限制在所需的内存部分。是否真的需要这个可以辩论。