Jak używać punktów przerwania do debugowania

9

Punkty przerwania to świetny sposób, aby zobaczyć, jak kompilator działa w kodzie. Teraz moje pytanie brzmi: czy istnieje możliwość użycia punktów przerwania podczas debugowania kodu?

H. Pauwelyn
źródło

Odpowiedzi:

9

Jak zauważono w odpowiedzi Majenko, Arduino IDE nie zapewnia mechanizmu punktu przerwania, ale Atmel Studio obsługuje punkty przerwania . [*]

Jeśli jednak masz przełącznik i diodę LED, możesz śledzić postęp swojego programu w sposób zapewniający niektóre korzyści z punktów przerwania. Dodałbyś podprogram, powiedzmy BPReport(), że poprzez wyjście szeregowe lub wyświetlacz LCD zgłasza wartości zmiennych krytycznych, a następnie zapala diodę LED i czeka, aż przełącznik zostanie naciśnięty i zwolniony, z zaprzeczeniem. Zadzwoń do BPReport()rutyny, gdziekolwiek chcesz bezwarunkowy punkt przerwania. W przypadku warunkowych punktów przerwania możesz mieć procedurę, BPReportIf(cond)która wywołuje, BPReport()jeśli condjest to prawda. Jeśli nie chcesz wysyłać danych przez port szeregowy, możesz użyć kilku diod LED lub LCD, a możesz użyć kilku przełączników, jeśli chcesz mieć zewnętrzne sterowanie przerwaniem (na przykład condmoże to być test jednego z dodatkowych przełączników).

[*] Niektóre debuggery sprzętowe modyfikują pobrany kod za każdym razem, gdy punkty przerwania są dodawane, zmieniane lub usuwane. Takie użycie zużyje pamięć flash szybciej niż tylko od czasu do czasu jej pobieranie. Jeśli chip był intensywnie wykorzystywany do takiego debugowania, nie używaj go w systemie produkcyjnym.

James Waldby - jwpat7
źródło
4

Chociaż Majenko jego odpowiedź jest poprawna, istnieją inne opcje.

Co do prawdziwego debugowania sprzętowego, jak stwierdził majenko, powiedziałbym:

  1. Zainstaluj i używaj prawdziwego IDE, takiego jak Atmel Studio lub wtyczka arduino eclipse o nazwie sloeber (jestem autorem), i
  2. Użyj pełnego sprzętowego debugera lub sprzętu, który ma go na pokładzie, takiego jak Arduio zero, lub sprzętu używającego innej technologii debugowania, takiej jak ESP8266, która umożliwia debugowanie USB

Inną opcją debugowania z zupełnie innej kategorii jest takie uporządkowanie kodu, aby logika decyzyjna (niezależna od sprzętu) i akcja (zależna od sprzętu) były całkowicie oddzielone.

Następnie skompiluj szkic jako program lokalny i debuguj „logikę decyzyjną” na komputerze lokalnym. Ta metoda nie pozwala na „sprzętowe debugowanie”. Ta metoda umożliwia także testowanie jednostkowe.

Zauważ, że twoja lokalna maszyna jest prawdopodobnie 32 lub 64 gorzka, a większość Arduino ma 8 bitów, co spowoduje różnice w typach danych, co jest dodatkowym punktem uwagi podczas korzystania z tej metody.

jantje
źródło
4

Biblioteka Arduino-Debug zapewnia prosty debugger na miejscu dla szkiców Arduino. Polecenie debugowania jest dodawane bezpośrednio do szkicu. Powłoka polecenia debuggera jest uruchamiana w punktach przerwania i asercjach.

wprowadź opis zdjęcia tutaj

Zrzut ekranu powyżej pokazuje przykładowy szkic uruchomiony na Arduino Mega z monitorem wyjścia szeregowego używanym przez aplikację i Serial1 używanym dla powłoki debuggera.

