打印
[其他]

RT-Thread函数指针块自动初始化简介

[复制链接]
1412|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2024-12-27 14:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
环境:rt-thread 4.0.3 rt-thread studio 2.2.1 ART-Pi

定义 函数指针块

主要用于map文件标记
components.c 中

static int rti_start(void)

return 0;

}

INIT_EXPORT(rti_start, "0");

static int rti_board_start(void)

{

return 0;

}

INIT_EXPORT(rti_board_start, "0.end");

static int rti_board_end(void)

return 0;

}

INIT_EXPORT(rti_board_end, "1.end");

static int rti_end(void)

{

return 0;

}

INIT_EXPORT(rti_end, "6.end");

执行

void rt_components_board_init(void) 执行第0等级

void rt_components_init(void) 执行其余等级 rtthread.map

*(SORT(.rti_fn*))

.rti_fn.0 0x9002a5fc 0x4 ./rt-thread/src/components.o

0x9002a5fc __rt_init_rti_start

.rti_fn.0.end 0x9002a600 0x4 ./rt-thread/src/components.o

0x9002a600 __rt_init_rti_board_start

.rti_fn.1 0x9002a604 0x4 ./libraries/drivers/drv_adc.o

0x9002a604 __rt_init_STM32_adc_init

.rti_fn.1 0x9002a608 0x4 ./board/board.o

0x9002a608 __rt_init_clock_information

.rti_fn.1 0x9002a60c 0x4 ./board/drv_mpu.o

0x9002a60c __rt_init_mpu_init

.rti_fn.1 0x9002a610 0x4 ./applications/main.o

0x9002a610 __rt_init_vtor_config

.rti_fn.1.end 0x9002a614 0x4 ./rt-thread/src/components.o

0x9002a614 __rt_init_rti_board_end

.rti_fn.2 0x9002a618 0x4 ./rt-thread/components/utilities/ulog/backend/console_be.o

0x9002a618 __rt_init_ulog_console_backend_init

.rti_fn.2 0x9002a61c 0x4 ./rt-thread/components/utilities/ulog/ulog.o

0x9002a61c __rt_init_ulog_init

.rti_fn.2 0x9002a620 0x4 ./rt-thread/components/dfs/src/dfs.o

0x9002a620 __rt_init_dfs_init

.rti_fn.4 0x9002a624 0x4 ./rt-thread/components/utilities/utest/utest.o

0x9002a624 __rt_init_utest_init

.rti_fn.4 0x9002a628 0x4 ./rt-thread/components/libc/compilers/newlib/libc.o

0x9002a628 __rt_init_libc_system_init

.rti_fn.5 0x9002a62c 0x4 ./applications/uart_sample.o

0x9002a62c __rt_init_uart_dma_sample

.rti_fn.6 0x9002a630 0x4 ./rt-thread/components/finsh/shell.o

0x9002a630 __rt_init_finsh_system_init

.rti_fn.6.end 0x9002a634 0x4 ./rt-thread/src/components.o

0x9002a634 __rt_init_rti_end

0x9002a638 __rt_init_end = .

0x9002a638 . = ALIGN (0x4)

[!provide] PROVIDE (__ctors_start__, .)

怎样插入函数指针

rtdef.h 中 宏定义

/* board init routines will be called in board_init() function */

#define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1")

/* pre/device/component/env/app init routines will be called in init_thread */

/* components pre-initialization (pure software initilization) */

#define INIT_PREV_EXPORT(fn) INIT_EXPORT(fn, "2")

/* device initialization */

#define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3")

/* components initialization (dfs, lwip, ...) */

#define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4")

/* environment initialization (mount disk, ...) */

#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5")

/* appliation initialization (rtgui application etc ...) */

#define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6")

#define SECTION(x) __attribute__((section(x)))

#define RT_UNUSED __attribute__((unused))

#define RT_USED __attribute__((used))

#define ALIGN(n) __attribute__((aligned(n)))

#define RT_WEAK __attribute__((weak))

#define rt_inline static __inline

typedef int (*init_fn_t)(void);

RT_USED const init_fn_t __rt_init_##fn SECTION(".rti_fn." level) = fn

编译保留 RT_USED

函数指针 init_fn_t

函数名—宏连接 __rt_init_##fn

编译位置 SECTION(".rti_fn." level)

使用特权

评论回复
沙发
无法去污粉| | 2025-2-28 16:18 | 只看该作者
INIT_EXPORT 宏通常用于将一个初始化函数注册到RT-Thread系统的启动队列中,以便系统启动时按顺序调用这些初始化函数。

使用特权

评论回复
板凳
tpgf| | 2025-3-1 10:32 | 只看该作者
RT-Thread提供了多个自动初始化宏,用于不同类型的初始化

使用特权

评论回复
地板
磨砂| | 2025-3-1 18:39 | 只看该作者
在RT-Thread中,函数指针块的自动初始化是通过一系列预定义的宏和机制来实现的

使用特权

评论回复
5
晓伍| | 2025-3-1 20:35 | 只看该作者
RT-Thread的自动初始化机制允许开发者通过特定的宏定义来声明初始化函数,这些函数将在系统启动过程中被自动调用,无需显式地在代码中逐一调用

使用特权

评论回复
6
八层楼| | 2025-3-2 08:02 | 只看该作者
在系统启动过程中,RT-Thread会遍历这些初始化函数表,并按顺序调用其中的函数,从而完成自动初始化过程

使用特权

评论回复
7
观海| | 2025-3-2 09:48 | 只看该作者
确保自动初始化的函数所在的section是连续的并且类型一致,这样才能保证从起始地址到结束地址挨个执行实现自动初始化

使用特权

评论回复
8
guanjiaer| | 2025-3-2 11:40 | 只看该作者
在使用自动初始化机制时,应注意避免函数间的依赖关系导致的初始化顺序问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1562

主题

5028

帖子

6

粉丝