mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Suche effizienten C Code?


Autor: Sebastian__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin gerade am Coden und suche eine möglicht optimale variante um
eine LED oder einen Port Per Funtion ider #define ein bzw.
auszuschalten.

das war mein ansatz:


#define LedOn()    PORTA |= (1<<BitLed)
#define LedOff()  PORTA &= (0<<BitLed)

----->

//eine 1 für an, eine 0 für off
#define LedOnOff(x)    PORTA = ?????????

so geht es zwar aber ich denke es ist nicht so effizient:
void LedOnOff(char x){
  if(x==1)
      LedOn();
  else
      LedOff();
}

was ist dafür der Effizenteste Code,.. der quellcode sollte so
kompatibel wie möglich sein, um ihn bei verschiedenen  Compilern nur
mit minimalen änderungen nutzen zu können. (AVR, MSP, HC08,..)

Danke

MfG
Sebastian

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Effizienter geht es nicht.

Der Compiler ist nicht ganz so blöde, d.h. er berechnet alle konstanten
Ausdrücke sofort.


Peter

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mal ne Frage am Rande:
Hat wirklich schon mal jemand ein C-Programm von einem auf einen völlig
anderen MC portiert, also nicht so zum Spass, sondern weil notwendig?
Ich habs noch nie gemacht, und auch noch nie Bedarf dafür gehabt.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komplette Programme wohl nicht, aber einzelne Unterprogramme schon.

Warum soll man das Rad immer neu erfinden.

Z.B. meinem Scheduler in der Codesammlung sieht man die Herkunft vom
8051 noch an.

Allerdings habe ich für das Portieren nach AVR geschlagene 10 Sekunden
gebraucht :-)


Peter

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian,

Deine Macros sind falsch.
Eine 0 zu schieben hat keinen Effekt.

Anbei der richtige Code und das ganze als Macro.
Bei konstanten Ausdrücken ist das Macro kürzer als die Funktion.

Macros und deren Parameter auch grundsätzlich komplett klammern. Sonst
gibts Ärger bei verschachtelten Macros oder zusammengesetzten
Ausdrücken.


Peter

Autor: Sebastian__ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
danke für die korrkeur, ich habe den fehler vorhin auch schon gefunden.
war wohl schon etwas früh g

aber was genau macht diese zeile:
#define LedOnOffM(x)    ((x) ? LedOn() : LedOff())

wozu ist das "?" zeichen, wie genau funkt. die zuweisung von x an die
variablen LedOn() und LedOff().
Ich habe n meinem C Buch nix darübergefunden.

Ich muss meinenen Code teileweise für avr, 851 und HC08 schreiben. wenn
der Code Ordentlich geschrieben ist reicht es meistends die Defines mit
den richtigen Vriablen zu füllen zb. AVR --> HC08 PORTA -->PTA.

MfG
Sebastian

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
a ? x : y

Wenn a ungleich 0, werte x aus, ansonsten werte y aus. Kann als Ersatz
für "if" verwendet werden.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:
  • C.txt (1,66 KB, 96 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
"wozu ist das "?" zeichen"

Sollte man als C-Programmierer kennen.
Anbei die BC-Hilfe dazu.

Nachfolgend der Auszug aus dem Listing des WINAVR:

LedOnOff(1);
72:   81 e0           ldi     r24, 0x01       ; 1
74:   f3 df           rcall   .-26            ; 0x5c
LedOnOffM(1);
76:   c5 9a           sbi     0x18, 5 ; 24
LedOnOffM(0);
78:   c5 98           cbi     0x18, 5 ; 24

Er hat also wirklich alles gemacht, was zur Compilezeit zu machen war.


Peter

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.