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

Błędy kompilacji w WinAVR przy użyciu makra sbi w C++

mozamoza 03 Paź 2006 19:36 1645 7
REKLAMA
  • #1 3082003
    mozamoza
    Poziom 10  
    Posty: 16
    mam taki program w C++:
    
    #include <avr/io.h>
    
    #define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1)
    
     
    
    int main (void) 
    
    {
    
    LED_ON;
    
       
    
        for (;;) 
    
       {
    
       
    
       }
    
     
    
        return (0);     
    
    }

    po kolmilacji w Programmers notepad 2 (WinAVR) poprzez MakeAll
    pojawiają się błedy:
    Cytat:

    > "make.exe" all
    avr-gcc -g -Wall -O2 -mmcu=atmega8 -c -o led.o led.c
    led.c: In function `main':
    led.c:11: warning: implicit declaration of function `sbi'
    led.c:27:2: warning: no newline at end of file
    avr-gcc -g -Wall -O2 -mmcu=atmega8 -Wl,-Map,led.map -o led.elf led.o
    led.o: In function `main':
    C:\Documents and Settings\norbert\Pulpit\led/led.c:11: undefined reference to `sbi'
    C:\Documents and Settings\norbert\Pulpit\led/led.c:11: undefined reference to `sbi'
    make.exe: *** [led.elf] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:00

    a jak kod jest bez instrukcji
    Cytat:
    LED_ON;

    to kompiluje się bez problemu
    why?[/code]
  • REKLAMA
  • #2 3082299
    gilong
    Poziom 18  
    Posty: 344
    Pomógł: 7
    Ocena: 20
    zamiast #define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1) wstaw #define LED_ON DDRB |= _BV(PB1);PORTB |= _BV(PB1);
  • REKLAMA
  • #3 3082326
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    Problem jest w tym, iż używasz nowej biblioteki avr-libc, która nie posiada już funkcji sbi i cbi. Funkcje te (a w zasadzie makra) były dostępne w poprzednich wersjach (chyba do 1.2, ale nie jestem pewien). Później zostały usunięte. Zajrzyj do pdf'a avr-libc czym te funkcje zastąpić.

    pozdrawiam, JnS
  • REKLAMA
  • #5 3082936
    micha3
    Poziom 12  
    Posty: 24
    Pomógł: 2
    Ocena: 1
    Ja dodam jeszcze od siebie: gcc wymaga aby każdy plik zakończony był pustą linią, czyli enter i żadnych dodatkowych znaków( spacja, tab)
  • #6 3084193
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Jj_Johnys napisał:
    Problem jest w tym, iż używasz nowej biblioteki avr-libc, która nie posiada już funkcji sbi i cbi. Funkcje te (a w zasadzie makra) były dostępne w poprzednich wersjach (chyba do 1.2, ale nie jestem pewien). Później zostały usunięte. Zajrzyj do pdf'a avr-libc czym te funkcje zastąpić.

    pozdrawiam, JnS

    Masz rację , a jednocześnie jej nie masz ;)
    Jeśli chcemy używać sbi,cbi,inp,outp lub mamy kod , w którym występują te makra , wystarczy dodać #include <compat/deprecated.h> i po krzyku :) Pisząc kod od nowa , raczej unikajmy tych makr :(

    Piotrek
  • #7 3085612
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    Cóż, człowiek uczy się całe życie :)
  • REKLAMA
  • #8 3139982
    danlancher
    Poziom 27  
    Posty: 1195
    Pomógł: 13
    Ocena: 47
    Heh, mam identyczny problem.

    Wiec mam zrobic tak,jak mowi nl555 czy gilong??

Podsumowanie tematu

✨ Problem kompilacji w WinAVR przy użyciu makra sbi wynika z faktu, że nowsze wersje biblioteki avr-libc usunęły makra sbi i cbi, które były dostępne w starszych wersjach. W efekcie kod zawierający sbi(DDRB, PB1); sbi(PORTB, PB1); generuje błędy podczas kompilacji. Rozwiązaniem jest zastąpienie makr sbi i cbi bezpośrednimi operacjami bitowymi, np. DDRB |= _BV(PB1); PORTB |= _BV(PB1); lub dołączenie nagłówka , który przywraca te makra. Dodatkowo, makro LED_ON powinno być zdefiniowane jako funkcja makro z nawiasami i blokiem instrukcji, np. #define LED_ON() { ... }, aby uniknąć problemów składniowych. Warto także pamiętać, że pliki źródłowe w gcc powinny kończyć się pustą linią bez dodatkowych znaków.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA