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

[LINUX] [TOOLCHAIN] [C] - Kompilacja programów w linuxie

tombus 24 Lut 2013 13:18 5220 23
  • #1 11979515
    tombus
    Poziom 15  
    Witam.
    Od jakiegoś czasu działam w Linux a dokładniej w Lubuntu.
    Postanowiłem wrócić do "dłubania" w "C" na nowym systemie i zaraz naszły mnie wątpliwości.
    Jako, że ostatnio używałem na Windowsie WinAvr20100110, to teraz za sprawą toolchaina od Atmela i zmiany systemu nie wiem gdzie lepiej kompilować.

    Pobrałem takie pakiety z repo: gcc-avr, avr-libc, binutils-avr, automake.
    Niestety stare programy pisane pod WinAvr nie kompilują się. Dostaję komunikaty, że kompilator nie rozpoznaje "uint8_t" lub innych typów tablic.

    Dodam, że takie molochy jak Eclipse odpadają. Używam lekkich programów: Geany, avrdude. USBasp skonfigurowany poprawnie i działa wraz z Atmegą 328p.

    Pytania:
    1. Czym różni się toolchain Atmela od WinAVR i bibliotek z repo?
    2. Czy "instalacja" toolchain może pomóc w kompilacji programów?
    3. W jaki sposób "zainstalować" toolchain w Linux, aby nie "pokiełbasić" sobie bibliotek avr w systemie.
  • #2 11979821
    mickpr
    Poziom 39  
    tombus napisał:
    Dostaję komunikaty, że kompilator nie rozpoznaje "uint8_t" lub innych typów tablic.
    To nie problem. Poza tym uint8_t co konkretnie?
    tombus napisał:
    Dodam, że takie molochy jak Eclipse odpadają.
    Dlaczego?
    tombus napisał:
    Używam lekkich programów: Geany, avrdude.

    Też używam Geany, ale do AVR się nie nadaje jako IDE. Jedynie jako edytor "C".
  • #3 11979936
    yogi009
    Poziom 43  
    Podepnę się pod temat, Kolego mickpr możesz się pochwalić jak dokładnie należy skonfigurować programator AVR Prog MKII (USB)? Niby mam już z nim kontakt (konsola potwierdza obecność programatora), ale próby zaprogramowania lub choćby rozpoznania mikrokontrolera (np. odczytania numeru seryjnego) kończą się fiaskiem. Możesz polecić jakiś czytelny opis działania krok po kroku? Swoją drogą mnie także nie pasował Eclipse, nie widzę powodu, żeby do programowania małego chip'a instalować wielki, uniwersalny kombajn (wystarczy spojrzeć na ilość doinstalowywanych bibliotek). Pisanie i kompilację elegancko da się osiągnąć w konsoli (ew. zaprzęgając jakiś edytor z podświetlaniem składni), natomiast etapu komunikacji nie przeskoczyłem.
  • #4 11980005
    mickpr
    Poziom 39  
    yogi009 napisał:
    Kolego mickpr możesz się pochwalić jak dokładnie należy skonfigurować programator AVR Prog MKII (USB)?
    Nie mam zielonego pojęcia, ponieważ używałem USBASP (only) pod Linux'em.
    To widziałeś? : http://steve.kargs.net/bacnet/avr-isp-mkii-on-ubuntu-hardy/

    Co do środowiska. De gustibus no disputandum est...
    Wybierasz to, co lubisz..
    Ja lubię mieć kosmate IDE, podpowiadające składnie i trzymające całość w "kupie".
    Przeszkadza to komuś?
  • #5 11980301
    yogi009
    Poziom 43  
    Tego linku nie odwiedzałem, dziękuję z góry za materiał do testów. Zgadzam się z tym, że każdy ma swój gust co do koloru skarpetek i środowiska programistycznego :-)
  • Pomocny post
    #6 11980581
    tmf
    VIP Zasłużony dla elektroda
    tombus napisał:

    Pobrałem takie pakiety z repo: gcc-avr, avr-libc, binutils-avr, automake.
    Niestety stare programy pisane pod WinAvr nie kompilują się. Dostaję komunikaty, że kompilator nie rozpoznaje "uint8_t" lub innych typów tablic.

    Dodam, że takie molochy jak Eclipse odpadają. Używam lekkich programów: Geany, avrdude. USBasp skonfigurowany poprawnie i działa wraz z Atmegą 328p.

    Pytania:
    1. Czym różni się toolchain Atmela od WinAVR i bibliotek z repo?
    2. Czy "instalacja" toolchain może pomóc w kompilacji programów?
    3. W jaki sposób "zainstalować" toolchain w Linux, aby nie "pokiełbasić" sobie bibliotek avr w systemie.


    Używanie dystrybucyjnych wersji avr-gcc jest sporą odwagą i wymaga dobrej znajomości samego gcc, jego błędów i niezbędnych do działania z avr patchy. Stąd też lepiej i bezpieczniej używać toolchaina z Atmela.
    Co do błędów z nieznanym typem uint8_t i podobnymi - to nie błąd WinAVR/toolchaina, tylko twój. A dokładniej znaczy to tyle, że nie zaincludowałeś odpowiedniego nagłówka. Co do pytań:
    ad. 1. To po prostu nowsza werrsja avr-gcc (4.6 vs. 4.4), nowsze AVR-libc itd.
    ad. 2. Bez toolchaina kompilacja programów jest raczej w ogóle niemożliwa :)
    ad. 3. Toolchain Atmela zawiera wszystko co potrzebujesz, oprócz niego nie powinno być innych bibliotek do AVR w systemie, bo i po co?
  • #7 11981352
    tombus
    Poziom 15  
    IDE odpada z prostego względu. Nie chcę instalować Javy i instalacja np. Eclipse, to profanacja LXDE ;)
    Geany traktuję właśnie jako edytor "C". Mam też porobionych kilka skrótów do avrdude itp.

    tmf
    Dzięki za rozjaśnienie sytuacji.
    Pościągałem paczki dystrybucyjne, bo tak było w wszelkich poradnikach "avr pod linux" ;)
    Faktycznie, nie dołączyłem nagłówków... Co za przeoczenie...

    Odpowiedzi na pytania sporo mi wyjaśniły, tylko teraz kwestia:
    Odinstalować wszystkie paczki, które mam i zaprzęgnąć toolchaina?
    W jaki sposób? Wyszperałem, że coś się patchuje, ale nie do końca jeszcze to rozumiem.

    Z góry dzięki za odpowiedź i cierpliwość;)
  • #8 11981617
    tmf
    VIP Zasłużony dla elektroda
    Tak, odinstalować całe dystrybucyjne avr-gcc. Jak zainstalujesz toolchaina z Atmela to masz tam kompletnie wszystko. Nic się nie patchuje :)
  • #9 11981867
    tombus
    Poziom 15  
    No właśnie, jak się instaluje tego toolchaina w linux ;)
    Atmel pisze tylko tyle:
    Cytat:
    Installing on Linux
    On Linux AVR 8-bit GNU Toolchain is available as a TAR.GZ archive which can be extracted using the 'tar' utility.
    In order to install, simply extract to the location where you want the toolchain to run from.


    A tutaj o toolchain co prawda dla 32bit, ale może dla 8bit też zadziała?

    Chyba coś mam, jutro sprawdzę to.
  • #10 11982060
    tmf
    VIP Zasłużony dla elektroda
    Tak jak piszą, po prostu to rozpakowujesz i tyle. Linux to nie Windows, nie jest potrzebny specjalny instalator :) Oczywiście warto sobie poustawiać domyślne ścieżki, ale to i tak w dużej mierze zrobi sobie samo IDE.
  • #11 11983532
    Nagus
    Poziom 27  
    A może zamiast zastanawiać się, czy toolchain z repo odpali, skompilować samemu? Będziesz miał wersję według swojego widzimisię oraz najpełniejszą integrację z systemem.
    Ściągnięcie źródeł do binutils, gcc-core i avr-libc i skompilowanie całości nie jest specjalnie trudne.
    Kompilacja jest prosta: w katalogu ze źródłami robimy podkatalog (build na przykład) i z niego wywołujemy:

    binutils:
    ../configure --target=avr --program-prefix="avr-" --disable-nls
    gcc-core:
    ../configure --target=avr --program-prefix="avr-" --disable-nls --enable-languages=c
    libc:
    ../configure --build=`./config.guess` --host=avr
    (ostatnio kompilowałem to parę miesięcy temu, ale powinno zadziałać)

    Wydanie komend make i make install jest oczywiste. Trochę zabawy może być z podoklejaniem bibliotek potrzebnych do szczęścia samemu kompilatorowi (developerskie zmiennoprzecinkowe i takie tam), ale jak chcesz bawić się programowaniem to i tak będziesz musiał kiedyś to przejść. Skrypt configure mniej lub bardziej wyraźnie podpowie czego mu brakuje, a sposób zapakietowania bibliotek w repo może się różnić pomiędzy dystrybucjami.
  • #12 11983616
    tmf
    VIP Zasłużony dla elektroda
    Nagus napisał:
    A może zamiast zastanawiać się, czy toolchain z repo odpali, skompilować samemu? Będziesz miał wersję według swojego widzimisię oraz najpełniejszą integrację z systemem.
    Ściągnięcie źródeł do binutils, gcc-core i avr-libc i skompilowanie całości nie jest specjalnie trudne.
    Kompilacja jest prosta: w katalogu ze źródłami robimy podkatalog (build na przykład) i z niego wywołujemy:

    binutils:
    ../configure --target=avr --program-prefix="avr-" --disable-nls
    gcc-core:
    ../configure --target=avr --program-prefix="avr-" --disable-nls --enable-languages=c
    libc:
    ../configure --build=`./config.guess` --host=avr
    (ostatnio kompilowałem to parę miesięcy temu, ale powinno zadziałać)

    Wydanie komend make i make install jest oczywiste. Trochę zabawy może być z podoklejaniem bibliotek potrzebnych do szczęścia samemu kompilatorowi (developerskie zmiennoprzecinkowe i takie tam), ale jak chcesz bawić się programowaniem to i tak będziesz musiał kiedyś to przejść. Skrypt configure mniej lub bardziej wyraźnie podpowie czego mu brakuje, a sposób zapakietowania bibliotek w repo może się różnić pomiędzy dystrybucjami.


    Żeby to było takie proste i ograniczało się wyłącznie do kompilacji... Niestety avr-gcc oraz binutils wymagają nałożenia sporej liczby patch dla AVR. Trzeba je mieć, wiedzieć, które są potrzebne, spatchować źródła i potem dopiero kompilować. Pytanie po co, skoro Atmel udostępnia gotowce?
  • #13 11988226
    tombus
    Poziom 15  
    Zrobiłem według powyższych "tutków" i niestety Geany wypluwa błąd o braku avr-gcc.
    Nie wiem, czy coś muszę zmieniać w makefile czy w złym miejscu wypakowałem.
    Wypakowałem to w standardowym miejscu domyślnej lokalizacji gdzie był avr-gcc. Nic nie pomogło.
    Jak będę miał dostęp do swojego komputera, to spróbuję znowu.

    Co mogłem zrobić nie tak?
  • #14 11988275
    Badmaneq
    Poziom 23  
    Skoro nie Eclipse to może Code::Blocks ( www.codeblocks.org ), ma wsparcie dla AVR'ów
  • Pomocny post
    #15 11988730
    Jado_one
    Poziom 22  
    tombus napisał:
    Zrobiłem według powyższych "tutków" i niestety Geany wypluwa błąd o braku avr-gcc.
    Nie wiem, czy coś muszę zmieniać w makefile czy w złym miejscu wypakowałem.

    Wszystko zależy od makefile'a - tam musisz mieć wszystko poprawnie skonfigurowane.
    Wtedy możesz odpalić make'a w konsoli i musi się wszystko skompilować/zaprogramowac/etc... A w Geany podczepiasz tylko wywołanie makefile'a.
    Przynajmniej ja mam tak zrobione :-)
    W połączeniu z backupem wszystkich plików programu do plików *.tgz pozwala na wygodne rozpakowanie takiego "snapshot'a" do katalogu tymczasowego i skompilowanie go bez odpalania geany (jeśli np. szybko potrzebujesz cofnąć się do poprzedniej wersji programu, żeby sprawdzić dlaczego bieżąca wersja programu przestała działać).
    Oprócz makefile'a dobrze jest mieć zrobionych kilka skryptów powłoki, które będą realizować jakieś specyficzne zadania np. właśnie backup plików do jednego spakowanego archiwum czy np. odpalenie OpenOCD, itp...
    Ale oczywiście nie każdy lubi zabawę z poziomu konsoli.....;-)
  • #16 11988886
    yogi009
    Poziom 43  
    A mnie się udało wczoraj uruchomić gcc-avr, teraz pracuje w komplecie z avrdude i to mi jak najbardziej wystarcza. Prawdopodobnie wyrzuca Ci jakieś swoje komunikaty dotyczące składni. Nowsze kompilatory C zwracają uwagę na coraz większą dyscyplinę w kodzie, jednak jestem za cienki, żeby wypowiadać się o tym jakoś konkretnie.
  • #17 11990336
    tombus
    Poziom 15  
    Dobra, chyba się udało;)
    Opiszę swoje postępowania w punktach, a Wy potwierdzicie moje wnioski i w razie czego wyprowadzicie z błędu;)

    1. Powrót do działającej kompilacji programów. Czyli usunięcie wszystkich śladów związanych z Atmel toolchain.
    2. Ponowne pobranie pakietów: gcc-avr, avr-libc, binutils-avr, automake w celu skompilowania prostego programu dla procesorka. Wszystko działa
    3. "purge" na wszystkich powyższych pakietach w celu sprawdzenia, czy faktycznie brak kompilatora i bibliotek powoduje problem "sh: 1: avr-gcc: not found"
    4. Pobranie i instalacja tylko gcc-avr (a wraz z nim automatycznie ściąga się avr-libc)
    5. Skopiowanie zawartości toolchaina do "/usr/" wraz z podmianą w celu zastąpienia bibliotek z repo na tą z toolchaina
    6. Próba kompilacji prostego programu zakończona sukcesem.

    // Wniosek 1. Toolchain działa, tylko problem z lokalizacją kompilatora itp.

    1. "purge" na gcc-avr oraz usunięcie pozostałości po toolchain w celu powrotu do "czystego" stanu
    2. Próba kompilacji programu w celu weryfikacji powyższego
    3. Lektura pliku makefile...
    4. Rozpakowanie .tar toolchaina
    5. Edycja wpisu w pliku makefile z: "CC = avr-gcc" na "CC = /home/.../avr8-gnu-toolchain-3.4.1.798/bin/avr-gcc"
    6. Próba kompilacji zakończona sukcesem.

    // Wniosek 2.
    Jado_one napisał:
    Wszystko zależy od makefile'a - tam musisz mieć wszystko poprawnie skonfigurowane.

    Prawda, należało tam zmienić ścieżkę kompilatora. Można również pomóc sobie dowiązaniem symbolicznym.

    Również w Geany wykonuję wywołanie make. Zbindowałem sobie również czyszczenie, kompilacje, wgrywanie wsadu.
    Kopiami zapasowymi zajmuje się Geany;)
  • #18 11991375
    yogi009
    Poziom 43  
    Może napisz jakiś prosty, kompletny i czytelny artykuł, jak to zrobić krok po kroku, artykuł wrzucisz na forum, a następne pokolenia będą się miały na czym wzorować. Przynajmniej na początkowym etapie.
  • #19 11992177
    Jado_one
    Poziom 22  
    tombus napisał:

    Prawda, należało tam zmienić ścieżkę kompilatora. Można również pomóc sobie dowiązaniem symbolicznym.

    Jeżeli mamy kilka kompilatorów w systemie i chcemy szybko dokonać wyboru którego z nich chcemy użyć, to można nieco zmodyfikować makefile'a dodając coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    To akurat przykład dla procesora PIC32, ale dla innych procków łatwo go można zaadaptować.
    Wówczas nie potrzeba nawet, aby ścieżka dostępu do kompilatora była ogólnie widziana w systemie - bo mamy konkretne ścieżki.
    Można sobie w ten sposób testować zachowanie kompilacji przy różnych toolchainach.
    Dobrze napisany Makefile uniezależnia nas od edytora - można podpinać go do dowolnego edytora - i zawsze działa.
  • Pomocny post
    #20 11992212
    mickpr
    Poziom 39  
    Jado_one napisał:
    dodając coś takiego:
    Przy takiej opcji ja bym poszedł jeszcze dalej.
    Wybór toolchainu - jako jeden z #define'ów
    Na podstawie wyboru - lokalizacja
    Na podstawie wyboru - prefix - itd...

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #22 14880232
    tombus
    Poziom 15  
    Poproszono mnie o wyjaśnienie kilku kwestii.
    W zasadzie wszystko zostało już tutaj opisane.
    Ale postaram się podać to w kilku krokach na moim przykładzie:

    1. Zasysam odpowiednią (np. 64 bitową) paczkę toolchain Atmela z głównej strony WWW
    2. Wypakowuję ją do konkretnego folderu (najlepiej zbiorczego, elektronicznego ;) )
    3. Instaluję odpowiedni dla mnie edytor tekstu/kodu. Ja wybrałem jeden z "najlżejszych" i chyba najlepszy Geany. Instalacja zależy od dystrybucji. Można posłużyć się Synapticiem, Centrum oprogramowania (x)BUNTU lub terminalem.
    Cenię sobie wygodną pracę z terminalem więc wklepuję:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    4. Następnie program potrzebny do flashowania procków:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    5. Teraz kolej na małą konfigurację edytora. Kilka skrótów klawiszy przyspieszy kompilację i flashowanie:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    [LINUX] [TOOLCHAIN] [C] - Kompilacja programów w linuxie

    Konfiguracja kompilatora i flashera:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    [LINUX] [TOOLCHAIN] [C] - Kompilacja programów w linuxie

    6. Ważna rzecz, plik makefile. Dzięki niemu wszystko będzie działo się automatycznie (kompilacja, czyszczenie, flashowanie). Odszukujemy sekcję odpowiadającą za ścieżkę do kompilatora, linkiera itp.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jako, że posiadam swój "uniwersalny" makefile i projekty wędrują po różnych maszynach zrobiłem sobie małe uproszczenie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W linijce "TOOLCHAIN_DIR" należy podać swoją, dokładną ścieżkę!
    Naturalnie można posłużyć się pomysłami wyżej podanymi przez kolegów.

    7. Już nic innego nam nie pozostaje jak "kodzić" ;) Dla uporządkowania podpowiem jak ja to robię.
    Tworzę kod i konfiguruję plik makefile.
    Gdy chcę sprawdzić, czy poprawki w kodzie są prawidłowe i nie ma błędów klikam F8. Jest to tylko kompilacja kodu. Gdy wszystko w porządku cisnę F9 i program automatycznie "ładuje" się do kości. Jeśli sądzę, że kod zadziała "od kopa" używam od razu F9. Wtedy kod skompiluje się a następnie od razu avrdude zacznie flashować.
    Czasami przy sporych zmianach potrzebne jest czyszczenie. Przydaje się wtedy klawisz F7. Wywali on wszystkie pliki powstające podczas kompilacji.
  • #23 16452614
    Krzysiek1260
    Poziom 7  
    Przepraszam za odkop, ale mam problem z zastosowaniem powyższej instrukcji.
    Pobrałem toolchain, zmodyfikowałem ustawienia geany jak wyżej i zmodyfikowałem szablon makefile, wstawiając do niego poniższy kod.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Niestety nie działa, Geany w logu wyświetla komunikat:
    Cytat:
    make all (w katalogu /mnt/stary_home/krzysztof/Dokumenty/Mikrokontrolery/PilotIR)
    make: *** Brak reguł do wykonania obiektu 'all'. Stop.
    Kompilacja nie powiodła się

    Nie za bardzo znam się na makefile, wykorzystałem szablon ze strony Mfile http://www.sax.de/~joerg/mfile/, tak jak ktoś w innym temacie podpowiadał https://www.elektroda.pl/rtvforum/topic1848672.html#8860772 . Czy nie trzeba czegoś w nim jeszcze pozmieniać? W załączniku mój plik makefile (ukośnik na końcu odnośnika do toolchain już mam poprawiony).
    Edit: Teraz zadziałało po wyczyszczeniu klawiszem F7 przed kompilowaniem i niby procek się flashuje poprawnie, ale tak jakby wcale się nie wgrywał lub wgrywał za każdym razem stary program - jak w pliku wprowadzam zmiany to po programowaniu program w procku dalej działa  tak samo.
  • #24 16471182
    Nagus
    Poziom 27  
    Nie powinno tam być reguł dla:
    $(TARGET).hex
    $(TARGET).eep
    ?
REKLAMA