ZHCU875Z August 2001 – October 2023 SM320F28335-EP
对于某些应用,用户可能希望在运行时期间分配占用同一地址的多个段。例如,用户可能希望在不同执行阶段使用快速外部存储器中的若干例程。用户也可能希望若干不同时处于活动状态的数据对象共享一个存储器块。SECTIONS 指令中的 UNION 语句可在同一运行时地址分配多个段。
在 UNION 语句 中(使用 COFF 段名),file1.c.obj 和 file2.c.obj 的 .ebss 段在 FAST_MEM 中的同一地址进行分配。在存储器映射中,union 占用的空间为其最大组件所占的空间。union 的组件仍是独立段;它们只是作为一个单元一同被分配。
SECTIONS
{
.text: load = SLOW_MEM
UNION: run = FAST_MEM
{
.ebss:part1: { file1.c.obj(.ebss) }
.ebss:part2: { file2.c.obj(.ebss) }
}
.ebss:part3: run = FAST_MEM { globals.c.obj(.ebss) }
}
分配一个作为 union 一部分的段仅影响其运行地址。加载时的段永远不会 叠加。如果经过初始化的段是 union 成员(经过初始化的段具有原始数据,例如 .text),则必须 分别指定其负载分配。请参阅UNION 段的单独加载地址。(在将经过初始化的段与未经初始化的段相结合时,此规则有一个例外;请参阅节 8.5.7.3。)
UNION run = FAST_MEM
{
.text:part1: load = SLOW_MEM, { file1.c.obj(.text) }
.text:part2: load = SLOW_MEM, { file2.c.obj(.text) }
}
.text 段包含原始数据,因此无法作为 union 加载,但可以作为 union 运行。因此,每个 .text 段都需要有自己的加载地址。如果用户未能为 UNION 中的初始化段提供加载分配,链接器会发出警告,并将所配置存储器中的任意位置作为加载空间分配。
未初始化的段未加载,不需要加载地址。
UNION 语句仅适用于运行地址的分配,因此无需为 union 本身指定加载地址。如用于分配,union 可被视为未初始化的段:指定的任何分配均被视为运行地址,如果同时指定了运行和加载地址,链接器会发出警告,并忽略加载地址。
UNION 功能和叠加页面功能(请参阅节 8.5.8)可能有些类似,因为它们都涉及叠加。但事实上它们是截然不同的。UNION 支持在同一存储器空间中将多个段叠加。而叠加页面会定义多个存储器空间。可以使用页面功能模拟 UNION 的功能,但这很复杂。