研究生
最后登录1970-1-1
在线时间 小时
注册时间2019-4-16
|
发表于 2020-4-12 23:58:13
|
显示全部楼层
其实看一下宏定义一目了然,以INIT_EXPORT为例在头文件rtdef.h中
- struct rt_init_desc
- {
- const char* fn_name;
- const init_fn_t fn;
- };
- #define INIT_EXPORT(fn, level) \
- const char __rti_##fn##_name[] = #fn; \
- RT_USED const struct rt_init_desc __rt_init_desc_##fn SECTION(".rti_fn." level) = \
- { __rti_##fn##_name, fn};
复制代码 又在链接脚本中link.lds- /* section information for initial. */
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
复制代码 在components.c中又有
- const init_fn_t *fn_ptr;
- for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr ++)
- {
- (*fn_ptr)();
- }
复制代码
也就是给用了INIT_EXPORT宏的函数统一把他们添加到一个程序SECTION(节)中,然后用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");
复制代码
避免了一些因为大量初始化函数要调用,又有前后依赖顺序的错误.
|
|