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.

[Atmega32][C][Eclipse] - Definicja F_CPU w pliku głównym i w dołączonej bibliote

dejmos 14 Lis 2012 07:42 2280 11
  • #1 14 Lis 2012 07:42
    dejmos
    Poziom 23  

    Mam kod programu w którym definiuję stałą F_CPU:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W bibliotece delay.h także jest zdefiniowany F_CPU i wygląda to tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kompilator zgłasza mi warning : "F_CPU" redefined
    I teraz moje pytanie: Czy funkcja #ifndef zapobiega zmianie F_CPU z 8 MHZ na 10 MHz czy też kompilator mnie ostrzega że biblioteka jednak ją zmieniła.

    0 11
  • Pomocny post
    #2 14 Lis 2012 08:06
    Jj_Johnys
    Poziom 21  

    Skoro ostrzega Cię przed zdublowaniem definicji, to znaczy że definicja w #ifndef poszła jako pierwsza. Gdyby była druga #ifndef by zadziałało i nie miał byś zdublowanej definicji.

    0
  • Pomocny post
    #3 14 Lis 2012 08:18
    xamrex
    Poziom 28  

    Zamień po prostu kolejność:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    na
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po drugie NIE powinno się tu definiować prędkości, tylko w makefile!

    0
  • Pomocny post
    #4 14 Lis 2012 08:21
    kriss68
    Poziom 20  

    A wyskakuje Ci też warning: F_CPU not defined for
    <util/delay.h>? Generalnie F_CPU powinno być definicją globalną a nie lokalną dla danego pliku - jeżeli używasz makefile to odpowiednią definicje dodajesz do DEFS lub czegoś podobnego. A jeżeli używasz wtyczki do eclipse dla AVR to odpowiednia definicja jest już dodawana automatycznie na podstawie wartości ustawionej w opcjach projektu.

    0
  • Pomocny post
    #5 14 Lis 2012 08:25
    perlon
    Poziom 19  

    Wątek jest na Eclipse a tam w ogóle się nie grzebie w makefile a F_CPU ustawia się we właściwościach projektu. Racją jest, że definicję F_CPU w poszczególnych modułach należy traktować jako błąd programistyczny. Biblioteka delay.h używa zmiennej F_CPU więc sama dba, żeby ten symbol był w ogóle zdefiniowany ale nie jest to warunek wystarczający do prawidłowej pracy.

    0
  • Pomocny post
    #6 14 Lis 2012 09:55
    mirekk36
    Poziom 42  

    dejmos napisał:

    Kompilator zgłasza mi warning : "F_CPU" redefined
    I teraz moje pytanie: Czy funkcja #ifndef zapobiega zmianie F_CPU z 8 MHZ na 10 MHz czy też kompilator mnie ostrzega że biblioteka jednak ją zmieniła.


    I bardzo dobrze że zgłasza warningi, bowiem Eclipse to normalne środowisko i pod tym względem (ale nie tylko pod tym) o wiele lepsze niż AVR Studio 5/6.

    Tymczasem twój BŁĘDNY nawyk definiowania F_CPU w kodzie programu to niestety naleciałość z dziesiątek blogów i innych dziwnych stron w necie, gdzie prawie każdy ostatnio (głównie odkąd ukazało się AVRS 5/6) - gdzie wszyscy tak piszą i ŹLE piszą.

    W AVR Studio 5/6 wynika to z tego, że Atmel nie wiedzieć czemu zrezygnował z tak prostej opcji jak ustawianie prędkości taktowania procka w opcjach projektu tak jak to było chociaż w jego starszej wersji AVR Studio 4.xx. Odkąd więc się pojawiły nowsze wersje na samej elektrodzie pojawił się ogromny wysyp prezentowanych kodów z tym nieszczęsnym #define F_CPU xxxxxxx robionym w kodzie bo bez tego w ogóle sporo rzeczy nie chce działać. I pomimo to, że wszędzie ludzie piszą że w kodzie się tego nie robi - to nie odnosi to żadnego skutku wszyscy na potęgę robią ten sam błąd, bo jak tłumaczą bez tego im nie działają programy w AVRS 5/6. Co jest bzdurą ponieważ i w tym nieszczęsnym AVRS 5/6 można i należy ustawić taktowanie nie w kodzie ale w głęboko w opcjach samego toolchaina. Tyle że u początkującego już słowo toolchain wywołuje strach i niezrozumienie a gdzie tam się jeszcze mu dokopać do tej opcji i wiedzieć jak to dodać i że trzeba dać -D na początku ....

    ----------------

    na szczęście masz ECLIPSE - porządne środowisko, i jak wiesz można pięknie ustawić częstotliwość taktowania w opcjach projektu. Jednocześnie musisz pamiętać żeby pod żadnym pozorem NIE DEFINIOWAĆ tego w programie jak próbujesz to zrobić. Pewnie zadasz sobie pytanie no ale jak ? to w jaki sposób wartość F_CPU będzie widoczna w moich plikach projektu ???

    Nie martw się, ECLIPSE wartość wpisaną w opcjach projektu - doda AUTOMATYCZNIE do pliku makefile w taki sposób, że właśnie wartość hmm stała F_CPU będzie widoczna W KAŻDYM MIEJSCU PROJEKTU. Rozumiesz ? i tak się to działo też w starszej wersji AVRS 4.xx, tak samo dzieje się w CodeBlocks i innych normalnych środowiskach.

    Dlatego śmiało WYKASUJ z kodu swoje #define F_CPU i nigdy go w kodzie nie używaj. Pamiętając jednak o tym, że wartość stałej F_CPU służy tylko dla kompilatora jako informacja do celów kompilacji i nie ma nic wspólnego z fizycznym ustawieniem taktowania procesora. Za fizyczne taktowanie odpowiedzialne są Fusebity

    mam nadzieję, że teraz jaśniej?

    0
  • #7 14 Lis 2012 11:04
    dejmos
    Poziom 23  

    Dzięki wszystkim za udzielone odpowiedzi. Teraz jest wszystko jasne jak słońce. Niedawno przesiadłem się z AVR studio na Eclipse i pewnie jeszcze dużo rzeczy będę musiał się nauczyć (chociaż w programowanie bawię się tylko od czasu do czasu). Szczególne podziękowania dla mirekk36 za obszerne wyjaśnienie :)
    Do kriss68
    Nic takiego nie wyskakuje.
    Do xamrex
    Ta zmiana nie pomaga. Dalej jest warning.

    Tematu na razie nie zamykam chociaż problem został rozwiązany. Może ktoś jeszcze chciałby się wypowiedzieć Na temat Eclipce i programowania w C AVR-ów.

    0
  • #8 14 Lis 2012 11:42
    mirekk36
    Poziom 42  

    dejmos napisał:

    Do xamrex
    Ta zmiana nie pomaga. Dalej jest warning.


    Bo i nie może pomóc w związku z tym co napisałem. W eclipse stała F_CPU jest widoczna WSZĘDZIE za sprawą makefile, więc komunikat nie jest dziwny - wręcz normalny i dobre ostrzeżenie.

    polecam też ten artykuł:

    http://mirekk36.blogspot.com/2011/11/dlaczego-eclipse-zamiast-avr-studio.html

    oraz inne z tego bloga - pewnie się przydadzą.

    0
  • Pomocny post
    #9 14 Lis 2012 14:39
    Jj_Johnys
    Poziom 21  

    Cytat:
    Zamień po prostu kolejność:

    Nawet gdyby ta zamiana pomogła, to zamieniłbyś swoje 8Mhz na 1Mhz z pliku delay.h.

    0
  • Pomocny post
    #10 14 Lis 2012 14:52
    xamrex
    Poziom 28  

    Jj_Johnys napisał:
    Cytat:
    Zamień po prostu kolejność:

    Nawet gdyby ta zamiana pomogła, to zamieniłbyś swoje 8Mhz na 1Mhz z pliku delay.h.

    Otóż nie, gdyż jest tam:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak czy siak, tak jak pisał już tu Mirek, polecam Eclipsa.
    100x lepszy:))

    0
  • #11 14 Lis 2012 17:55
    tmf
    Moderator Mikrokontrolery Projektowanie

    mirekk36 napisał:
    dejmos napisał:

    Kompilator zgłasza mi warning : "F_CPU" redefined
    I teraz moje pytanie: Czy funkcja #ifndef zapobiega zmianie F_CPU z 8 MHZ na 10 MHz czy też kompilator mnie ostrzega że biblioteka jednak ją zmieniła.


    I bardzo dobrze że zgłasza warningi, bowiem Eclipse to normalne środowisko i pod tym względem (ale nie tylko pod tym) o wiele lepsze niż AVR Studio 5/6.


    A co ma środowisko do ostrzeżeń kompilatora? Powyższe ostrzeżenie informujące o redefinicji symbolu F_CPU jest generowane przez kompilator i tak samo wyjdzie w Eclipse, jak i w AS4/5/6.
    Do autora - tu masz wyjaśnione o co chodzi z definicją F_CPU:
    http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html
    W AS6 zrobiono w końcu normalnie i tak jak powinno być - F_CPU to zwykły symbol definiowany przez opcję kompilatora -D i nie ma najmniejszych powodów, aby robić jakieś magiczne opcje konfiguracyjne. Tym bardziej, że w niektórych projektach kolejność definicji symboli jest istotna.

    Dodano po 42 [sekundy]:

    xamrex napisał:

    Tak czy siak, tak jak pisał już tu Mirek, polecam Eclipsa.
    100x lepszy:))


    Bo?

    Dodano po 6 [minuty]:

    dejmos napisał:
    Mam kod programu w którym definiuję stałą F_CPU:


    Tak BTW, jeśli poprzedni link ci wyjaśnił conieco, to tu masz jak to zrobić w AS6:
    http://mikrokontrolery.blogspot.com/2011/04/atmel-studio-pelne-ide-avr-arm-cz1.html
    Zobacz punkt 1. Ustawienie F_CPU

    0