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

Problem z funkcja static C WinAVR

darek1632 27 Sie 2009 13:37 2854 6
  • #1 6949599
    darek1632
    Poziom 15  
    Witam, chciałem uporządkować kod i podzieliłem go na pliki main.c soft_uart.c soft_uart.h. Funkcje zdeklarowałem w pliku "h" a zdefiniowałem je w pliku "c" jednakże mam problem bo jedna funkcję
     static void initSoftwareUart(void);
    kompilator wyrzuca jako
     undefined reference to `initSoftwareUart' 
    Pozotałe funkcje void...(void) kompilują sie bez problemu. Natomiast jeśli wrzucę funkcję
     static void initSoftwareUart(void);
    do pliku main.c kompiluje się bez problemu. Czy musi ona być w pliku main ?? Czy jest jakiś sposób na umieszczenie jej w pliku soft_uart.c ??
    Pozdrawiam
  • Pomocny post
    #2 6949624
    BoskiDialer
    Poziom 34  
    Obiekty oznaczone jako static są widoczne tylko w obrębie lokalnego modułu. Nie można eksportować funkcji statycznych tak samo jak nie można modyfikować zmiennych const. Jeśli funkcja ma być eksportowana, musisz zrezygnować ze static.
  • #3 6949759
    flapo213
    Poziom 21  
    Witaj. Problem Twój siedzi w makefilu nie dodałeś pozostałych plików *.c. Dodaj to w makefile kreatorze i po ptakach ewentualnie jak wiesz co i jak w makefile to będziesz wiedział gdzie to dodać .

    Pozdrawiam
  • #4 6949760
    darek1632
    Poziom 15  
    Mam jeszcze jedno pytanie czy przerwania też trzeba deklarować w pliku "h" ?? tak jak np.
    #pragma vector = PCINT1_vect
    __interrupt void PCINT1_ISR(void);
    tylko , że mój kompilator tego nie łyka

    Dodano po 2 [minuty]:

    flapo213 gdybym nie dodał *.c w Makefilu pozostałe funkcje by sie nie kompilowały.
  • #5 6950059
    loocasm
    Poziom 15  
    Nie wiem jak to jest z funkcjami static, ale static inline mogą być zdefiniowane w innym pliku (muszą być w *.h). Mogą wtedy być wywoływane np. w obsłudze przerwania, zdefiniowanej w pliku *.c, w którym jest też main().
  • #6 6950103
    BoskiDialer
    Poziom 34  
    loocasm: funkcje static inline w nagłówku owszem mogą być, aczkolwiek nie powinno się tego stosować zbyt często - jeśli funkcja jest długa i nigdy nie została by wstawiona inline przez kompilator, to zostanie ona skompilowana w każdym module w którym jest używana z osobna - wynika to z tego, że kompilator ignoruje wtedy inline, po wstawieniu nagłówków do plików .c każdy plik posiada wtedy osobną kopię, każda zostaje skompilowana, nie występuje konflikt nazw (zastosowanie static). Zużycie pamięci rośnie niepotrzebnie. Spotykane są natomiast funkcje static z atrybutem always_inline - tak jest w przypadku funkcji z delay.h.

    Co do przerwań - nie trzeba ich deklarować w pliku "h". Aby ich uzyć należy dołączyć chyba avr/interrupt.h, potem definiować funkcje jako ISR(przerwanie_vect) { ... }
  • #7 6950124
    loocasm
    Poziom 15  
    BoskiDialer dziękuję za doprecyzowanie :)
    Tak jak napisałeś, należy dołączyć interrupt.h, tam są już zdefiniowane wektory, przez co nie trzeba się tym dodatkowo zajmować.
    Nazwy wektorów, które później można wpisać jako argument ISR() można podejrzeć w pliku io***.h, gdzie *** to skrócony identyfikator procesora, np. iom128.h.
REKLAMA