Suche effizienten C Code?

Gast #51838
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
Gast #51840
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.
#51841
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
#51842
@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
Angehängte Dateien:
Gast #51843
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
#51845
"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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 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.