STM32 startup kod

Miroslav Mraz mrazik na volny.cz
Středa Srpen 14 09:43:02 CEST 2019


Osvědčilo se mi používat vlastní rutinu pro toto volání konstruktorů 
statických instancí tříd.

/// V linker skriptu
extern void (*__init_array_start)();
extern void (*__init_array_end)  ();
/// Inicializace statických konstruktorů - použít explicitně po celkové 
inicializaci systému
/*static inline*/ void static_init() {
   void (**p)();
   // Tohle je sice konstrukce značně nepřehledná (nalezená na webu), 
leč funguje.
   for (p = &__init_array_start; p < &__init_array_end; p++) (*p)();
}

Tohle bych použil místo knihovního __libc_init_array. Z mapy je vidět, 
že tam jeden statický konstruktor máte. Pokud to je program v čistém C, 
pak je někde jiný problém. Ty statické instance v C++ jsou vůbec 
problém, protože pokud je tam více instancí tříd a jsou na sobě nějak 
závislé, není zaručeno pořadí volání jejich konstruktorů.

Mrazík

Dne 14. 08. 19 v 8:51 Jaroslav Buchta napsal(a):
> Zdravim, vzal jsem do ruky starsi projekt s procesorem STM32F101RBT6, v 
> CubeMX nakonfiguroval a vygeneroval projekt s HAL. Potud vse OK. Preklad 
> nesel, dokud jsem nevlozit do nastaveni projektu definici __SOFTFP__, 
> budiz, drobna chybka...
> 
> Ale program stejne nefunguje, zhavaruje volani fce  ve startup kodu
> 
> bl __libc_init_array
> 
> ktera je ponekud nesmyslna (asi v sekci .preinit_array nic neni ale 
> funkce prilinkovana dle map souboru je) a vypada takto - druha instrukce 
> skace nekam doprostred fce... Kod i jinak nedava smysl.
> 
> __libc_init_array:
> 080013f0:   adds    r0, #112        ; 0x70
> 080013f2:   b.n     0x8000f34 <HAL_RTC_SetDate+68>     //!!!!! nesmysl?
> 080013f4:   eors    r0, r6
> 080013f6:   stmdb   sp!, {r12, lr}
> 080013fa:   b.n     0x8001b3e
> 
> ...
> 
> Sekce z .map souboru
> 
> .text.__libc_init_array
>                  0x080013f0       0x88 
> c:/ac6/systemworkbench/plugins/fr.ac6.mcu.externaltools.arm-none.win32_1.17.0.201812190825/tools/compiler/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib\libc_nano.a(lib_a-init.o) 
> 
>                  0x080013f0                __libc_init_array
> 
> .preinit_array  0x080014d4        0x0
>                  0x080014d4                PROVIDE 
> (__preinit_array_start = .)
>   *(.preinit_array*)
>                  0x080014d4                PROVIDE (__preinit_array_end 
> = .)
> 
> .init_array     0x080014d4        0x4
>                  0x080014d4                PROVIDE (__init_array_start = .)
>   *(SORT_BY_NAME(.init_array.*))
>   *(.init_array*)
>   .init_array    0x080014d4        0x4 
> c:/ac6/systemworkbench/plugins/fr.ac6.mcu.externaltools.arm-none.win32_1.17.0.201812190825/tools/compiler/bin/../lib/gcc/arm-none-eabi/7.3.1/crtbegin.o 
> 
>                  0x080014d8                PROVIDE (__init_array_end = .)
> 
> Prekladac je z SW4STM32 a SW je aktualni. Netusi nekdo, kde muze byt 
> chyba? Je snad pouziti techto starych MCU v kombinaci s novymi nastroji 
> nefunkcni?
> 
> A taky by me zajimalo, proc se mi vzdycky po vygenerovani novych 
> zdrojaku z CubeMX znici .LD soubor, zkrati se na delku 0. Staci jej 
> smazat a znovu vygenerovat projekt...
> 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list