kiciek
#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.
  • Najlepsze
  • Wszystkie komentarze
Gynvael
@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.
lionbest
@a231: Generalnie wiadomo ocb. Funckja __cxa_guard_acquire generuje instrukcję, której procesor ARMowy nie łyka.
@kiciek: Co za procek? Która wersja GCCka?
leoha
leoha
1
Z tego co rozumię, zeby


@kiciek: litości.. rozumiem, umiem, ale potrafię
#grammarnazi
a231
a231
0
@kiciek: Bez kodu to nikt ci nie pomoże.
kiciek
kiciek Autor
0
@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
kiciek Autor
0
Teraz nic nie sprawdzę i nie zrobię, ale ten problem nie pozwala mi myśleć o niczym innym.
kiciek
kiciek Autor
0
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
Gynvael
+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.
kiciek
kiciek Autor
0
@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.
Gynvael
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).
kiciek
kiciek Autor
0
@Gynvael: meh. Tak się nie nauczę nic nowego.
Gynvael
Zgoda :) Jeśli nie jest to żaden ważny kod, który ma się kompilować i za 10 lat, to czemu nie :)