Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C/AVR] Definicje. Dlaczego nie mogę zdefiniować stałej BAUD_RATE?

Mathew26 22 Apr 2011 19:03 989 4
  • #1
    Mathew26
    Level 9  
    Witam,
    spotkałem się z problemem pisząc program na mikrokontroler, jednak problem leży, jak mi się wydaje, w składni języka C.
    Otóż posiadam 3 pliki w projekcie:
    main.c
    usart.c
    usart.h

    plik main.c:
    Code: c
    Log in, to see the code




    usart.c:
    Code: c
    Log in, to see the code


    usart.h:
    Code: c
    Log in, to see the code



    Dlaczego nie mogę zdefiniować stałej BAUD_RATE w pliku main.c ? Kompilator wyrzuca błąd. Idea była taka żeby definiować BAUD_RATE i F_CPU w pliku main.c
    Generalnie stała __BAUD__RATE___X jest używana w pliku usart.c
    Czy to nie jest tak że preprocesor zaczyna najpierw przetwarzać plik w której znajduje się funkcja main? Jeżeli tak to powinien 'znać' już te stałe.
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • Helpful post
    #2
    krru
    Level 33  
    Preprocesor i kompilator 'obrabiają' każdy plik .c oddzielnie i nie znają żadnych definicji z jednego pliku w trakcie pracy nad drugim. W rozwiązaniu, które jest powszechnie wykorzystywane, funkcje wykorzystujące BAUD_RADE itp są zapisane w pliku .h, bądź jako makra, bądź jako inline.

    Innym rozwiązaniem, dość zgrabnym, jest zdefiniowanie tych zmiennych w opcjach (-D) wywoływanie kompilatora. Zwykle w makefilu, ale można i po prostu dopisać do polecenia kompilacji w dowolnym skrypcie.
  • #3
    piki1987
    Level 12  
    A próbowałeś robić te define-y w pliku .h?
  • Helpful post
    #4
    azra
    Level 16  
    Może jeszcze raz, bo mam wrażenie, że mylisz pojęcia "definiować" i "używać".
    Quote:
    Dlaczego nie mogę zdefiniować stałej BAUD_RATE w pliku main.c ?
    Możesz. ;) Chodzi Ci o to, że nie możesz ich użyć? Nie widać ich w main.c bo istnieją w dwóch jednostkach translacji (patrz post krru) Wrzuć je do nagłówka i będziesz miał te makra dostępne w każdym pliku .c do którego dołączysz nagłówek.
    Quote:
    Kompilator wyrzuca błąd.
    A jaki błąd? Wypadałoby podać jego treść, bo inaczej ta informacja jest mało warta.
    Quote:
    Idea była taka żeby definiować BAUD_RATE i F_CPU w pliku main.c
    Definiować czy używać? Jeśli chcesz zdefiniować je w main.c i użyć w innym.c - to tak (parafrazując Kononowicza) się nie da się*. Dwie osobne jednostki translacji. Ale jeśli wrzucisz te makra do nagłówka... ;)

    Jeżeli chcesz zrobić takie globalne "przełączniki" dla całego projektu, to raczej zrób sobie jakiś jeden nagłówek z tymi stałymi, czy co tam masz, i dołączaj go tam gdzie potrzebujesz. Możesz go sobie ładnie udokumentować opisując każdą z opcji. Jeśli zdecydujesz się dodawać je do opcji kompilatora (-D) to przynajmniej gdzieś te opcje udokumentuj, bo prędzej czy później zapomnisz i będziesz biegał po plikach próbując zrozumieć do czego one właściwie były.

    *) to znaczy... Da się, ale to byłoby tak paskudne wyjście z sytuacji, że podaję je tylko dla kompletności odpowiedzi. Zdecydowanie tego NIE POLECAM (a teraz wyobraź sobie, że ten napis jest wypalany rozżarzonym żelazem na czole każdego programisty, który czegoś takiego próbuje - na zlecenie samego Wielkiego Programisty - tak bardzo nie polecam :P), a wręcz odradzam (ja tam lubię swoje czoło bez swędzących blizn).
    Czymże jest ta herezja? Ano po prostu zamiast kompilować main.c i inny.c - kompilować mógłbyś tylko main.c, na końcu którego byłoby #include "inny.c". A tfu, żeby Ci nie przyszło do głowy przypadkiem.
  • #5
    Mathew26
    Level 9  
    Dzięki, teraz wszystko jasne. Zdecydowałem się na dodanie stałej w opcjach kompilatora (-D).