Global_init_slot __hot__ -
GLOBAL_INIT_SLOT(clock_init, 001); GLOBAL_INIT_SLOT(gpio_init, 002);
// slot_def.h typedef void (*init_fn_t)(void); #define GLOBAL_INIT_SLOT(fn, priority) \ __attribute__((section(".init_slots." #priority))) \ const init_fn_t _slot_##fn = fn // peripherals.c void clock_init(void) ... void gpio_init(void) ... global_init_slot
Linker script collects all .init_slots.* into an array: // slot_def.h typedef void (*init_fn_t)(void)
.init_slots : __init_slots_start = .; KEEP(*(.init_slots.001)) KEEP(*(.init_slots.002)) /* higher priorities may be overridden by explicit ordering */ __init_slots_end = .; >FLASH Startup code: FLASH Startup code: