www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Preprozessor


Autor: Uwe M. (lifthrasil)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Erdrich (erdi-soft)
Datum:

Bewertung
0 lesenswert
nicht 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 .....

Autor: Frank Erdrich (erdi-soft)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm, sorry, sollte if(bla == bla) heißen

Autor: Daniel Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Uwe M. (lifthrasil)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs denn damit:
#define P0 DDRB
#define P1 DDRC
#define P2 DDRD
#define HAL_PortInit(x,y) x = y
...
HAL_PortInit(P1,0xFD);


Peter

Autor: Frank Erdrich (erdi-soft)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.