ZHCUAU3J January 2018 – March 2024
假设应用程序包含存储器重叠区,而必须在运行时管理重叠。存储器重叠区在链接器命令文件中使用 UNION 来定义,如使用 UNION 定义存储器重叠区 中所示:
SECTIONS
{
...
UNION
{
GROUP
{
.task1: { task1.c.obj(.text) }
.task2: { task2.c.obj(.text) }
} load = ROM, LOAD_START(_task12_load_start), SIZE(_task12_size)
GROUP
{
.task3: { task3.c.obj(.text) }
.task4: { task4.c.obj(.text) }
} load = ROM, LOAD_START(_task34_load_start), SIZE(_task_34_size)
} run = RAM, RUN_START(_task_run_start)
...
}
应用程序必须在运行时管理存储器重叠区的内容。也就是说,当需要来自 .task1 或 .task2 的任何服务时,应用程序必须首先确保 .task1 和 .task2 驻留在存储器重叠区中。.task3 和 .task4 与此类似。
若要在运行时影响 .task1 和 .task2 从 ROM 到 RAM 的复制,应用程序必须先获取各任务的加载地址 (_task12_load_start),再获取运行地址 (_task_run_start) 和大小 (_task12_size)。然后使用这些信息来执行实际的代码复制。