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

Pobranie nazwy mikrokontrolera z makefile i wyświetlenie przez UART

mtbchn 03 Lis 2021 17:57 570 6
  • #1 19688654
    mtbchn
    Poziom 3  
    Cześć,

    chciałbym uzyskać efekt jak w temacie. Mianowicie zależy mi na tym, aby po każdym resecie, moje urządzenie "przedstawiło się" po UART nazwą mikrkontrolera oraz wartością jego taktowania. W jaki sposób mógłbym pobrać te dane? Widzę, że są one w pliku makefile. Proszę o podpowiedź. Chcę stworzyć uniwersalne makro, które będzie działać na każdym uC (AVR) w każdym projekcie. Z góry dzięki za podpowiedź.
  • #2 19688878
    krru
    Poziom 33  
    W opcjach wywołania kompilatora (przymajniej gcc) można podać odpowiedniki poleceń #define (-Dnazwa=wartosc) i potem użyć tych wartości w kodzie. Zwykle tak przekazuje się częstotliwość zegara. Przekazanie wartości napisowych jest trochę trudniejsze.
  • #3 19689076
    gaskoin
    Poziom 38  
    Jak to?
    Takie coś działa bez problemu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: text
    Zaloguj się, aby zobaczyć kod


    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • #4 19689670
    ex-or
    Poziom 28  
    Jeśli mowa o AVR-GCC to do dyspozycji jest wbudowane makro __AVR_DEVICE_NAME__ ustawiane opcją kompilatora -mmcu : https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/AVR-Options.html#AVR-Built-in-Macros
  • Pomocny post
    #5 19689757
    gaskoin
    Poziom 38  
    @ex-or Tylko jak to potem użyć w stringu? Da się prościej niż:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    ?
  • #6 19690160
    mtbchn
    Poziom 3  
    gaskoin napisał:
    #define xstr(s) str(s)
    #define str(x) #x
    #define MCU_NAME xstr(__AVR_DEVICE_NAME__)


    Dziękuję, działa dokładnie tak, jak chciałem. Czy mógłbyś mi podpowiedzieć - lub naprowadzić na źródło - jak działa dokładnie to makro? Mam na myśli dwie pierwsze linie.
  • #7 19690227
    gaskoin
    Poziom 38  
    To taka trochę incepcja :P Trzeba skorzystać z podwójnego rozwinięcia makra. # zamienia na literał dlatego następuje magiczna zamiana na stringa.

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

    Jakbyś zrobił bez podwójnego rozwinięcia to byłoby tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Moim zdaniem to trochę hack więc zapytałem, czy da się to jakoś ładniej zrobić
    https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html
REKLAMA