Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[avr] - Nieznany typ uint_farptr_t w pliku pgmspace.h

martint 06 Mar 2015 18:45 828 6
  • #1 06 Mar 2015 18:45
    martint
    Poziom 8  

    Witam serdecznie użytkowników forum. Jestem początkującym pasjonatem mikrokontrolerów AVR. Przy próbie wykonywania ćwiczeń z jednej z popularnych książek na ten temat natrafiłem na problem, którego nie umiem przeskoczyć... Chciałem obsłużyć sobie standardowo wyświetlacz LCD na sterowniku HD44780. Zgodnie z kodami źródłowymi wkleiłem takie nagłówki:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    problem rodzi się przy kompilacji. Wyskakują mi błędy związane z plikiem pgmspace.h

    Cytat:

    /usr/lib/avr/include/avr/pgmspace.h|1067|error: unknown type name ‘uint_farptr_t’


    Wskazana linijka we wskazanym pliku wygląda tak:

    Cytat:

    extern size_t strlen_PF (uint_farptr_t src) __ATTR_CONST__; /* program memory can't change */


    W sieci wyczytałem że chodzi o to, że nieznany jest typ uint_farptr_t.
    Wyczytałem również, że definicja tego typu znajduje się w pliku inttypes.h więc dodałem go do sekcji #include. We wspomnianym pliku faktycznie znajduje się taka deklaracja, wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Więc wychodziłoby na to, że typ powinien być znany. Jednak tak się nie dzieje, wciąż wyskakuje ten sam błąd. Przekopałem wujka google ale mimo to nie podał mi sensownej odpowiedzi... Czy ktoś spotkał się z podobnym błędem ?

    Specyfikacja maszyny:
    system Linuks Ubuntu 14.04, zainstalowane wszystkie avr-libc i inne potrzebne biblioteki, kompilacji dokonuję w Code::Blocks przez avr-gcc.

    Proszę o pomoc,
    Pozdrawiam !

    0 6
  • #2 06 Mar 2015 20:28
    ReprezentantWschodu
    Poziom 9  

    Wstaw pełny kod, bo na podstawie wybranych wycinków kodu, ciężko powiedzieć, gdzie może leżeć powód niekompilowania programu.

    0
  • #3 07 Mar 2015 11:43
    Andrzej__S
    Poziom 28  

    Istnieje możliwość, że jest dołączany niewłaściwy plik <inttypes.h>, przed dołączeniem tego właściwego. Wtedy warunek #ifndef __INTTYPES_H_ nie pozwoli na zdefiniowanie typu uint_farptr_t. W tym poście masz opisane, jak to sprawdzić.

    0
  • #4 07 Mar 2015 14:34
    martint
    Poziom 8  

    @ReprezentantWschodu
    Nie mam co wstawiać bo na potrzeby rozwiązania tego problemu stworzyłem banalny plik, który ma tylko funkcję main, dyrektywy include oraz pętlę nieskończoną, tyle.

    @Andrzej__S
    Rzeczywiście coś w tym może być, bo mam dwa pliki inttypes.h . Ten drugi znajduje się jednak w nieco dziwnej lokalizacji bo w katalogu /usr/include . Przekopiowałem go do katalogu avr, skompilowałem ale jednak błąd jest wciąż ten sam ... Nie do końca rozumiem o co chodzi z tą warunkową kompilacją. Dodałem na początku tego nowo znalezionego pliku #error "używam tego pliku" i rzeczywiście taki log dostaję przy kompilacji, więc ten plik jest includowany, ten poprzedni, o którym pisałem - nie.

    @edit
    tyle że ta definicja typu uint_farptr_t znajduje się w tym pierwszym pliku ... Widocznie go nie includuje mój program, pytanie dlaczego ...

    0
  • #5 07 Mar 2015 16:03
    Andrzej__S
    Poziom 28  

    martint napisał:
    tyle że ta definicja typu uint_farptr_t znajduje się w tym pierwszym pliku ...

    No i właśnie w tym pliku miałeś dodać tę linijkę #error it is used. Jeśli wtedy podczas kompilacji nie otrzymasz błędu, to znaczy, że ten plik nie jest includowany.

    martint napisał:
    Wyczytałem również, że definicja tego typu znajduje się w pliku inttypes.h więc dodałem go do sekcji #include

    Nawet jeśli dodasz ten właściwy plik "inttypes.h", a wcześniej już został dołączony ten niewłaściwy plik, to dyrektywa preprocesora #ifndef __INTTYPES_H_ nie pozwoli na dołączenie definicji typu typedef uint32_t uint_farptr_t, bo __INTTYPES_H_ jest już zdefiniowane w tym niewłaściwym, wcześniej dołączonym pliku. To takie zabezpieczenie przed wielokrotnym includowaniem tego samego pliku, aby uniknąć błędów kompilacji.

    martint napisał:
    Widocznie go nie includuje mój program, pytanie dlaczego ...

    Nie znam środowiska, w którym programujesz, ale to kwestia ustawień kompilatora, gdzie ma szukać w pierwszej kolejności plików nagłówkowych (tych w nawiasach <>).

    P.S. Na próbę można przed linijką #include <avr/pgmspace.h> dodać linijkę:
    #include "/tutaj/sciezka/bezwzgledna/do/pliku/inttypes.h"
    w którym jest definicja typu uint_farptr_t
    NIE JEST TO rozwiązanie problemu, ale coś wyjaśni.

    0
  • Pomocny post
    #6 07 Mar 2015 16:07
    szelus
    Specjalista - Mikrokontrolery

    Przekopiowanie z /usr/include jest kompletnie bez sensu. To jest plik inttypes.h dla kompilatora budującego programy na twój system (Ubuntu) i procesor (x86). Kompilator dla każdej architektury ma swój zestaw plików include.
    Skąd masz makefile? Wygenerowany przez CodeBlocks?
    edit:
    Specjalnie zainstalowałem CodeBlocks. U mnie też źle to działa, tzn CodeBlocks wywołuje kompilator ze złymi ustawieniami (opcja -I) w efekcie kompilator szuka plików include nie tam, gdzie powinien. Na szybko nie widzę, gdzie to można zmienić... ale jeszcze popatrzę...

    edit:
    1. Wejdź w CodeBlocks w Settings->Compiler
    2. Wybierz "GNU AVR GCC Compiler" u góry
    3. W zakładce "Search Directories->Compiler" usuń "/usr/include"
    4. W zakładce "Search Directories->Linker" usuń "/usr/lib"

    2
  • #7 07 Mar 2015 19:52
    martint
    Poziom 8  

    @szelus
    DZIĘKUJĘ ZA POMOC I ZAANGAŻOWANIE.
    Rzeczywiście wystarczyło usunąć te linijki w opcjach kompilatora oraz linkera, o których mówisz. Temat rozwiązany, pozdrawiam !

    0