.rti_fn 段的作用
在 RT-Thread 实时操作系统中,.rti_fn
代码段通常用于存放初始化函数。RT-Thread 的启动过程中包括了一系列的初始化步骤,这些初始化函数被分配到特定的代码段中,以便操作系统在启动时按照预定的顺序执行它们。
/* section information for initial. */
. = ALIGN(8);
__rt_init_start = .;
KEEP(*(SORT(.rti_fn*)))
__rt_init_end = .;
RT-Thread 链接脚本中的 keep(*(sort(.rti_fn*)))
是一个 GNU 链接器指令,用于确保链接过程中保留 .rti_fn
段中的所有内容,并且防止链接器优化掉未被引用的部分。这里进行了详细的介绍:
-
.rti_fn 段的作用:
.rti_fn
段是 RT-Thread 系统在链接脚本中定义用来存放初始化函数的代码段。开发者可以将特定的初始化函数放入这个段中,这样做的好处是,系统可以在启动时自动按顺序调用它们,而无需显式地在代码中调用初始化函数。 -
keep():
keep()
是链接器指令的一部分,它告诉链接器保留指定的节(section),即使这些节中的符号在程序中未被直接引用。通常,如果链接器检测到某些符号未被使用,它可能会在最终的可执行文件中删除这些符号,以减小代码大小。使用keep()
可以防止这种情况发生。 -
(sort(.rti_fn)):星号(*)是通配符,它指示链接器包括所有以
.rti_fn
开头的节。sort()
函数将这些节按照字母顺序进行排序。排序能确保初始化函数按照特定的顺序被执行,这在某些情况下可能很重要,例如,当一些初始化函数必须在其他函数之前运行时。 -
链接脚本中的使用:在 RT-Thread 的链接脚本中,使用
keep(*(sort(.rti_fn*)))
通常位于输出节(output section)的定义中,它确保所有.rti_fn
初始化函数都被包含在最终的可执行或二进制文件中,并按正确的顺序执行。
例如,在 RT-Thread 的链接脚本中,你可能会看到类似这样的段落:
.init_array :
{
__preinit_array_start = .;
KEEP(*(.preinit_array))
__preinit_array_end = .;
__init_array_start = .;
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
__init_array_end = .;
KEEP(*(SORT(.rti_fn*))) /* 这是关键的部分 */
}
这段代码定义了 .init_array
,这是初始化函数数组的一部分,并告诉链接器保留 .rti_fn
段中排序后的所有函数。因此,当操作系统启动并执行初始化函数时,它会按照这里指定的顺序来执行位于 .rti_fn
段中的函数。文章来源:https://www.toymoban.com/news/detail-818194.html
通过这种机制,RT-Thread 可以提供一个灵活、可扩展的初始化过程,允许开发人员和模块作者注册自定义的初始化代码,而无需修改系统启动代码本身。文章来源地址https://www.toymoban.com/news/detail-818194.html
到了这里,关于【ARMv8M Cortex-M33 系列 5 -- RT-Thread .rti_fn 段简介】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!