Wpis z mikrobloga

#cpp #embedded #arm #programowanie
Pytanie dotyczy bare metal c++. Moim problemem jest undefined instruction w __cxa_guard_acquire podczas inicjalizacji lokalnej (w funkcji), statycznej (static), nie trywialnej (mającej własny konstruktor) zmiennej.
Wydaje mi się, że rozwiązaniem może być wymuszenie inicjalizacji tego rodzaju obiektów w startupie, a nie przy pierwszym wejściu do danego scope, w podobny sposób w jaki są inicjalizowane obiekty globalne.
Nie wiem jednak jak to zrobić. Wołam do pomocy @Gynvael bo napisał artykuł który kwestię trochę wyjaśnia, ale o pomoc proszę każdego.
  • 12
@lionbest: stm32f4
arm-none-eab-g++ 7. Konkretnie nie pamiętam: chyba 7.3.
Na stacktrace miałem hardfaulta wywołanego tą instrukcją (0xff). To wywołanie nie było z przerwania.
@kiciek Hmmm, masz w opcjach kompilacji wybrany odpowiedni procesor? Jakieś -mthumb -mcpu=cortex-m4 or sth?

Tak szczerze, jeśli masz tylko jeden wątek, to pomyśl czy by się tych funkcji jakoś nie pozbyć, bo mutexy bez multithreadingu są umiarkowanie potrzebne.
Oczywiście, że mam. Wątków mam więcej i funkcja ze statyczną zmienną może być wywoływana w przerwaniu. To, że nie widziałem innego wątku na stack trace, nie znaczy, że go tam nie było chwilę wczśniej.
Według ARMa ich implementacje _cxaguard... nie są thread safe. Że funkcja pochodzi z biblioteki, to wolę jej nie edytować - szczególnie, że przeniesienie wywołań konstruktorów do startupu wydaje się mi pomysłem dobrze wpływającym na deterministyczność.
Jeśli
+1 na przeniesienie inicjalizacji do jakiegoś startupu :)

Swoją drogą, masz może pełną instrukcje z tej funkcji? ARM ma 2 albo 4 bajtowe instrukcje, więc 0xff to tylko jej część. Jestem ciekaw, czy to faktycznie jakaś 'nie taka' instrukcja, czy jakiś inny błąd.
@Gynvael: Jak wrócę do pracy to podam. Ja się spodziewam, ze to celowy zabieg, zamiast mutexu.

Z tego co rozumię, zeby osiągnąć swój cel muszę wygenerować listę konstruktorów podobna do tej o której wspominają tu.
Wyciągnąć z linkera symbole i zrobić magiczne coś jak tutaj.
Piszę magiczne, bo nie wiem czym dokładnie jest ta lista konstruktorów.
Uhm, można tak, ale raczej bym zalecał rozwiązać to bez hacków tego typu, tj. usunąć static costam i zamiast tego alokować je gdzieś wcześniej i np. przekazywać do tych funkcji jako parametr (albo jako jakaś zmienna globalna która jest pointerem na ten obiekt).