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

Debugowanie rejestrów i kodu krok po kroku w Atmel Studio 6.2

maczar 18 Lut 2015 08:40 1197 4
REKLAMA
  • #1 14450663
    maczar
    Poziom 14  
    Posty: 90
    Pomógł: 5
    Ocena: 27
    Czy można w Atmel studio ustawić watch na rejestr konfiguracyjny ?
    Np. chciałbym podejrzeć zawartość TCC0.CNT, i/lub ustawić brakepoint condition na TCC0.CNT=0xff.

    Drugie pytanie - czy można debugować kod krok po kroku z częstotliwością taktów zegara ?
  • REKLAMA
  • #2 14450688
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    Podgląd rejestrów IO masz w IO View, wystarczy sobie włączyć i nie trzeba używać watch. Pamiętaj też, że rejestry IO występują w przestrzeni adresowej MCU, więc jeśli w watch włączysz podgląd komórki pamięci to zobaczysz ich zawartość. Sądząc z formatu piszesz dla XMEGA, ponieważ dla tego MCU IO są zdefiniowane w postaci struktur, więc wpisanie w watch np. TCC0.CNT jest poprawne i powinno wyświetlić zawartość tego pola struktury.
    Breakpoint możesz oczywiście ustawić z warunkiem, robisz w tym celu zwykłego warunkowego breakpointa dla adresu pamięci.
    Co do debugowania step by step z częstotliwością zegara to jest to niemożliwe - żaden interfejs nie przesłałby danych z wymaganą częstotliwością. Jeśli z jakiegoś powodu jest to niezbędne to można odpalić symulator i włączyć logowanie wybranych rejestrów - np. konfigurując plik stymulacji dla debugera. Robienie trace w czasie rzeczywistym na hardware wymaga odpowiedniego wsparcia ze strony MCU - AVR8 go nie mają, mają taką możliwość niektóre modele ARM.
  • REKLAMA
  • #3 14450708
    maczar
    Poziom 14  
    Posty: 90
    Pomógł: 5
    Ocena: 27
    Niestety bezpośrednie wpisanie nazwy rejestru np RTC.CNT nie działa (Left of dot operand is an undefined composite object)

    Działa natomiast wpisanie wartości (*(RTC_t *) 0x0400) (czyli definicja makra RTC)

    Ale nie można w ten sposób odwołać się do rejestru np. PMIC_CTRL gdyż jego definicja wskazuje na _SFR_MEM8(0x00A2)

    Co do taktowania - chodzi mi o pracę krokową - czyli tak jak step into/out ale co jeden takt a nie co jedną instrukcję.
  • REKLAMA
  • #4 14450752
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    To zamiast RTC.CNT wpisz tylko RTC, wtedy pojawi ci się znacznik, że jest to struktura (taki plusik) i będziesz mógł ją rozwinąć, obserwując wartości jej pól. Niewykluczone, że zadziała też RTC_CNT.
    Co do pracy krokowej po jednym cyklu to się nie da, da się po jednej instrukcji (w większości przypadków w sumie po cyklu) - trzeba zrobić trace w oknie disasemblera.
  • #5 14450764
    maczar
    Poziom 14  
    Posty: 90
    Pomógł: 5
    Ocena: 27
    tmf napisał:
    To zamiast RTC.CNT wpisz tylko RTC, wtedy pojawi ci się znacznik, że jest to struktura (taki plusik) i będziesz mógł ją rozwinąć, obserwując wartości jej pól. Niewykluczone, że zadziała też RTC_CNT.


    Właśnie niestety nie działa. Zarówno wpisanie RTC, RTC_CNT czy PMIC_CTRL w oknie watch zwraca: Unknown identifier
    Potrzebuje tej funkcjonalności gdyż chciałbym zatrzymać program np. przy konkretnej wartości licznika timera.

    tmf napisał:

    Co do pracy krokowej po jednym cyklu to się nie da, da się po jednej instrukcji (w większości przypadków w sumie po cyklu) - trzeba zrobić trace w oknie disasemblera.


    Rozumiem.


    EDIT:

    Udało mi się trochę obejść problem tj. utworzyłem takie coś:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i teraz mogę podglądać zmienną *temp, ustawić brake condition itp.
REKLAMA