Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

dejmos 14 Nov 2012 07:42 2754 11
Computer Controls
  • #1
    dejmos
    Level 23  
    Mam kod programu w którym definiuję stałą F_CPU:
    Code: c
    Log in, to see the code


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

    Code: c
    Log in, to see the code


    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.
  • Computer Controls
  • Computer Controls
  • Helpful post
    #3
    xamrex
    Level 28  
    Zamień po prostu kolejność:
    Code: c
    Log in, to see the code


    na
    Code: c
    Log in, to see the code


    Po drugie NIE powinno się tu definiować prędkości, tylko w makefile!
  • Helpful post
    #4
    kriss68
    Level 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.
  • Helpful post
    #5
    perlon
    Level 20  
    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.
  • Helpful post
    #6
    mirekk36
    Level 42  
    dejmos wrote:

    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?
  • #7
    dejmos
    Level 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.
  • #8
    mirekk36
    Level 42  
    dejmos wrote:

    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ą.
  • Helpful post
    #10
    xamrex
    Level 28  
    Jj_Johnys wrote:
    Quote:
    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:
    Code: c
    Log in, to see the code


    Tak czy siak, tak jak pisał już tu Mirek, polecam Eclipsa.
    100x lepszy:))
  • #11
    tmf
    Moderator of Microcontroller designs
    mirekk36 wrote:
    dejmos wrote:

    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 wrote:

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


    Bo?

    Dodano po 6 [minuty]:

    dejmos wrote:
    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