我在项目中连接了外部SRAM内存。我想做的是在运行时使用malloc((将数据存储在外部或内部内存中。在代码执行期间,我如何决定在哪个内存中使用malloc存储堆数据?我知道我必须编辑链接器脚本,但之后它会将所有堆数据存储在外部内存中。有没有链接器命令可以说在外部或内部内存中分配下一个malloc((?对于堆栈数据,我们可以使用attribute((section("name"(((variable attribute[/strong>,但堆有什么功能吗?
谢谢!
malloc
通常只能使用一个位置的内存。如果您使用newlib,那么它会使用_sbrk
找到这个内存。_sbrk
的默认实现取决于链接器脚本对符号end
或_end
的定义,但您也可以实现自己的。
您必须为malloc
选择一个位置进行访问,并使用自己的自定义函数从其他位置分配内存。
许多库和RTOS实现都是这样做的。例如,参见LwIP中的mem_malloc
或Keil RTX 中的rt_alloc_mem
有许多方案可以用来决定使用哪个内存,例如,为特定目的设置固定大小的块池。我倾向于对malloc
使用最快的内部SRAM,因为它会变得非常碎片化。然后,我确保只对小事情使用malloc
,然后对较大的分配使用自定义函数。