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

[AVR][c] AVR studio debugger zmienne

florek_ml 03 Wrz 2009 21:19 1532 3
  • #1 6977238
    florek_ml
    Poziom 11  
    Witam ma takie pytanie jak sprawić by debugger a dokładniej podgląd wartości zmiennych podawał na bieżąco wartości zmiennych nie volatile. Poniżej prosty przykład obrazujący problem.

    #include <avr/io.h>

    volatile unsigned char t1;
    unsigned char t2;
    volatile unsigned char a;

    int main()
    {
    while(t2<20)
    {
    t1++;
    t2++;
    }
    a = t2;
    return 0;
    }
    zmienna t1 jest na bieżąco aktualizowana natomiast wartość t2 w debuggerze pojawia się dopiero po wyjściu z pętli (co utrudnia analizę programu). Czy jest jakiś sposób by to zmienić. Czy nie obędzie się bez wyłączenia optymalizacji kodu??
  • #2 6977341
    kamyczek
    Poziom 38  
    Poczytaj informacje na temat debugger-a i obsługi peryferii bo część z nich nie jest obsługiwana w symulacji programowej można za to użyć Jtaga i symulować program w mikrokontrolerze.
  • #3 6978367
    marenc
    Poziom 24  
    Witam, problem nie tkwi w programie... Po "t2++;" nie masz żadnej instrukcji więc debugger wraca na początek pętli. Strzałka podczas debugowania pokazuje kolejną instrukcję do wykonania.

    ...i właśnie dlatego uważam, że naukę powinno się zaczynać od assemblera - żeby zrozumieć istotę działania(choćby przeskoków w tym przykładzie). Możesz włączyć disassember'a i zobaczyć, że program jest prawidłowo wykonywany.

    //Może jeszcze jedna ewentualność - proces optymalizacji. Nic w pętli z tym t2 nie robisz więc jest pewne, że za pętlą będzie 20. Optymalizator myśli więc, że lepiej jest dać jedną instrukcję po pętli jako "t2 = 20;" nić w pętli zwiększać o jeden. Pętla jest natomiast ustawiana na 20 cykli zwiększania t1, gdyż do wartości t1 mogą mieć dostęp przerwania podczas działania pętli i mogą one potrzebować aktualnej wartości. Używanie t2 w przerwaniu spowoduje wystąpienie błędu.
  • #4 6978411
    Freddie Chopin
    Specjalista - Mikrokontrolery
    marenc napisał:
    Witam, problem nie tkwi w programie... Po "t2++;" nie masz żadnej instrukcji więc debugger wraca na początek pętli. Strzałka podczas debugowania pokazuje kolejną instrukcję do wykonania.

    ...i właśnie dlatego uważam, że naukę powinno się zaczynać od assemblera - żeby zrozumieć istotę działania(choćby przeskoków w tym przykładzie). Możesz włączyć disassember'a i zobaczyć, że program jest prawidłowo wykonywany.

    Bzdura

    Cytat:
    //Może jeszcze jedna ewentualność - proces optymalizacji. Nic w pętli z tym t2 nie robisz więc jest pewne, że za pętlą będzie 20. Optymalizator myśli więc, że lepiej jest dać jedną instrukcję po pętli jako "t2 = 20;" nić w pętli zwiększać o jeden. Pętla jest natomiast ustawiana na 20 cykli zwiększania t1, gdyż do wartości t1 mogą mieć dostęp przerwania podczas działania pętli i mogą one potrzebować aktualnej wartości. Używanie t2 w przerwaniu spowoduje wystąpienie błędu.

    Prawda

    4\/3!!
REKLAMA