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
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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.
  • Odpowiedz
@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.
  • Odpowiedz
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
  • Odpowiedz
+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.
  • Odpowiedz
@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.
  • Odpowiedz
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).
  • Odpowiedz