ZHCUAU3J January 2018 – March 2024
可以拆分包含单独加载和运行放置指令的段。链接器可以访问拆分对象组件每个部分的加载地址和运行地址。使用 table() 操作符,用户可以指示链接器生成此信息并将其放入复制表。链接器会在复制表对象中为拆分对象组件的每个部分提供一个 COPY_RECORD 条目。
例如,设想一个具有七个任务的应用。任务 1 至 3 与任务 4 至 7 重叠(使用 UNION 指令)。所有这些任务的加载放置都会在四个不同的存储器区域(LMEM1、LMEM2、LMEM3 和 LMEM4)之间分配。重叠定义为存储器区域 PMEM 的一部分。用户必须在运行时将每组任务移入重叠区,才能使用该组中的服务。
用户可以将 table() 操作符与分拆操作符 >> 结合使用来创建包含所有所需信息的复制表,以将任一组任务移入存储器重叠区,如创建复制表来访问拆分对象组件中所示。
SECTIONS
{
UNION
{
.task1to3: { *(.task1), *(.task2), *(.task3) }
load >> LMEM1 | LMEM2 | LMEM4, table(_task13_ctbl)
GROUP
{
.task4: { *(.task4) }
.task5: { *(.task5) }
.task6: { *(.task6) }
.task7: { *(.task7) }
} load >> LMEM1 | LMEM3 | LMEM4, table(_task47_ctbl)
} run = PMEM
...
.ovly: > LMEM4
}
拆分对象组件驱动程序显示了此类应用可能的驱动程序。
#include <cpy_tbl.h>
extern COPY_TABLE task13_ctbl;
extern COPY_TABLE task47_ctbl;
extern void task1(void);
...
extern void task7(void);
main()
{
...
copy_in(&task13_ctbl);
task1();
task2();
task3();
...
copy_in(&task47_ctbl);
task4();
task5();
task6();
task7();
...
}
.task1to3 段的内容会分拆到该段的加载空间并且在其运行空间中是连续的。由链接器生成的复制表 _task13_ctbl 会针对分拆段 .task1to3 的每个部分包含一个单独的 COPY_RECORD。当 _task13_ctbl 的地址被传递到 copy_in() 时,.task1to3 的每个部分都会从其加载位置复制到运行位置。
包含任务 4 至 7 的 GROUP 的内容也会拆分到加载空间中。链接器会按顺序为 GROUP 中每个成员应用分拆操作符,从而执行 GROUP 分拆。然后,该 GROUP 的复制表会针对该 GROUP 中每一个成员的每个部分包含一个 COPY_RECORD 条目。当 copy_in() 对 _task47_ctbl 进行处理时,这些部分都会复制到存储器重叠区。
分拆操作符可应用于输出段、GROUP、UNION 或 UNION 成员的加载放置。链接器不允许将分拆操作符应用于 UNION 或 UNION 成员的运行放置。链接器会检测此类违规情况,发出警告,并忽略违规使用分拆操作符的情况。