Memory 使用堆的外部和内部内存

Memory 使用堆的外部和内部内存,memory,memory-management,arm,stm32,Memory,Memory Management,Arm,Stm32,我已经在我的项目中连接了外部SRAM内存。我想做的是在运行时使用malloc()将数据存储在外部或内部内存中。在代码执行期间,我如何决定在哪个内存中使用malloc存储堆数据?我知道我必须编辑链接器脚本,但之后它会将所有堆数据存储在外部内存中。 是否有任何链接器命令可以说在外部或内部内存中分配下一个malloc()?对于堆栈数据,我们可以使用属性((节(“名称”))变量属性,但堆有什么吗 谢谢大家! C库中的malloc通常只能使用一个位置的内存。如果您使用newlib,那么它将使用\u sbr

我已经在我的项目中连接了外部SRAM内存。我想做的是在运行时使用malloc()将数据存储在外部或内部内存中。在代码执行期间,我如何决定在哪个内存中使用malloc存储堆数据?我知道我必须编辑链接器脚本,但之后它会将所有堆数据存储在外部内存中。 是否有任何链接器命令可以说在外部或内部内存中分配下一个malloc()?对于堆栈数据,我们可以使用属性((节(“名称”))变量属性,但堆有什么吗


谢谢大家!

C库中的malloc通常只能使用一个位置的内存。如果您使用newlib,那么它将使用
\u sbrk
查找此内存。取决于链接器脚本对符号
end
\u end
的定义,但您也可以实现自己的定义

您必须为
malloc
选择一个访问位置,并使用自己的自定义函数从其他地方分配内存

许多库和RTOS实现都这样做。例如,参见

您可以使用许多方案来决定使用哪个内存,例如,为特定目的使用固定大小的块池。我倾向于为
malloc
使用最快的内部SRAM,因为它会变得非常零碎。然后,我确保只使用
malloc
进行小的分配,然后使用自定义函数进行大的分配。

对于堆栈数据,我们可以使用属性((节(“名称”))-这不是真的。您只能将其用于静态变量。堆栈变量将要堆栈。如果需要特定的
malloc
行为,则必须相应地实现分配器。