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