Nochmal bitte Funktion vereinfachen???
-
Ich möchte gern wissen ob man eine Funktion vereinfachen kann, aber ich bekomme immer die Meldung "Ihr Beitrag ist potentieller Spam". Wieso kann man keinen Code mehr posten???
-
registrier dich mal
-
Danke! Das ist hiermit geschehen.
So, aber jetzt zu meiner Frage. Ich habe mal wieder eine Funktion *gg* die mir äußerlich nicht gefällt. Könnt ihr mir helfen sie zu vereinfachen?void LEDS_Handler (void) { int i = (int)evaluate_ex(); #ifdef WIN32 printf ("called LEDS_handler %d\n", i); #else if (i & 1) { LED_0_ON(); } else { LED_0_OFF(); } if (i & 2) { LED_1_ON(); } else { LED_1_OFF(); } if (i & 4) { LED_2_ON(); } else { LED_2_OFF(); } if (i & 8) { LED_3_ON(); } else { LED_3_OFF(); } #endif }
LED_X_ON/OFF sind Makros die IO-Ports ein und ausschalten.
Vielen Dank!!!
-
Wenn LED_X_ON/OFF alles Makros sind, läßt sich dann nicht viel vereinfachen (außer vllt. die Block-Klammern weglassen).
Wenn es ein Makro bzw. eine Funktion LED_X(int on_off) gäbe, dann könstest du es ja einfach so aufrufen:
LED_0(i & 1); LED_1(i & 2); ...
Am schönsten wäre natürlich eine Schleife mit Aufruf "LED(x, on_off)".
-
Danke!!! Das ist eine sehr gute Idee. Dann hätte ich nicht so viele if-else in der Funktion.
-
Wenn Du Einfluß auf die Makros hast könntest Du das Makro zu LED_SET(lednr, onoff) umbauen und dann in einer Schleife aufrufen.
-
Ja, auch gut! Leider muß ich zum ein oder ausschalten der LEDs in zwei verschiedene Register eine 1 schreiben. Aber vielleicht mache ich mir eine Funktion dafür!
-
Fred vom Jupiter schrieb:
Leider muß ich zum ein oder ausschalten der LEDs in zwei verschiedene Register eine 1 schreiben.
NXP LPC2xxx-typ, oder?
-
Danke! Das ist hiermit geschehen.
So, aber jetzt zu meiner Frage. Ich habe mal wieder eine Funktion *gg* die mir äußerlich nicht gefällt. Könnt ihr mir helfen sie zu vereinfachen?void LEDS_Handler (void) { int i = (int)evaluate_ex(); #ifdef WIN32 printf ("called LEDS_handler %d\n", i); #else if (i & 1) { LED_0_ON(); } else { LED_0_OFF(); } if (i & 2) { LED_1_ON(); } else { LED_1_OFF(); } if (i & 4) { LED_2_ON(); } else { LED_2_OFF(); } if (i & 8) { LED_3_ON(); } else { LED_3_OFF(); } #endif }
LED_X_ON/OFF sind Makros die IO-Ports ein und ausschalten.
Vielen Dank!!!
-
War nur zum test.
bei mir kommt da keine Spamwarnung
-
Das hättest du in Assembler aber eleganter lösen können.
-
hast du dir den account nur zum trollen angelegt?
-
Nein, ich meine die bit-operationen. Es gibt gewisse Assembler mnemonics die genau darauf ausgelegt sind um bestimmte bit states auszulesen, zu setzen etc. Das dürfte schneller sein als über ein bitwise or. (glaub ich zumindest)
-
du schrieb:
Nein, ich meine die bit-operationen. Es gibt gewisse Assembler mnemonics die genau darauf ausgelegt sind um bestimmte bit states auszulesen, zu setzen etc. Das dürfte schneller sein als über ein bitwise or. (glaub ich zumindest)
kann aber auch sein, dass der compiler den code genau für diese bit set/clear befehle erzeugt.
-
Bouncer schrieb:
du schrieb:
Nein, ich meine die bit-operationen. Es gibt gewisse Assembler mnemonics die genau darauf ausgelegt sind um bestimmte bit states auszulesen, zu setzen etc. Das dürfte schneller sein als über ein bitwise or. (glaub ich zumindest)
kann aber auch sein, dass der compiler den code genau für diese bit set/clear befehle erzeugt.
Das glaube ich kaum. Schließlich erzeugt der Compiler aus einem Konsolen-Adressbuch keinen Webbrowser.
EDIT: Die Optimierlaune der compiler in allen Ehren aber ich glaube kaum, dass das OR mnemonic in das BT mnemonic mit den jeweiligen operanden umgewandelt wird.
BT, BTC, BTR und BTS heissen diese mnemonics die auf der x86 Platform es einem ermöglichen, einfach bits zu setzen.
-
ich weiss ja nicht, wass die x86-compiler so machen, aber IAR und metrowerks compiler verwenden gnadenlos bitoperationen.
-
statt:
if (i & 1) { LED_0_ON(); } else { LED_0_OFF(); }
lieber:
(i & 1) ? LED_0_ON() : LED_0_OFF();
oder mit switch case
-
Ja, weil weniger Zeilen ist *wtf*, und *wtf* ist direkt in Performance zu messen. Mit anderen Worten: Schwachfug.
@ du: Bitte such dir ein anderes Forum. Danke.