logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR32 Studio - debugowanie

ROMan9 17 Lis 2010 13:08 1467 3
REKLAMA
  • #1 8754609
    ROMan9
    Poziom 10  
    Witam,
    zwracam się do szanownych Koleżanek i Kolegów z prośbą o pomoc.
    Próbuję uruchomić w środowisku AVR32 Studio przykładowy program na modelu z procesorem AVR32UC3A1512. W czasie wykonywania pracy krokowej w trybie debugowania, kiedy ustawię breakpointa na wejściu do procedury, program się zatrzymuje ale po wykonaniu jednego kroku (niezależnie od włączonej opcji I) program zamiast do następnej instrukcji wchodzi w obsługę przerwania (widocznie takie się pojawiło). Gdy wyjdę z procedury przerwaniowej i próbuję znowu wykonać krok do następnej instrukcji w procedurze, którą uruchamiam - program znowu wchodzi w przerwanie, co uniemożliwia normalne debugowanie określonej procedury. Czy w tym środowisku AVR32 Studio istnieje możliwość "znieczulenia" się na przerwania i normalnego debugowania zwykłej procedury krok po kroku ?
  • REKLAMA
  • #2 8754734
    szelus
    Poziom 34  
    Akurat nie debugowałem nigdy pod AVR32 Studio, ale nie da się, jak już staniesz w breakpoincie, zmienić zawartości rejestru i wyłączyć flagi zezwolenia na obsługę przerwań?
  • REKLAMA
  • #3 8755803
    ROMan9
    Poziom 10  
    Dziękuję bardzo za odpowiedź.
    To jest dobra myśl (choć liczyłem, że w AVR32 Studio wersja 2.5.0 jest jakiś lepszy sposób). Niestety choć w oknie AVR32 Registers (w grupie System registers) jest rejestr SR dokładnym opisem (bit 16 GM) to jednak po zatrzymaniu programu na breakpoincie nie potrafię zmienić stanu tego rejestru (ani prawym klawiszem, ani dwukrotne klikanie lewym nie wywołuje żadnej akcji).
    Może Ktoś wie gdzie są prezentowane stany rejestrów podstawowych R0..R12,SP,PC,LR procesora z rodziny AT32UC3 ?

    Dodano po 57 [minuty]:

    Częściowo znalazłem odpowiedź na "dręczące mnie pytania". Sporo można zdziałać w oknie "Console".
    W oknie konsoli można pisać różne komendy, których najszerszą listę można wyświetlić komendą "help all" (jest ich naprawdę dużo).
    Rejestry bazowe procesora można wyświetlić komendą "regs". W oknie konsoli wyświetla się wtedy:

    pc: 80004d2e lr: 80002074 sp: 0000fff8 r12: 00010000
    r11: 00000000 r10: 00000000 r9: 0000000c r8: ffffffff
    r7: 0000fff8 r6: 00000000 r5: 00000000 r4: 00000000
    r3: 00000000 r2: 00000000 r1: 00000000 r0: 00000000


    Można również użyć komendy "info registers":
    r0 0x0 0
    r1 0x0 0
    r2 0x0 0
    r3 0x0 0
    r4 0x0 0
    r5 0x0 0
    r6 0x0 0
    r7 0xfff8 65528
    r8 0xffffffff -1
    r9 0xc 12
    r10 0x0 0
    r11 0x0 0
    r12 0x10000 65536
    sp 0xfff8 65528
    lr 0x80002074 -2147475340
    pc 0x80004d2e -2147463890

    Zmienić stan rejestru bazowego "r0" na wartość 0x01 można za pomocą komendy "set $r0=0x1".

    Nie wiem jeszcze jak się dobrać do rejestru "SR" i zablokować przerwania, ale popróbuję.

    Dodano po 36 [minuty]:

    No i udało się !
    Trzeba użyć komendy "show sysreg 0". Wyświetli się odpowiedź z GDB":
    SYSREG[0] = 0x400000 (wartość rejestru jest oczywiście przykładowa).
    Liczba "0' w komendzie jest adresem rejestru SR (Table 9-3 page 27 "doc32058.pdf 11/09")
    Następnie należy ustawić nową wartość bitu GM w rejestrze SR za pomocą komendy (gdy tylko program stanie na procedurze, którą chcemy debugować):
    "set sysreg 0=0x00410000"
    Sprawdziłem, że teraz można prześledzić dowolny fragment programu, bez "zmagania się z przerywaniami".
    Pamiętać trzeba jednak, aby:
    - po zakończeniu pracy krokowej (przed uruchomieniem dalszej części kodu) wpisać 0 dla bitu GM w rejestrze SR (jeżeli przerwania mają być odblokowane)
    - trzeba zwrócić uwagę czy w uruchamianej procedurze przerwania nie są odblokowywane bo wtedy problem z "dobijającymi się przerwaniami" powróci

    Dodano po 3 [minuty]:

    Tak swoją drogą, nie wiem do czego służy okno "AVR32 Registers" ? Bo prezentowana tam wartość rejestru SR jest cały czas 0x0, co nie jest zgodne z prawdą. A rejestrów bazowych r0..r12.. wcale nie znajduję.

    Dodano po 1 [godziny] 33 [minuty]:

    Z blokowaniem przerwań jednak jakiś problem jest nadal bo przy pracy krokowej po instrukcjach C przerwania "same się odblokowują" ale nie wiem dla czego.
  • #4 8772823
    ROMan9
    Poziom 10  
    Program wszedł w procedury FreeRTOS-a i tam wykonał portENABLE_INTERRUPTS() i przerwania zostały odblokowane. Trzeba na to uważać.
REKLAMA