www.mikrocontroller.net

Forum: Compiler & IDEs C code verständnis Problem


Autor: Alex G. (alex94) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
  if (((data[byte_counter] << bit_counter)&0x80)==0x00) {
      if (half==0) cbi(PORTB,PB1);
      if (half==1) sbi(PORTB,PB1);
  }
  else {
      if (half==0) sbi(PORTB,PB1);
      if (half==1) cbi(PORTB,PB1);
  }
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

Autor: gast der gäste (Gast)
Datum:

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

Autor: C is schee (Gast)
Datum:

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

Autor: MaWin (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Alex G. (alex94) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank, das habe ich dann auch verstanden.

mfg alex

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

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.