Forum: Mikrocontroller und Digitale Elektronik Frage zu Controller Code , Verständnis


von Steffen (Gast)


Lesenswert?

Hallo,

ich habe einmal die ein oder andere Frage zu dem folgenden Code. Da 
steige ich noch nicht so ganz durch.
1
#define GETB (wert, get) ( (wert >> get) & 0xFF )
2
#define GETB16(wert) GETB (wert, 0), GETB (wert, 8)
3
#define GETB32(wert) GETB (wert, 0), GETB (wert, 8), GETB (wert, 16), GETB (wert, 24)
4
#define FUNC(in, sin, num, wert) 0x43 | ((4-num)<<2), GETB16(in), sin, GETB32(wert)
5
#define FUNC4(in,sin,num,ad1,ad2,ad3,ad4) 0x43 | ((4-num)<<2), GETB16(in), sin, ad1, ad2, ad3, ad4

Also das erste #define würde ich mal wie folgt umschreiben:
1
unsigned char GETB(unsigned char wert, unsigned char get)
2
{
3
      unsigned char hilf;
4
      
5
      hilf= (wert >> get) & 0xFF;
6
      return hilf;
7
}

Allerdings hört es bei dem zweiten #define auch schon wieder auf. 
Anfangen würde ich da wie folgt:
1
unsigned char GETB16(unsigned char wert)
2
{
3
     unsigned char hilf;
4
     hilf= GETB (wert, 0);
5
     hilf= GETB (wert, 8); ? hier dürfte dann aber etwas nicht ganz passen
6
     return hilf;
7
}

Ist das erst einmal so grundsätzlich richtig verstanden und der Anfang 
richtig?

Wie würde man denn dann bei der zweiten Funktion das alles in die 
Hilfsvariable packen?

Gruß am Sonntag

von Sam .. (sam1994)


Lesenswert?

Das 2. Makro kannst du nicht umschreiben. Es gibt nämlich nicht einen 
Wert zurück, sondern 2 getrennt per Komma.
Das kann eigentlich nur für eine Funktion nützlich sein. Das Komma als 
Operator verwirft alle Audrücke bis auf den Letzten.

Um das dennoch in eine Funktion zu packen, müsste man ein bisschen mehr 
als nur die Defines umschreiben.

von Steffen (Gast)


Lesenswert?

Hallo,
vielleicht wird es etwas klarer, wenn ich etwas mehr des Codes angebe. 
Die Makros werden für Folgendes verwendet:
1
unsigned char Tab[] = {
2
3
FUNC(0x1000, 0x00, 1, 0x111),
4
5
FUNC(0x1114, 0x00, 1, 0x00000144),
6
7
FUNC(0x1214, 0x00, 1, 0x00000133),
8
9
10
...
11
}

In welcher Form werden denn dann die zwei Werte des Makros 
zurückgegeben? Wäre klassen, wenn das jemand erklären könnte.

Gruß

von Sam .. (sam1994)


Lesenswert?

Das MAkro ersetzt den Code mit dem seinen. Das geschieht jedoch bei der 
Compilierung. Funktionen werden zur Laufzeit ausgeführt! Für so etwas 
ist das Makro genau richtig. Warum möchstet du denn eine Funktion haben?

von Karl H. (kbuchegg)


Lesenswert?

Diese Makros kannst du nicht in Funktionen umschreiben.
Diese Makros dienen dazu, sich die Schreibarbeit beim schreiben einer 
Tabelle
1
unsigned char Tab[] = {
2
  ...

zu vereinfachen und eine etwas bessere logische Struktur im Quelltext zu 
haben.
Die Makros haben die Aufgabe daraus
1
  FUNC(0x1000, 0x00, 1, 0x111),
eine entsprechende Bytesequenz zu generieren, mit der dann das Array 
initialisiert wird.

Aus dem obigen wird nach dem Präprozessorlauf
1
unsigned char Tab[] = {
2
3
  0x43 | (( 4-1) << 2), 0x00, 0x10, 0x00, 0x11, 0x01, 0x00, 0x00,

Das ist Makroeinsatz, so wie er gedacht war: Clevere Editoranweisungen, 
so dass der Editor (der Präprozessor) den Code so erzeugt, wie ihn der 
Programmierer haben will.

von Steffen (Gast)


Lesenswert?

Hallo,

also die Makros dienen einfach dazu, den Code zu vereinfachen, weil man 
sonst wer weiß wieviel Code hätte, um
1
unsigned char Tab[] = {...

zu füllen  und somit den gesamten Code übersichtlicher zu machen. Das 
ist also quasi eine codesparende Programmierung?

Ich wollte nicht unbedingt eine Funktion haben, ich dachte halt nur, 
dass man das besser verstehen kann, wenn man das in eine Funktion 
umschreibt. Ich wusste aber nicht, dass durch die Makros halt an 
entsprechender Stelle schon beim Kompilieren qasi ersetzt wird.

Vielen Dank!

Gruß

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Steffen schrieb:
> also quasi eine codesparende Programmierung

Sieh es als Codegenerierung an. Sparen im Sinne von CodeSpace tut man 
nix, der wird eh ersetzt bevor der Compiler ran darf.

Vor allem wird so verhindert das man etwas falsch macht (Tippfehler) 
oder etwas wegläßt. Außerdem kann der Compiler die Konstanten so 
vor-berechnen, bei einem Funktionsaufruf kann dies (meistens) nicht 
geschehen.

von Steffen (Gast)


Lesenswert?

Velen Dank.

Ich werde mir das mit den Makros und dem Compilerlauf usw. nochmal 
allgemein ansehen, um mic da mal noch etwas einzuarbeiten.

Vielen Dank!

Grüße

von Karl H. (kbuchegg)


Lesenswert?

Steffen schrieb:

> umschreibt. Ich wusste aber nicht, dass durch die Makros halt an
> entsprechender Stelle schon beim Kompilieren qasi ersetzt wird.

Das ist ein gängiges Missverständnis.
Sieh den Präprozessor als eine Art Editor, also das Teil, mit dem du 
deinen Code in Textform schreibst. Du bedienst deinen Editor manuell, in 
dem du zb manuell die Funktion "Suchen und Ersetzen" aufrufst und die 
entsprechenden Angaben in einer Dialogbox machst.
Der Präprozessor ist im Grunde auch nichts anderes als so ein Editor. 
Nur gibst du die Kommandos nicht interaktiv/manuell sondern du schreibst 
die Anweisungen trickreicherweise in den Text selber hinein und der 
Präprozessor holt sie sich von dort und führt sie aus indem er den 
nachfolgenden Text entsprechend den Anweisungen verändert.
Etwas vereinfacht gesagt, ist das was du mit "Suchen und Ersetzen" 
manuell machst in Präprozessor Syntax ein
1
#define  Suchtext   Ersetzungstext
direkt im Quelltext. Die Details sind ein wenig trickreicher aber im 
Grunde ist das genau das (Das Suchen und Ersetzen) was ein Makro macht.

von Steffen (Gast)


Lesenswert?

Hallo,

vielen Dank! Sehr einleuchtend und anschaulich erläutert.

Vielen Dank! Ich glaube, da hab ich noch ein wenig was zu tun.....also 
zu lernen :)

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.