Forum: Mikrocontroller und Digitale Elektronik Suche effizienten C Code?


von Sebastian__ (Gast)


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

von Peter D. (peda)


Lesenswert?

Effizienter geht es nicht.

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


Peter

von crazy horse (Gast)


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.

von Peter D. (peda)


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

von Peter D. (peda)


Angehängte Dateien:

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

von Sebastian__ (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

a ? x : y

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

von Peter D. (peda)


Angehängte Dateien:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.