自动初始化机制
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