Forum: Compiler & IDEs C code verständnis Problem


von Alex G. (alex94) Benutzerseite


Lesenswert?

Hallo,
ich hab hier einen Source Code von einem Freund liegen. Leider hat er 
mir verboten den vollständigen Code im Internet zu veröffentlichen :(

Ich möchte diesen Source Code jetzt verstehen. Leider bin ich in C noch 
ein Anfänger (Ok. Die Basic's kann ich). Den Code habe ich soweit 
verstanden nur bei folgendem Abschnitt weiß ich nicht was der Code 
macht.
1
  if (((data[byte_counter] << bit_counter)&0x80)==0x00) {
2
      if (half==0) cbi(PORTB,PB1);
3
      if (half==1) sbi(PORTB,PB1);
4
  }
5
  else {
6
      if (half==0) sbi(PORTB,PB1);
7
      if (half==1) cbi(PORTB,PB1);
8
  }
Ok. ich weiß das das eine If else Anweisung ist aber mehr auch nicht.

Ich wollte jetzt Fragen ob mir jemand erklären kann was da passiert.

Vielen Dank für eure Antworten.

mfg alex

von gast der gäste (Gast)


Lesenswert?

vielleicht wären die funktionen cbi und sbi auch von essentieller 
bedeutung, aber ich denke mal das wird set and clear bit heißen ;)

schau dir mal die sfr's deines prozessors an ...

von C is schee (Gast)


Lesenswert?

Einmal wird Port B, Pin 1 gelöscht und einmal wird es gesetzt, je 
nachdem welchen Wert die Variable half hat. Wenn die allererste 
Bedingung nicht erfüllt wird, ist es genau umgekehrt (mit dem Setzen und 
Löschen).

von MaWin (Gast)


Lesenswert?

bit_counter läuft von 0 (für das höchstwertige) bis 7 (für das 
niederwertigste bit), byte_counter ab 0, data ist ein Array 
(Speicherbreich) voller Datenbytes in denen jedes Bit eine Bedeutung 
hat.

Das nächste bit im data array bestimmt, ob Pin1 von Port B auf 1 gesetzt 
oder auf 0 gelöscht wird, wenn half TRUE ist, genau umgekehrt als in 
data gespeichert.

Schönes Beispiel, wie man in der schönen Hochsprache C dutzende von (für 
dich unverständlichen) Zeilen schreibt, dem Prozessor hunderte von 
Maschinenzyklen aufhalst, obwohl es um simpelste Dinge geht, die man in 
Assembler mit wenigen Befehlen gelöst hätte.

von Rolf Magnus (Gast)


Lesenswert?

> Schönes Beispiel, wie man in der schönen Hochsprache C dutzende von
> (für dich unverständlichen) Zeilen schreibt,

Ich sehe hier acht Zeilen.

> dem Prozessor hunderte von Maschinenzyklen aufhalst, obwohl es um
> simpelste Dinge geht, die man in Assembler mit wenigen Befehlen gelöst
> hätte.

Mit wenigen Dutzend unverständlichen Zeilen... ;-)

von Oliver (Gast)


Lesenswert?

>Schönes Beispiel, wie man in der schönen Hochsprache C dutzende von (für
>dich unverständlichen) Zeilen schreibt,

Nun ja, vermutlich wäre das in Assembler für den TO noch 
unverständlicher gewesen. Sind immerhin 5 if's und ein else, sowas sieht 
in Assembler immer etwas wirr aus.

>...dem Prozessor hunderte von
>Maschinenzyklen aufhalst, obwohl es um simpelste Dinge geht, die man in
>Assembler mit wenigen Befehlen gelöst hätte.

Na ja, ob du in Assembler viel kürzer hinbekommen würdest, als das, was 
der Compiler daraus macht, bezweifele ich. Einzig das << übersetzt der 
gcc etwas seltsam.

Oliver

von Alex G. (alex94) Benutzerseite


Lesenswert?

Vielen dank, das habe ich dann auch verstanden.

mfg alex

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Alex Peterson schrieb:

> Ich wollte jetzt Fragen ob mir jemand erklären kann was da passiert.
>
> Vielen Dank für eure Antworten.

Es werden wohl -- auf eine recht ineffiziente Art -- Bits auf einen 
Port-Pin rausgewackelt, wahrscheinlich für eine Soft-SPI oder zu 
Portexpandern hin.

Im Endeffekt ist's ein

 PortB1 = half EXOR (NOT Bit)

wobei Bit (vemutlich) die Bits 7...0 von data[byte_counter] durchläuft.

Freund sind auch nicht mehr das, was sie mal waren... Früher hätte man 
nen Freund einfach fragen können, anstatt Reverse-Engineering zu 
betreiben...

Johann

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.