Preprozessor

OP #283121
Lesenswert?
• ▲
▼
Hi @all,

warum funktioniert folgender Code nicht?

funktioniert nicht:
/*
#define HAL_PortInit(byPort, byValue)                 \
   #if (byPort == P0)                                 \
      DDRB = byValue;                                 \
   #else if (byPort == P1)                            \
      DDRC = byValue;                                 \
   #else if (byPort == P2)                            \
      DDRD = byValue;                                 \
   #else                                              \
      #message ("HAL_PortInit: unknown Port")         \
  #endif

*/

funktioniert:

#define HAL_PortInit(byPort, byValue)                 \
   if(byPort==P0) DDRB = byValue;                     \
   else if(byPort==P1) DDRC = byValue;                \
   else if(byPort==P2) DDRD = byValue;                \
   else HAL_ByteSend(USART, 'E');

hat mir dazu jemand ne erklärung?? Vor allem find ich die erste
Variante auch schöner!

Gruß Uwe
#283122
Lesenswert?
• ▲
▼
Mir ist ja schonmal nicht ganz klar, warum du den Präprozessor benutzt,
um ne Funktion anzulegen...

Du schreibst ne Funktion, die dir vom Application Layer aus erlaubt,
auf die Hardware zuzugreifen. Dazu brauchst du auch Funktionen, die
aufrufbar sind. Der Präprozessor greift vor dem Compilieren und ihm ist
nicht bekannt, welche Werte du übergibst...

Vielleicht solltest du mal nach nem Style Guide programmieren, dann
würde dir die 2. Variante auch eher "gefallen":

if(bla = bla)
   {
   mache dies;
   }
else if .....
Gast #283124
Lesenswert?
• ▲
▼
Noch besser:

switch(byPort)
   {
   case P0:
        DDRB = byValue;
        break;
    case P1:
        DDRC = byValue;
        break;
    case P2:
        DDRD = byValue;
        break;
    default:
        message ("HAL_PortInit: unknown Port")
        break;
    }

Und was ist damit gemeint???
#define HAL_PortInit(byPort, byValue)
OP #283125
Lesenswert?
• ▲
▼
Hi Frank und Daniel,

ich weiß das es kein besonders guter Stil ist nicht direkt eine
Funktion zu schreiben, aber dadurch das ich den Preprozessor
"mißbrauche" bekomme ich den minimalen Code wenn ich
HAL_PortInit(P0,0xFF) aufrufe. Der Preprozessor minimiert dann meinen
Code zu

13:          HAL_PortInit(P1,0xFD);
+00000045:   EFAD        LDI     R26,0xFD         Load immediate
+00000046:   B9A7        OUT     0x07,R26         Out to I/O location

mit einer Funktion würde er nen call machen und die switch bzw. if
Anweiungen einfügen, usw. Für die einfache Initialisierung des Ports
schreib ich dann einfach direkt DDRB = 0xFF. Allerdings wollte ich
genau das verhindern ... Hardwareabhängiger Code in der main! Darum die
HAL (Hardware abstraktion Layer) ... oder ist das nur Wunschdenken? Die
2. Variante funktioniert ja?!?

Gruß Uwe
#283127
Lesenswert?
• ▲
▼
Deine 2. Variante funktioniert deshalb, weil dein #define nicht
HAL-PortInit() definiert, sondern irgendwas anderes macht.

So, wie du es geschrieben hast, ist es eine Funktion mit dem
Rückgabewert void.

Nochmal: Die HAL stellt Funktionen zur Verfügung, die vom Application
Layer benutzt werden können, um die Hardware anzusprechen. Allerdings
wird die HAL vorher compiliert und dann erst als Bibliothek zu deinem
Application Layer dazugelinkt. Somit kommen Präprozessoranweisungen vom
AL schon gar nicht zur HAL.

Wenn du also wirklich ne Trennung machen willst, dann vergiss das mit
dem Präprozessor und dem kleinsten Code...

Schreib ne HAL, die alle Hardwarefunktionen zur Verfügung stellt. Und
schreib sie so, als würde der HAL-Entwickler den AL-Entwickler nicht
kennen. Der AL-Entwickler bekommt vom HAL-Entwickler nur die
HAL-Bibliothek, die er dann zu seiner Application dazulinkt, ebenso wie
ne Header, in der alle Funktionsprototypen der HAL (und was man sonst
noch so braucht) deklariert sind. Und ne Dokumentation, wie welche
Funktion anzuwenden ist. ;)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.