C code verständnis Problem

OP Persönliche Seite #1350552
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
Gast #1350566
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).
Gast #1350580
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.
Gast #1350634
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... ;-)
Gast #1350672
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
Persönliche Seite #1350765
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren