Mam problem z hardfault, który pojawia się w pozornie przypadkowych razy, gdy wskaźnik wskazuje adres A5 lub FF (moja dozwolona pamięć jest daleko poniżej 80000000 i więcej). Wydaje się, że zawsze jest ten sam wskaźnik z tymi dwiema wartościami.Wskaźnik losowo przypisany tajemnicze wartości (A5A5A5A5 i FFFFFFFF) na stm32 przy użyciu freeRTOS powodujące hardfault
Używam wbudowanego systemu z procesorem STM32F205RE, który komunikuje się z układem fm/bluetooth/gps o nazwie cg2900, w którym występuje ten błąd.
Korzystając z debugera, widzę, że wskaźnik wskazuje odpowiednio adresy A5 i FF podczas kilku testów. Wydaje się, że zdarza się to w przypadkowych czasach, czasami mogę uruchomić test przez godzinę bez awarii, a innym razem ulega awarii 20 sekund.
Używam freeRTOS jako harmonogram, aby przełączać się między różnymi zadaniami (jeden dla radio, jedno dla bluetooth, drugie dla innej konserwacji okresowej), które może w jakiś sposób zakłócać.
Co może być tego przyczyną? Ponieważ działa niestandardowy sprzęt, nie można wykluczyć, że jest to problem sprzętowy (potencjalnie). Jakieś wskazówki (nie gra słów), jak podejść do debugowania problemu?
EDIT:
Po dalszych badań wydaje się, że to jest bardzo losowe gdzie ulega awarii, nie tylko, że specyficzny wskaźnik. Użyłem hardfault obsługi, aby uzyskać następujące wartości tych rejestrów (wszystkie wartości w hex):
Semi-long run przed katastrofą (w minutach):
R0 = 1
R1 = fffffffd
R2 = 20000400
R3 = 20007f7c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = e000ed38
CFSR = 10000
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
bardzo krótkim okresie przed zderzeniowych (w sekundach):
R0 = 40026088
R1 = fffffff1
R2 = cb3
R3 = 1
R12 = 34d
LR [R14] = 40026088 subroutine call return address
PC [R15] = a5a5a5a5 program counter
PSR = fffffffd
BFAR = e000ed38
CFSR = 100
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
Innym krótki (sekundy)
R0 = 0
R1 = fffffffd
R2 = 20000400
R3 = 20007f7c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = e000ed38
CFSR = 1
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
po bardzo długim okresie (1 godzina +):
R0 = e80000d0
R1 = fffffffd
R2 = 20000400
R3 = 2000877c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = 200400d4
CFSR = 8200
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
Wydaje awarii w tym samym miejscu przez większość czasu. Poprawiłem pamięć zgodnie z wcześniejszymi sugestiami, ale nadal wydaje mi się, że mam ten sam problem.
Dziękujemy za poświęcony czas!
poważaniem
Wygląda na to, że są bajtami magicznymi niezawodnymi. Czy na pewno nie masz wiszącego wskaźnika, dereferencji NULL lub zwróconej lokalnej tablicy gdzieś? –
@ H2CO3 Tak, rzeczywiście wyglądają jak magiczne bajty. Wskaźnik jest podstawą tablicy (zasięg globalny) i mam już warunek, który sprawdza, czy nie piszę poza nim. Sam wskaźnik nigdy nie jest przypisywany po zainicjowaniu go na podstawie tablicy. – ChewToy
, jeśli mógłbyś dodać jakiś rzeczywisty kod, który by pomógł. –