问题描述
我想在我的 MCU 上以这种方式分配 RAM 内存:
我的物理内存被分成两部分,我无法分配跨越这个边界的内存(由于组件的物理限制)。由于这个限制,我必须在我的例子中将我的堆分成两部分。
这是我的链接脚本:
MEMORY
{
RAM (rw) : ORIGIN = 0x00,LENGTH = (0x200)
}
SECTION
{
.heap1 (NOLOAD):
{
_heap1_size = 0x80;
. = . + _heap1_size;
_eheap1 = .;
} > RAM
.unallocated_ram1 (NOLOAD):
{
_unallocated_ram1 = (0x100 - ABSOLUTE(_eheap1)); /* create an offset for .heap2 */
. = . + _unallocated_ram1;
}
.heap2 (NOLOAD):
{
_heap2_size = 0x90;
. = . + _heap2_size;
} > RAM
}
最后,我希望链接器脚本计算可用的免费 ram。
我使用 --print-memory-usage
作为链接器来打印结果。
就我而言,我希望输出为:
free_ram = total ram - (_heap1_size + _heap2_size)
free_ram = 0x200 - ( 0x80 + 0x90 )
free_ram = 0xF0 (240)
但由于 unallocated_ram1
部分位于 RAM 部分,链接器脚本会将其添加到 ram 大小并打印:
free_ram = total ram - (_heap1_size + unallocated_ram1 + _heap2_size)
free_ram = 0x200 - ( 0x80 + 0x20 + 0x90 )
free_ram = 0xD0 (208)
我知道一个解决方案是使用 AT
命令将 heap2 放在特定地址,但我不想这样做,因为存在内存重叠的风险(在我的项目中有很多部分)。
我还发现将 .unallocated_ram1
替换为一个简单的:
...
.heap1 (NOLOAD):
{
[...]
} > RAM
. = . + _unallocated_ram1;
.heap2 (NOLOAD):
{
[...]
} > RAM
...
没有按预期工作。它不会移动内存指针。
我的问题:如何添加不计入 RAM SECTION 的内存块。换句话说,如何将 .heap2
放在 _eheap1
之后的偏移处。如何映射非连续内存。
感谢您的帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)