【ARMv8M Cortex-M33 系列 5 -- RT-Thread .rti_fn 段简介】

文章目录

    • .rti_fn 段的作用

.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 段中的所有内容,并且防止链接器优化掉未被引用的部分。这里进行了详细的介绍:

  1. .rti_fn 段的作用.rti_fn 段是 RT-Thread 系统在链接脚本中定义用来存放初始化函数的代码段。开发者可以将特定的初始化函数放入这个段中,这样做的好处是,系统可以在启动时自动按顺序调用它们,而无需显式地在代码中调用初始化函数。

  2. keep()keep() 是链接器指令的一部分,它告诉链接器保留指定的节(section),即使这些节中的符号在程序中未被直接引用。通常,如果链接器检测到某些符号未被使用,它可能会在最终的可执行文件中删除这些符号,以减小代码大小。使用 keep() 可以防止这种情况发生。

  3. (sort(.rti_fn)):星号(*)是通配符,它指示链接器包括所有以 .rti_fn 开头的节。sort() 函数将这些节按照字母顺序进行排序。排序能确保初始化函数按照特定的顺序被执行,这在某些情况下可能很重要,例如,当一些初始化函数必须在其他函数之前运行时。

  4. 链接脚本中的使用:在 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 段中的函数。

通过这种机制,RT-Thread 可以提供一个灵活、可扩展的初始化过程,允许开发人员和模块作者注册自定义的初始化代码,而无需修改系统启动代码本身。

你可能感兴趣的:(#,ARM,系列,.rti_fn)