gcc - 链接描述文件 - 映射非连续内存
问题描述
我想在我的 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
}
最后,我希望链接器脚本计算可用的可用内存。我使用--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)
我知道一个解决方案是使用命令将 heap2 放在特定地址,AT
但我不想这样做,因为存在内存重叠的风险(在我的项目中有很多部分)。
我还发现.unallocated_ram1
用一个简单的替换:
...
.heap1 (NOLOAD):
{
[...]
} > RAM
. = . + _unallocated_ram1;
.heap2 (NOLOAD):
{
[...]
} > RAM
...
不能按预期工作。它不会移动内存指针。
我的问题:如何添加不计入 RAM SECTION 的内存块。换句话说,如何.heap2
在_eheap1
. 如何映射非连续内存。
谢谢你的帮助!
解决方案
推荐阅读
- python - Python - 将一个时间段拆分为多个固定长度的时间段
- javascript - 格式化 HTML 容器
- java - Java:线程是否以我的应用程序结束
- php - 在 Woocommerce 之前通过 _sale_price_dates_to 获取产品 ID
- php - 如何使用 NodeJS Crypto Package 从 PHP 中解密加密数据
- python - 获取熊猫中唯一列值的日期索引
- php - 匹配多行 HTML 块,为什么这么贪?
- sql-server - BIML AdoNetConnection 与 Oracle.ManagedDataAccess 无法验证
- python - (A, B) 和 (C,) 之间的闵可夫斯基距离
- javascript - 使用 javascript 将 contentEditable 保存到 html 文件中