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

F_CPU Dodatkowe opcje L U

xamrex 20 Cze 2011 18:57 4296 15
  • #1 9633623
    xamrex
    Poziom 28  
    Witam
    Spotkałem się z tym, że ludzie definiują prędkość zegara w pliku
    np.:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Widziałem również:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

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


    Może mi ktoś wytłumaczyć po co są dodatkowe literki U oraz L ?
  • #2 9633655
    michalko12
    Specjalista - Mikrokontrolery
    Unsigned Long bez tego kompilator potraktuje literał jako int a to może powodować problemy jesli literał będzie poza zakresem.
  • #3 9633660
    xamrex
    Poziom 28  
    To trzeba w projekcie dodawać te litery UL, czy można je pominąć?
  • #4 9633675
    michalko12
    Specjalista - Mikrokontrolery
    Dla dużych wartości musisz je dodawać
  • #5 9633714
    xamrex
    Poziom 28  
    Dla dużych..
    Ile to jest dużo?
    Czyli coś takiego?
    #define F_CPU 1000000
    Jest błędne (przecież 1M, to chyba dużo)
  • #6 9633725
    tadzik85
    Poziom 38  
    A jaki zakres wartości ma int? Zastanowiłeś się?
  • #7 9633758
    nsvinc
    Poziom 35  
    "dużo" to jest zakres liczb które może trzymać typ int, i jest to zależne od platformy. Z tego co wiem, int na AVR jest 16bitowy. Inne procki jak dsPIC czy ARM traktują mają 32bitowy int.
    Kolejna istotna rzecz, to kwalifikator unsigned. Bez niego, twój 16bitowy int przyjmie wartość max. 32767. Z nim - 65535.
    Dla 32bitowego inta, max to jest 2.147.483.647, dla unsigned inta 4.294.967.296

    Na AVR typ long jest 32bitowy (mogę sie mylić, ale załóżmy że tak jest), więc literał tego typu jest w stanie pomieścić np. 1000000 (milion). 16bitowy int już nie...

    Stąd też, jeśli masz literał 8000000 (8 mln), to musi on być long. Kwalifikator unsigned będzie ci potrzebny, jeśli będziesz wymagać liczb większych niż 2.147.483.647, stąd

    #define F_CPU 8000000unsignedlong jest ok
    #define F_CPU 8000000long też jest ok

    ale

    #define F_CPU 8000000 już jest lipa, bo liczba jest wieksza niz domyslny typ int na 8bitowym AVRrze, tak samo jak
    #define F_CPU 8000000unsigned, bo unsigned nadal nie gwarantuje ci pomieszczenia liczby na 16 bitach...

    -------------------------
    Disclaimer
    Mogłem się pomylić co do szerokości bitowej typów na AVR. Jeśli tak, proszę o poprawkę ;]
  • #8 9633830
    michalko12
    Specjalista - Mikrokontrolery
    Jak literał składa się z co najmniej 5 cyfr stosuj te sufixy i będzie bezpiecznie. Wielkość liter nie ma znaczenia może być ul jak i UL
  • #9 9633873
    xamrex
    Poziom 28  
    No ok będę stosował.

    Załóżmy, że jestem początkujący..
    Co robię?
    Pisze w googlach kurs c avr
    Wchodzę na stornę, gdzie jest przykładowy kod do mrugania diodami:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    #define F_CPU 1000000L


    I setki osób próbuje ten kod.
    I co się okazuje?
    Kod działa, a brakło tam literki U

    Ja też zrobiłem sobie małą próbę:
    Mam kwarc zew. 11,0592
    Napisałem kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i działa, a nie ma literałów UL,
    Czyli jeśli je pominę to nic wielkiego się nie stanie, tylko po prostu tak nie powinno się robić?
    Mam rację?
  • #10 9633883
    tadzik85
    Poziom 38  
    Zacznijmy od tego ze to F_CPU powinno definiować się w makefile.

    To główna zasada której powinieneś się trzymać.
  • #11 9633889
    xamrex
    Poziom 28  
    Tylko AVR Studio w wersji 5,
    generuje sam makefile a w opcjach nigdzie nie wadziłem możliwości definiowania zegara
    Więc jedyna opcja to dodanie tej definicji do pliku.
  • Pomocny post
    #12 9633905
    mirekk36
    Poziom 42  
    xamrex napisał:
    Tylko AVR Studio w wersji 5,
    generuje sam makefile a w opcjach nigdzie nie wadziłem możliwości definiowania zegara
    Więc jedyna opcja to dodanie tej definicji do pliku.


    Mylisz się jest możliwość ;) właśnie w pełnej wersji AVR Studio 5 .

    F_CPU Dodatkowe opcje L U

    oczywiście sam jeszcze szukałem parę minut tego miejsca. Wprawdzie Eclipse też ma milion opcji - ale jednak pod niektórymi względami jest nadal wygodniejsze od AVR Studio. Chociaż te podpowiedzi z kolei w AVR Studio są też fajne bo w Eclipse jakoś nie zawsze działają niestety.
  • #13 9633911
    xamrex
    Poziom 28  
    Gdzie?
    Ściągnąłem AVR Studio 5 i nie mogę znaleźć.
  • #15 9634056
    tmf
    VIP Zasłużony dla elektroda
    Poza tym stałe można definiować przekazując odpowiednie parametry do gcc:
    -DF_CPU=
    A to już łatwo wprowadzić w opcjach projektu.
  • #16 9634128
    michalko12
    Specjalista - Mikrokontrolery
    xamrex napisał:
    No i działa, a nie ma literałów UL,
    Czyli jeśli je pominę to nic wielkiego się nie stanie, tylko po prostu tak nie powinno się robić?
    Mam rację?


    Wszystko zależy od tego z czym taki literał użyjesz, może tez zależęc od kompilatora..
    Jeśli taki literał użyjesz ze zmiennymi typu long to to zadziała, jeśli użyjesz z int to może nie zadziałać jak trzeba.

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


    Zobacz na jakich typach pracują funkcje delay:
REKLAMA