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

Problem z avrstudio (debug)

planum 29 Lip 2008 14:24 2354 9
REKLAMA
  • #1 5388721
    planum
    Poziom 11  
    Witam,

    Mam taki mały problem z debug.
    Napisałem program w c :
    
    #include <avr\io.h>
    
    unsigned long pczekaj=100;
    
    void czekaj(unsigned long pt)
    {
    unsigned char tp1;
    for(;pt>0;pt--)
    {
    for(tp1=255;tp1!=0;tp1--);
    }
    }
    
    
    int main(void)
    {
    unsigned char ledy,i,licznik;
    
    DDRB=0xff;
    while(1)
    {
    for(licznik=0;licznik<10;licznik++)
    {
    PORTB=0xff;
    czekaj(pczekaj);
    for(i=0;i<8;i++)
    {
    PORTB=i;
    czekaj(pczekaj);
    }
    }
    }
    return 0;
    }
    


    Wszystko ładnie się kompiluje . W debug wciskając klawisz F11 symulator pomija funkcje czekaj (nie wykonuje jej) i przechodzi do następnej linijki . Dlaczego tak się dzieje?
  • REKLAMA
  • #2 5388737
    snow
    Poziom 31  
    planum napisał:
    void czekaj(unsigned long pt)
    {
    unsigned char tp1;
    for(tu_chyba_czegoś_brakuje;pt>0;pt--)
    {
    for(tp1=255;tp1!=0;tp1--);
    }
    }
    [/code]
  • REKLAMA
  • #3 5388768
    planum
    Poziom 11  
    nic tam nie brakuje jak daje build F7 nie ma błędów
  • #4 5388798
    markosik20
    Poziom 33  
    Wyłącz optymalizację , podglądnij w ASM czy wykonuje się ta funkcja lub postaw tam breakpointa. Zdarza się że takie pętle które nic nie wnoszą do programu mogą być omijane w symulatorze (lub po prostu "liczone" w locie).
  • REKLAMA
  • #5 5388805
    BoskiDialer
    Poziom 34  
    Jeśli masz załączoną optymalizację, prawie pewnym jest, że funkcja zostanie zoptymalizowana (czytaj: usunięta, gdyż nic nie wykonuje) a wywołanie czekaj() rozwinięte w miejscu, czyli nic nie zostanie. Masz co najmniej dwie możliwości: skorzystać z funkcji oczekiwania zawartych w <util/delay.h> (funkcje _delay_ms i _delay_us) lub wymusić, aby nie optymalizował pętli: do ciała drugiej pętli dać do wykonywania: asm volatile(""::);
  • #6 5388885
    planum
    Poziom 11  
    podejrzałem jako asembler i ta funkcja dla debug nie istnieje.

    Napisałem cos takiego:

    
    #include <avr\io.h>
    
    
    int cz(int a)
    {
    PORTB=a;
    return 0;
    }
    
    int main(void)
    {
    
    DDRB=0xff;
    PORTB=0xff;
    
    while(1)
    {
    cz(54);
    }
    return 0;
    } 
    


    i też funkcji cz nie widzi . Jak należy programować aby funkcje były widzialne .
  • REKLAMA
  • #7 5388900
    BoskiDialer
    Poziom 34  
    Nie widzi funkcji, czy jest ona rozwijana w miejscu? Wklej to co wyrzuca asembler.
  • #8 5388915
    planum
    Poziom 11  
    
    00000000: cz
    +00000000:   940C002A    JMP     0x0000002A       Jump
    +00000002:   940C0047    JMP     0x00000047       Jump
    +00000004:   940C0047    JMP     0x00000047       Jump
    +00000006:   940C0047    JMP     0x00000047       Jump
    +00000008:   940C0047    JMP     0x00000047       Jump
    +0000000A:   940C0047    JMP     0x00000047       Jump
    +0000000C:   940C0000    JMP     0x00000000       Jump
    +0000000E:   940C0047    JMP     0x00000047       Jump
    +00000010:   940C0047    JMP     0x00000047       Jump
    +00000012:   940C0047    JMP     0x00000047       Jump
    +00000014:   940C0047    JMP     0x00000047       Jump
    +00000016:   940C0047    JMP     0x00000047       Jump
    +00000018:   940C0047    JMP     0x00000047       Jump
    +0000001A:   940C0047    JMP     0x00000047       Jump
    +0000001C:   940C0047    JMP     0x00000047       Jump
    +0000001E:   940C0047    JMP     0x00000047       Jump
    +00000020:   940C0047    JMP     0x00000047       Jump
    +00000022:   940C0047    JMP     0x00000047       Jump
    +00000024:   940C0047    JMP     0x00000047       Jump
    +00000026:   940C0047    JMP     0x00000047       Jump
    +00000028:   940C0047    JMP     0x00000047       Jump
    +0000002A:   2411        CLR     R1               Clear Register
    +0000002B:   BE1F        OUT     0x3F,R1          Out to I/O location
    +0000002C:   E5CF        LDI     R28,0x5F         Load immediate
    +0000002D:   E0D4        LDI     R29,0x04         Load immediate
    +0000002E:   BFDE        OUT     0x3E,R29         Out to I/O location
    +0000002F:   BFCD        OUT     0x3D,R28         Out to I/O location
    +00000030:   E010        LDI     R17,0x00         Load immediate
    +00000031:   E6A0        LDI     R26,0x60         Load immediate
    +00000032:   E0B0        LDI     R27,0x00         Load immediate
    +00000033:   EAEA        LDI     R30,0xAA         Load immediate
    +00000034:   E0F0        LDI     R31,0x00         Load immediate
    +00000035:   C002        RJMP    PC+0x0003        Relative jump
    +00000036:   9005        LPM     R0,Z+            Load program memory and postincrement
    +00000037:   920D        ST      X+,R0            Store indirect and postincrement
    +00000038:   36A0        CPI     R26,0x60         Compare with immediate
    +00000039:   07B1        CPC     R27,R17          Compare with carry
    +0000003A:   F7D9        BRNE    PC-0x04          Branch if not equal
    +0000003B:   E010        LDI     R17,0x00         Load immediate
    +0000003C:   E6A0        LDI     R26,0x60         Load immediate
    +0000003D:   E0B0        LDI     R27,0x00         Load immediate
    +0000003E:   C001        RJMP    PC+0x0002        Relative jump
    +0000003F:   921D        ST      X+,R1            Store indirect and postincrement
    +00000040:   36A0        CPI     R26,0x60         Compare with immediate
    +00000041:   07B1        CPC     R27,R17          Compare with carry
    +00000042:   F7E1        BRNE    PC-0x03          Branch if not equal
    +00000043:   940E004D    CALL    0x0000004D       Call subroutine
    +00000045:   940C0053    JMP     0x00000053       Jump
    +00000047:   940C0000    JMP     0x00000000       Jump
    ---- luki1.c --------------------------------------------------------------------------------------
    5:        {
    +00000049:   BB88        OUT     0x18,R24         Out to I/O location
    8:        }
    +0000004A:   E080        LDI     R24,0x00         Load immediate
    +0000004B:   E090        LDI     R25,0x00         Load immediate
    +0000004C:   9508        RET                      Subroutine return
    @0000004D: main
    11:       {
    +0000004D:   EF8F        SER     R24              Set Register
    +0000004E:   BB87        OUT     0x17,R24         Out to I/O location
    14:       PORTB=0xff;
    +0000004F:   BB88        OUT     0x18,R24         Out to I/O location
    +00000050:   E386        LDI     R24,0x36         Load immediate
    +00000051:   BB88        OUT     0x18,R24         Out to I/O location
    +00000052:   CFFE        RJMP    PC-0x0001        Relative jump
    +00000053:   94F8        CLI                      Global Interrupt Disable
    +00000054:   CFFF        RJMP    PC-0x0000        Relative jump
    +00000055:   FFFF        ???                      Data or unknown opcode
    +00000056:   FFFF        ???                      Data or unknown opcode
    +00000057:   FFFF        ???      
    

    strzałka jest tuż za 11: {
  • #9 5388952
    BoskiDialer
    Poziom 34  
    Zapis do PORTB z funkcji wyraźnie jest rozwinięty w pętli głównej (instrukcja pod 0x51), kod więc na pewno działa poprawnie. Widać też, że nie wszystkie symbole dla debugera zostały wyeksportowane (linie 5,8,11 i 14), co stanowi problem. Musisz wyłączyć optymalizację podczas kompilowania, inaczej z debugowania nici.
  • #10 5388988
    planum
    Poziom 11  
    działa przy kompilacji zamast -Os dałem samo -s i teraz widzi funkcje
REKLAMA