#include extern void stack_start(void); // Defined in link.ld extern int main(void); void init_memory(void) { // Copy .data SECTION to ram extern uint32_t _data_start, _data_end, _data_addr; for (uint32_t *dst = &_data_start, *src = &_data_addr; dst < &_data_end;) { *dst++ = *src++; } // Initialize .bss SECTION with zeros extern uint32_t _bss_start, _bss_end; for (uint32_t *dst = &_bss_start; dst < &_bss_end; dst++) { *dst = 0; } } void reset(void) { (void)init_memory(); main(); // Infinite loop in case main returns for (;;) (void) 0; } // Create minimal interrupt vector table // 16 standard and 86 STM32F411xC/E-specific handlers void (*const interrupt_vector_table[16 + 86])(void) __attribute__((section(".isr_vector"))) = { stack_start, // Defined in link.ld reset };