Szkicuj polecenia debugowania

  • ASSERT (cond) Sprawdź warunek potwierdzenia. Jeśli false, wywoływana jest powłoka debugowania. Szkic nie może być kontynuowany.
  • BREAKPOINT () Wywoływana jest powłoka debugująca.
  • BREAK_IF (cond) Powłoka debugowania jest wywoływana, jeśli warunek jest spełniony.
  • CHECK_STACK (pokój) Sprawdź, czy na stosie jest miejsce (bajty). Jeśli false, wywoływana jest powłoka debugowania.
  • DEBUG_STREAM (dev) Użyj podanego urządzenia strumieniowego do sesji debugowania. Zazwyczaj szeregowy.
  • OBSERVE (wyrażenie) Wydrukuj wyrażenie do strumienia debugowania.
  • OBSERVE_IF (cond, expr) Wydrukuj wyrażenie do strumienia debugowania, jeśli warunek jest spełniony.
  • REJESTRACJA (var) Zarejestruj zmienną, aby uzyskać dostęp z powłoki debugowania. Debuguj polecenia powłoki

Debuguj polecenia powłoki

  • ZMIENNA Wydrukuj adres i wartość zmiennej.
  • @ ZMIENNA Wydrukuj adres zmiennej wskaźnika i wartość odniesienia.
  • backtrace Wydrukuj prosty stos wywołań.
  • polecenia Wydrukuj listę poleceń (patrz także pomoc).
  • dane Wydrukuj zawartość obszaru danych, tj. zmienne globalne.
  • idź Opuść powłokę debugującą i kontynuuj wykonywanie szkicu.
  • sterta Wydrukuj zawartość stosu, tj. dynamicznie przydzielone dane.
  • pomoc Wydrukuj listę poleceń.
  • pamięć Drukuj stan pamięci.
  • zamknij Zatrzymaj szkic.
  • stos Wydrukuj zawartość stosu, tj. ramki wywołania, argumenty, adresy zwrotne.
  • zmienne Wydrukuj listę zarejestrowanych zmiennych.
  • gdzie Drukuj plik kodu źródłowego i wiersz, w którym wywołano powłokę debugującą.

Wszystkie polecenia powłoki debugowania można skracać do poleceń jednoznakowych. Więcej informacji znajduje się w pliku README; szczegóły instalacji, przykładowy szkic i testy porównawcze.

Mikael Patel
źródło
1
Przekazana przez Mikael biblioteka umożliwia ustawianie warunkowych punktów przerwania, drukowanie wartości zmiennych, stanu pamięci, śledzenia połączeń oraz sprawdzanie i zmienianie zmiennych w punkcie przerwania. Pro: Nie wymaga sprzętu ($$), nie jest tak mocny we Flashu (jak ustawianie i usuwanie punktów przerwania za pomocą debugera sprzętowego). ....
JRobert,
1
.... Con: Większy wpływ na przestrzeń kodu programu, trochę pamięci RAM i ewentualnie czas pracy, jeśli sprawdzimy kod o znaczeniu krytycznym; pewna krzywa uczenia się do kompilacji (a później usunięcia) wywołań biblioteki; potrzeba przewidywania punktów przerwania lub ponownej ich kompilacji, gdy odkryjesz, gdzie ich potrzebujesz. Wady nie są krytyką pracy Mikaela; pochodzą z tą techniką.
JRobert,
1
@JRobert Nice Podsumowanie Pro-Con! Próbowałem rozwiązać niektóre z wad, umożliwiając dostosowanie debugera. Istnieje zestaw definicji, które pozwolą aplikacjom wrażliwym na ślady zredukować powłokę debugowania do minimum. Jak każdy debugger dla systemów osadzonych, trudno jest debugować krytyczny (ciągły) kod czasowy za pomocą punktów przerwania. Jedyną alternatywą są punkty obserwacyjne. Można je zoptymalizować za pomocą bufora śledzenia i usunąć szeregowe dane wyjściowe w kodzie krytycznym czasowo.
Mikael Patel,
3

Nie w Arduino IDE.

Musisz:

  1. Zainstaluj i używaj prawdziwego IDE, takiego jak Atmel Studio i
  2. Użyj pełnego debuggera sprzętowego

Nie ma możliwości debugowania przez interfejs UART / USB za pomocą programu ładującego.

Majenko
źródło