C code verständnis Problem

OP Persönliche Seite #1350552
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 #1350562
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 ...
Gast #1350566
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
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
> 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
>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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.