为堆使用外部和内部存储器
Using external and internal memory for heap
我已经在我的项目中连接了外部 SRAM 存储器。我想要做的是在运行时使用 malloc() 将数据存储在外部或内部存储器中。我如何在代码执行期间决定在哪个内存中使用 malloc 存储堆数据?我知道我必须编辑链接描述文件,但之后它会将所有堆数据存储在外部存储器中。
是否有任何链接器命令可以说在外部或内部存储器中分配下一个 malloc() ?对于堆栈数据,我们可以使用 attribute((section("name"))) variable attribute 但是堆有什么用吗?
谢谢!
C 库中的 malloc
通常只能使用一个位置的内存。如果您使用 newlib,那么它会使用 _sbrk
找到此内存。 default implementation of _sbrk
取决于链接器脚本对符号 end
或 _end
的定义,但您也可以自己实现。
您必须选择一个位置供 malloc
访问,并使用您自己的自定义函数从其他位置分配内存。
许多库和 RTOS 实现都这样做。例如参见 [=21=]
您可以使用多种方案来决定要使用的内存,例如为特定目的使用固定大小的块池。我倾向于为 malloc
使用最快的内部 SRAM,因为它会变得非常碎片化。然后,我确保只对小事情使用 malloc
,然后对较大的分配使用自定义函数。
我已经在我的项目中连接了外部 SRAM 存储器。我想要做的是在运行时使用 malloc() 将数据存储在外部或内部存储器中。我如何在代码执行期间决定在哪个内存中使用 malloc 存储堆数据?我知道我必须编辑链接描述文件,但之后它会将所有堆数据存储在外部存储器中。 是否有任何链接器命令可以说在外部或内部存储器中分配下一个 malloc() ?对于堆栈数据,我们可以使用 attribute((section("name"))) variable attribute 但是堆有什么用吗?
谢谢!
malloc
通常只能使用一个位置的内存。如果您使用 newlib,那么它会使用 _sbrk
找到此内存。 default implementation of _sbrk
取决于链接器脚本对符号 end
或 _end
的定义,但您也可以自己实现。
您必须选择一个位置供 malloc
访问,并使用您自己的自定义函数从其他位置分配内存。
许多库和 RTOS 实现都这样做。例如参见 [=21=]
您可以使用多种方案来决定要使用的内存,例如为特定目的使用固定大小的块池。我倾向于为 malloc
使用最快的内部 SRAM,因为它会变得非常碎片化。然后,我确保只对小事情使用 malloc
,然后对较大的分配使用自定义函数。