我正在开发一个嵌入式系统,并编写了一个链接器脚本,将某些部分放入外部ram。我还试图在外部ram中设置堆。
我似乎找不到任何关于gnu或libc的文档来告诉我可能存在什么符号以及它们应该指向什么。如果有人能给我指一下文档或快速浏览一下,那就太好了。
我想把.data留在ram中,而不是让sbrk扩展.data,只使用外部ram中的.heap部分。
我发布了更多的细节和我的解决方案,以防其他人遇到这个问题。
我正在为stm32f7手臂皮层uC开发。我们开发了一个带有外部闸板的板,需要将堆粘在那里。
stm32上ram的地址为0x20000000。FMC(外部ram)的地址为0x90000000。
brk函数的arm-none-eabi实现扩展了堆,并检查了堆和堆栈的冲突。在正常的构建中,堆和堆栈都在ram的末尾。然而,一旦我将堆移动到外部ram(0x90000000),它总是>堆栈的末尾,并且会导致_sbrk失败。
由于_sbrk函数是弱链接的,因此需要重新实现它,以验证我的分配是否保留在我定义的堆位置中。
还要注意:链接器必须声明end为所需堆位置的开始。我还添加了一个_endheap符号,这样我就可以将堆约束到所需的内存部分。这是否真的值得商榷。