Wpis z mikrobloga

#programowanie #embedded

Mireczki pytanie, kiedyś pamiętam że miałem okazję bawić się taką funkcjonalnością, ale kompletnie zapomniałem jak to się robiło.

Jest sobie program i załóżmy że się wykrzaczył gdzieś. Teraz wypadałoby to zdebugować - miałem przyjemność bawić się taką funkcjonalnością, że sprawdzało się adres ostatniego skoku procesora (w zmiennej w exception handlerze), następnie ten adres się wyszukiwało chyba w pliku .map i miałem na 90% miejsce gdzie przed wykrzaczeniem się (mam na mysli przed wpadnięciem w exception handler a potem resecie) był wskaźnik stosu - czyli gdzie był program przed wpadnięciem w handler.

Jak to się realizowało? Tzn domyślam się ze w datasheet będzie jakiś rejestr gdzie jest wskaźnik stosu. No i :
1. Mam wskaznik stosu
2. Mam zdefiniowany exception handler
3. Odczytuje sobie wskaznik stosu w tym exception handlerze
4. I porównuje z plikiem map gdzie linijka po linijce jest opisany program z adresami

Dobrze pamiętam czy mieszam?
  • 7
@janek_kos: Jedna mała uwaga, LR w ARM to po prostu rejestr zawierający adres powrotu do poprzedniej funkcji, nie typowy program counter. Akurat w tym konkretnym przypadku program counter wskazywałby na samego HardFaulta, co jest niezbyt przydatne. Na szczęście, ARM traktuje wywołanie HardFaulta jako zwykłe wywołanie funkcji i dlatego ustawia LR.

Poza tym, nie musisz mieć pliku map, tool o nazwie zwykle addr2line daje radę.
@janek_kos: Raczej nie plik .map (w map masz tylko początki funkcji, ostatnia wykonywana instrukcja może być w "środku" funkcji), na Coretx-M exceptiony mają te same właściwości jak przerwania. Więc jak na cortexie-m0 wyskoczy hardfault, to jak odczytasz co jest pod adresem stack pointer + 0x18 to będzie to adres ostatnio wykonywanej instrukcji:

https://developer.arm.com/documentation/dui0497/a/the-cortex-m0-processor/exception-model/exception-entry-and-return
@groman43: przy wejściu do przerwania/exception na cortexach-m ustawiany jest LR, ale nie wskazuje on na ostatnio wykonywaną instrukcję, tylko na specjalny kod, żeby przy napotkaniu instrukcji powrotu procesor wiedział że wraca z przerwania i odpowiednio wyczyścił stos. Ten specjalny kod który będzie w LR w momencie wykonywania hardfaulta to na przykład "0xFFFFFFF9".