reorder constructors call
This commit is contained in:
parent
e8378e832a
commit
47dd58d040
1 changed files with 35 additions and 34 deletions
|
@ -1,9 +1,9 @@
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
typedef __SIZE_TYPE__ size_t;
|
typedef __SIZE_TYPE__ size_t;
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern void handle_reset () __attribute__((naked,nothrow,used));
|
[[using gnu: naked,nothrow,used]] extern void handle_reset ();
|
||||||
extern void user_init () __attribute__((used));
|
[[gnu::used]] extern void user_init ();
|
||||||
extern int main () __attribute__((used));
|
[[gnu::used]] extern int main ();
|
||||||
// This is required to allow pure virtual functions to be defined.
|
// This is required to allow pure virtual functions to be defined.
|
||||||
extern void __cxa_pure_virtual() { while (1); }
|
extern void __cxa_pure_virtual() { while (1); }
|
||||||
|
|
||||||
|
@ -14,41 +14,17 @@ extern "C" {
|
||||||
extern uint32_t _data_vma;
|
extern uint32_t _data_vma;
|
||||||
extern uint32_t _edata;
|
extern uint32_t _edata;
|
||||||
|
|
||||||
extern void (*__preinit_array_start[]) (void) __attribute__((weak));
|
[[gnu::weak]] extern void (*__preinit_array_start[]) (void);
|
||||||
extern void (*__preinit_array_end[]) (void) __attribute__((weak));
|
[[gnu::weak]] extern void (*__preinit_array_end[]) (void);
|
||||||
extern void (*__init_array_start[]) (void) __attribute__((weak));
|
[[gnu::weak]] extern void (*__init_array_start[]) (void);
|
||||||
extern void (*__init_array_end[]) (void) __attribute__((weak));
|
[[gnu::weak]] extern void (*__init_array_end[]) (void);
|
||||||
|
|
||||||
static void __init_array () {
|
|
||||||
uint32_t * dst, * end;
|
|
||||||
|
|
||||||
/* Zero fill the bss section */
|
|
||||||
dst = &_sbss;
|
|
||||||
end = &_ebss;
|
|
||||||
while (dst < end) * dst++ = 0U;
|
|
||||||
/* Copy data section from flash to RAM */
|
|
||||||
uint32_t * src;
|
|
||||||
src = &_data_lma;
|
|
||||||
dst = &_data_vma;
|
|
||||||
end = &_edata;
|
|
||||||
if (src != dst) {
|
|
||||||
while (dst < end) * dst++ = * src++;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t count;
|
|
||||||
/* Pro Cortex-Mx bylo toto zbytečné, lze předpokládat, že je to tak i zde.
|
|
||||||
count = __preinit_array_end - __preinit_array_start;
|
|
||||||
for (unsigned i = 0; i < count; i++) __preinit_array_start[i]();
|
|
||||||
*/
|
|
||||||
count = __init_array_end - __init_array_start;
|
|
||||||
for (unsigned i = 0; i < count; i++) __init_array_start[i]();
|
|
||||||
}
|
|
||||||
// If you don't override a specific handler, it will just spin forever.
|
// If you don't override a specific handler, it will just spin forever.
|
||||||
void DefaultIRQHandler( void ) {
|
[[gnu::interrupt]] void DefaultIRQHandler( void ) {
|
||||||
// Infinite Loop
|
// Infinite Loop
|
||||||
for (;;);
|
for (;;);
|
||||||
}
|
}
|
||||||
void NMI_RCC_CSS_IRQHandler( void ) {
|
[[gnu::interrupt]] void NMI_RCC_CSS_IRQHandler( void ) {
|
||||||
RCC.INTR.B.CSSC = RESET; // clear the clock security int flag
|
RCC.INTR.B.CSSC = RESET; // clear the clock security int flag
|
||||||
}
|
}
|
||||||
#define ALIAS(f) __attribute__((nothrow,weak,alias(#f),used))
|
#define ALIAS(f) __attribute__((nothrow,weak,alias(#f),used))
|
||||||
|
@ -255,10 +231,35 @@ R"---(
|
||||||
: : [main]"r"(user_init)/*, [InterruptVector]"r"(InterruptVector)*/
|
: : [main]"r"(user_init)/*, [InterruptVector]"r"(InterruptVector)*/
|
||||||
: "t0", "memory" );
|
: "t0", "memory" );
|
||||||
}
|
}
|
||||||
|
static void init_variables () {
|
||||||
|
uint32_t * dst, * end;
|
||||||
|
|
||||||
|
/* Zero fill the bss section */
|
||||||
|
dst = &_sbss;
|
||||||
|
end = &_ebss;
|
||||||
|
while (dst < end) * dst++ = 0U;
|
||||||
|
/* Copy data section from flash to RAM */
|
||||||
|
uint32_t * src;
|
||||||
|
src = &_data_lma;
|
||||||
|
dst = &_data_vma;
|
||||||
|
end = &_edata;
|
||||||
|
if (src != dst) {
|
||||||
|
while (dst < end) * dst++ = * src++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void init_constructors () {
|
||||||
|
/* Pro Cortex-Mx bylo toto zbytečné, lze předpokládat, že je to tak i zde.
|
||||||
|
count = __preinit_array_end - __preinit_array_start;
|
||||||
|
for (unsigned i = 0; i < count; i++) __preinit_array_start[i]();
|
||||||
|
*/
|
||||||
|
const size_t count = __init_array_end - __init_array_start;
|
||||||
|
for (unsigned i = 0; i < count; i++) __init_array_start[i]();
|
||||||
|
}
|
||||||
void user_init () {
|
void user_init () {
|
||||||
|
init_variables();
|
||||||
SystemInit();
|
SystemInit();
|
||||||
SystemCoreClockUpdate();
|
SystemCoreClockUpdate();
|
||||||
__init_array();
|
init_constructors(); // Konstruktory zavolat až po inicializaci hodin
|
||||||
main ();
|
main ();
|
||||||
for (;;);
|
for (;;);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue