Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

stm32f103 makra, sklejanie nazw, bibliotekaHD44780 błędy,

endju999 09 Kwi 2018 22:37 441 4
  • #1 09 Kwi 2018 22:37
    endju999
    Poziom 3  

    Witam, jestem w trakcie przekształcania biblioteki wyświetlacza HD44780 z AVR na STM32. Przekształcając makra według wzorca napotkałem błędy. Głowię się nad juz 2 dzień jednak z powodu jeszcze małego doświadczenia, nie potrafię sobie z tym poradzić.
    Makra w pliku nagłkowym wyglądają następująco:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    przy tym pojawia się błąd : " pasting "GPIO" and "(" does not give a valid preprocessing token "

    w funkcji main:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    co skutkuje następującym błędem : " invalid type argument of '->' (have 'int') "

    Z góry dzięki za wszelką pomoc. Jestem otwarty na wszelką krytykę jeśli tylko ma być ona pomocna.

    0 4
  • CControls
  • Pomocny post
    #2 09 Kwi 2018 22:52
    Freddie Chopin
    Specjalista - Mikrokontrolery

    1. Jak chcesz odpowiedź, to podawaj WSZYSTKIE dane. Skąd mamy wiedzieć co jest pod LCD_RWPORT? Może jest zdefiniowane jako "("?

    2. Nie wiem po co te magiczne kombinacje. W przypadku STM32 to w ogóle nie ma sensu, bo wystarczy jakbyś sobie zdefiniował LCD_RWPORT jako "GPIOA", a nie samo "A" (jak zapewne planujesz) i już cały pomysł sklejania makr jest zupełnie zbędny. No bo po co bawić się w magiczne sklejanie "GPIO" z "A", skoro w każdym przypadku (kontrola kierunku, zapis, odczyt, cokolwiek) to będzie zawsze GPIOA? Na AVR jak był osobny rejestr do każdej funkcji może i to miało jakiś sens, tu nie ma żadnego.

    0
  • CControls
  • #3 09 Kwi 2018 23:20
    endju999
    Poziom 3  

    Dziękuję bardzo za sugestie. Rzeczywiście, jak analizuję Pana wpis widzę, ze to co robię to trochę bez sensu. Oczyswiście zastosuję się do tych rad. Jeszcze w celach edukacyjnych wklejam resztę kodu. Byłbym wdzięczny gdyby ktoś wskazał na czym polegają błędy, zeby byc bardziej świadomy na przyszłość.
    main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


    lcd.h
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #4 10 Kwi 2018 07:54
    Freddie Chopin
    Specjalista - Mikrokontrolery

    W ten sposób to na pewno nie ma sensu, bo po co sklejać "GPIO" z "GPIOB". Meandry działania preprocesora przy sklejaniu makr są dla mnie pewną zagadką, niemniej jednak obstawiam, że problemem jest to, że próbujesz skleić coś co jeszcze nie jest żadnym tokenem (GPIO) z czymś co już nim jest (GPIOB). W efekcie pewnie preprocesor rozwija najpierw GPIOB (bo może) i Twoje makro widzi coś na styl: "(GPIO_TypeDef*)(0x40000000 + 0x2000000+0x100)" (mniej-więcej tak zdefiniowane jest GPIOB i tym podobne) po czym próbuje do tego dokleić "GPIO" z przodu, co w efekcie daje jakiś kompletny bezsens.

    Ale to tylko hipoteza, bo równie dobrze problemem może być coś innego (np. to że makro GPIO(x) nazywa się tak samo jak fragment tokena który próbujesz dokleić linijkę niżej). W swojej prywatnej praktyce użycie preprocesora w zasadzie ograniczam do rzeczy w których nie da się go zastąpić, czyli #include oraz #ifdef. W C++ to możliwe, bo typowe #define można w zasadzie w 100% zastąpić funkcjami i wartościami constexpr. Jeśli ktoś woli używać tylko C, to eliminacja takich prostych "#define NAZWA wartość" może być problematyczna, więc to też wchodzi w rachubę, może jeszcze jakieś makro-funkcje ale jedynie w najprostszej możliwej postaci. Sklejki zostawiłbym sobie tylko do najbardziej ekstremalnych przypadków (osobiście używam ich raz na sto lat) i tylko gdy naprawdę nie ma alternatywy.

    W każdym razie zauważ, że jak już coś, to raczej powinieneś próbować skleić "GPIO" z literką "B", więc w Twoim nagłówku "LCD_RWPORT" powinno być raczej zdefiniowane jako "B". No ale tak czy siak sensowność tych kombinacji jest zerowa - masz zdefiniowane LCD_RWPORT prawidłowo jako GPIOB, wiec teraz w kodzie zamiast "GPIO(LCD_RWPORT)" używaj po prostu "LCD_RWPORT" i już - problem solved, mniej znaczków, mniej kombinacji, mniejsza szansa błędu, podpowiadanie w składni w używanym IDE będzie działać (bo na tych sklejkach na 99.666% się pogubi) itd. To sklejanie w obecnej formie nie daje Ci absolutnie żadnego zysku, a tylko potencjalne problemy.

    0
  • #5 10 Kwi 2018 22:34
    endju999
    Poziom 3  

    Dziękuję bardzo za w pełni satysfakcjonującą odpowiedz. Poprawiłem wedle wskazówek i wszystko się kompiluje bez błędów.

    0