Jak to zwykle bywa są też problemy z debugerem, ale nie jest to aż takie tragiczne jak się wydaje
tak więc będziemy kontynuować to zagadnienie gdyż temat jest ciekawy, ale może wprowadzić pewnego
rodzaju frustracje że coś jest nie tak , wiesza się lub nie działa dobrze:)
Na początek parę ostrzeżeń i uwag jeśli chodzi o użytkowanie debugera w eclipse:
#RESTARTSłuży do tego celu mały przycisk na pasku narzędzi, który wygląda tak
Jest ładny i poręczny , ale
UWAGA !! nie działa on z avr-gdb.
Wciśnięcie go spowoduje zakończenie sesji debugera z komunikatem o błędzie.
Spowodowane jest to że w tle Eclipse wysyła "
-exec-run" do avr-gdb, a w efekcie tego avrdude
"
zabija" gdbserwer i pokazuje komunikat o błedzie "
Don't know how to run."
oczywiście ten problem jak i większość można obejść ponieważ kolejna przewaga Eclipse nad innymi środowiskami jest jego niesamowita wręcz elastyczność. Oto jak to można zrobić:
Musimy wykonać miękki reset (Soft reset), w tym celu ustawiamy punkt przerwania (breakpoint)
w np. main() lub innej funkcji, w której chcemy zatrzymać wykonywanie operacji na rejestrach widocznych
w PC który musimy ustawić na 0. (PC= Program Counter).
Teraz wykonać musimy wznowienie programu "RESUME"
cała ta operacja spowoduje że procesor wznowi wykonywanie programu pod adresem 0x0000, jest to miejsce wektora RESETU dla wszystkich procesorów AVR bez wyjątku.
Nie jest to jednak RESET taki jak byśmy chcieli gdyż musimy pamiętać żeby wejść i wyjść z kontroli rejestrów
bo inaczej pozostaną one na poprzednim stanie.
# Breakpointy i watchpointy w Avarice Tu trzeba pamiętać, że procesory AVR w trybie JTAG maja tylko BACZNOŚĆ !! 3 dostępne pułapki sprzetowe,
z których dwie mogą być zamieniane na "watchpointy" pamięci.
W trybie debugWIRE nie są obsługiwane sprzętowe breakpointy i watchpointy przez AVR:(
AVaRICE ma na szczęście możliwość z korzystania z tak zwanych miękkich punktów przerwania (soft breakpoints), są to specjalne instrukcje zapisane w pamięci flash pod wymaganym adresem przerwania.
Gdy program natrafi na taki punkt zostaje zapisana oryginalna zawartość strony we flash ponownie.
Czyli każdy SBP powoduje co najmniej 2 cykle zapisu pamięci flash. Co ciekawe pomimo tego że w AVR ilość
cykli zapisu do pamięci flash jest zwykle sporo większa od gwarantowanych przez producenta 1.000 cykli (dla starszych procków) należy o tym jednak pamiętać podczas pracy z debugerem i wieloma punktami SBP.
Soft watchpoints w SRAM są również obsługiwane przez AVaRICE, ale (no tak zaś mam jakieś
) znacząco spowalniają działanie debugera ponieważ nasze drogie AVaRICE musi wykonywać każdą instrukcje w
pojedynczych krokach i sprawdzić po wykonaniu pamięć SRAM. Dlatego trzeba pamiętać, że oglądanie 16-bitowych wartości np: wskaźnika, wykorzystuje 2 watchpointy, po jednym dla każdego bajta.
dlatego myślę że taki mój mały pomysł aby oglądać tylko 1 bajt 16 bitowej wartości - wykorzysta nam tylko jeden watchpoint
i na tym 1 bajcie oglądać zmiany.
# Kilka słów o architekturze AVR --> na tym etapie to konieczne Jak wiecie procesory AVR maja architekturę Harvardzką co oznacza w uproszczeniu oddzielny kod i przestrzenie adresowe.
Aby odróżnić adres danych 0(SRAM) od adresu kodu 0(FLASH) debuger dodaje 0x800000 do wszystkich adresów danych.
Miejcie to na UWADZE przy rozpatrywaniu wskaźników pamięci FLASH (np wskaźniki łańcuchów).
Na domiar tego jeszcze bardziej skomplikowana jest w AVR przestrzeń kodowa 16-bitowego słowa i przestrzeni danych 8-bitowych.
Ale na szczęście avr-gdb używa tylko 1 bajtowych adresów więc wszystkie adresy w przestrzeni kodu pokazane przez debuger należy podzielić
przez 2, aby uzyskać faktyczny adres używany przez procesor.
#PRZYKŁADMamy zrzut pamięci pod adresem 0x0000 (wektor reset) , widzimy adres <0C 94 6D 00>. W składni AVR <0C 94>
jest to kod dla skoku <tjmp> i <6D 00> co zawiera zakodowany adres skoku. Jeśli zdeasemblujemy część
z avr-gdb wyjdzie nam <tjmp 0xDa> = skok do adresu 0x00da, jeśli wiec wykonamy ten skok w debugerze to w avr-gdb bajtowy adres będzie
0x00da (binarnie 11011010). Jeśli tą wartość podzielimy przez 2 otrzymamy
0x006d (binarnie 01101101) i ten właśnie adres widzi procesor
Mam nadzieje że ten opis jest dla was przejrzysty tak to widzi avr-gdb i jest to zgodne z jego adresacją.
Wiem że może to być początkowo problemem jeśli w deasemblacji będziecie robić porównanie adresów do zrzutu pamięci ,
i może być mylące , ale trzeba się tego nauczyć i przyzwyczaić inaczej praca z Debugerem
niema najmniejszego sensu.
Należy również pamiętać, że pierwsza część przestrzeni adresowej danych jest używana do przechowywania
map rejestrów CPU i I/O oraz do kontroli rejestrów. Natomiast rzeczywista pamieć SRAM zaczyna się za
rejestrami I/O i wielkość bloków rejestrów I/O zależy od modelu procesora.
--------------------------------------------------------------------------------------------------------------
Tak wprowadziłem trochę zamętu i zamieszania , wielu się przerazi zapewne
i zapomni o debugowaniu:) , ale wierzcie mi bez tej wiedzy to od razu lepiej
sprzedajcie JTAGI bo to tak jakby dać zegarek komuś , kto nie umie go nakręcić
Ale to nie koniec straszenia
---------------------------------------------------------------------------------------------------------------
#Rozwiązywanie problemów z debugeremJeśli masz problemy z debugerem w Eclipse to tu zamieszczę kilka porad jak sobie z tym poradzić
i uruchomić aplikacje debugera.
Pierwszy przełacznik w konsoli "verbose" na na stronie z konfiguracji debugera można równie dobrze sobie włączyć debugowanie na
wyjściu serwera GDB. Wystarczy dodać kilka odpowiednich argumentów do wiersza poleceń :
--- dla AVaRICE: "-D" lub "-debug"
--- dla simulAVR: "G" lub "-gdb-debug"
I następnie można rozpocząć debugowanie.
poniżej przykładowa lista wejść avr-gdb dla prawidłowej sesji debugera:
Krótka instrukcja jak to czytać
Wszystko co zaczyna się nowym numerem sekwencji jest komenda wysyłaną przez Debuger Eclipse
do avr-gdb.
Wszystko co sie zaczyna od litery lub '^', '&', '~' i '*' jest odpowiedzią generowana przez avr-gdb.
Wszystko inne to śmieci (non-verbose) z wyjścia avr-gdb , który jest dosyć gadatliwy
Od początku sesji do momentu trafienia na przerwanie (breakpoint) w funkcji main ()
język div
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Pojedynczy krok "Step over 'w źródle C
język div
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Otwarcie widoku Deasemblacji
język div
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ustawienie nowego Breakpointa
język div
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Uruchomienie programu do następnego Breakpointa
język div
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
>>> Analiza wyjścia debugera avr-gdb.
Należy o tym pamiętać bo jest to bardzo ważne !!!-->> wszystkie 3 zaangażowane części (eclipse, avr-gdb i gdbserver) należy zawsze uruchamiać asynchronicznie, a
-->> avr-gdb będzie chętnie nadal działał nawet jeśli gdbserwer się zawiesił
ważne zatem jest, aby przewinąć sobie wyjście avr-gdb trochę do góry, aby znaleźć prawdziwą przyczynę
awarii. Koniec dziennika zwykle NIE jest przyczyną problemu:)
Jeśli nie jesteście zaznajomieni z poleceniami gdb to warto poszukać instrukcji do GDB zwłaszcza rozdziału o interfejsie GDB/Mi.
O to kilka fragmentów wyjścia z avr-gdb z typowymi problemami:
--->>Could not connect...
język div
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ten komunikat jest wyświetlany, gdy avr-gdb nie może połączyć się z gdbserver. Sprawdź, gdbserver (AVarice lub simulavr)
czy jest uruchomiony i że numery portów są takie same. Zauważ, że nawet z tym błedem Eclipse i avr-gdb będzie
kontynuować sesję debugowania. ale otrzymasz wiadomość że "program nie jest uruchomiony":)
--->>Don't know how to run
język div
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No przecież pisałem żeby nie naciskać tego przycisku:
No błędów różnych może się nam pojawić wiele , a ja nie jestem w stanie wszystkich opisać
jak będą jakieś nie wymienione piszcie , postaram się pomóc ich pozbyć jak też im zaradzić i wyjaśnić czego dotyczą.
miłej lektury