自动初始化机制


 1 展开后是这样的,其实是定义了一个函数指针类型的变量 2 __attribute__((used)) const init_fn_t __rt_init_##fn __attribute__((section(".rti_fn."level))) = fn
 3 
 4 
 5 __attribute__((used)) const init_fn_t __rt_init_rti_start __attribute__((section(".rti_fn.""0"))) = rti_start
 6 
 7 __attribute__((used)) const init_fn_t __rt_init_rti_board_start __attribute__((section(".rti_fn.""0.end"))) = rti_board_start
 8 
 9 __attribute__((used)) const init_fn_t __rt_init_rti_board_end __attribute__((section(".rti_fn.""1.end"))) = rti_board_end
10 
11 __attribute__((used)) const init_fn_t __rt_init_rti_end __attribute__((section(".rti_fn.""6.end"))) = rti_end

--------------------------------------------------------------------------------------------------------------------------------------------------------

 1 void rt_components_board_init(void)
 2 {
 3 #if RT_DEBUG_INIT
 4     int result;
 5     const struct rt_init_desc *desc;
 6     for (desc = &__rt_init_desc_rti_board_start; desc < &__rt_init_desc_rti_board_end; desc ++)
 7     {
 8         rt_kprintf("initialize %s", desc->fn_name);
 9         result = desc->fn();
10         rt_kprintf(":%d done\n", result);
11     }
12 #else
13     const init_fn_t *fn_ptr;
14 
15     for (fn_ptr = &__rt_init_rti_board_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++)
16     {
17         (*fn_ptr)();
18     }
19 #endif
20 }
 1 void rt_components_init(void)
 2 {
 3 #if RT_DEBUG_INIT
 4     int result;
 5     const struct rt_init_desc *desc;
 6 
 7     rt_kprintf("do components initialization.\n");
 8     for (desc = &__rt_init_desc_rti_board_end; desc < &__rt_init_desc_rti_end; desc ++)
 9     {
10         rt_kprintf("initialize %s", desc->fn_name);
11         result = desc->fn();
12         rt_kprintf(":%d done\n", result);
13     }
14 #else
15     const init_fn_t *fn_ptr;
16 
17     for (fn_ptr = &__rt_init_rti_board_end; fn_ptr < &__rt_init_rti_end; fn_ptr ++)
18     {
19         (*fn_ptr)();
20     }
21 #endif
22 }

 参考文章:文章1   文章2