Gast
#5865377
In der Arduino Software findet sich im Beispiel "Blink without Delay" folgender Codeschnipsel:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Wäre es nicht sinnvoll, diesen durch
1 | |
zu ersetzen?
|
Anzeige
|
unineffizienter Code in Arduino Beispiel "Blink without Delay" ?
Gast
#5865377
In der Arduino Software findet sich im Beispiel "Blink without Delay" folgender Codeschnipsel:
Wäre es nicht sinnvoll, diesen durch
zu ersetzen?
Gast
#5865378
Karli schrieb: > ledState = !ledstate; Es hätte ledState = !ledState; heißen müssen.
Gast
#5865381
Karli schrieb: > Wäre es nicht sinnvoll, diesen durch ledState = !ledstate; > zu ersetzen? Ja. Alleine schon wegen der Schreibfaulheit. Woran machst du fest, was "uneffizienter code" ist? Am Schreibaufwand? Am vermuteten erzeugten Code? An der Lesbarkeit? Es wird am Ende derselbe Maschinencode herauskommen :-)
Gast
#5865383
unineffizienter Code ergibt effizienter Code Aber zum Thema. Das ist ein Beispiel. Das soll Verständlich für Anfänger sein.
Gast
#5865388
>Es wird am Ende derselbe Maschinencode herauskommen :-)
Das ist nicht richtig.
Wenn LOW = 0 und HIGH = 1 wird ledState 0 oder 1.
Im zweiten Beispiel wird ledState 0 oder 0xFF wenn ledState uint8_t ist.
Beitrag #5865391 wurde von einem Moderator gelöscht.
Gast
#5865400
holger schrieb: > Das ist nicht richtig. > Wenn LOW = 0 und HIGH = 1 wird ledState 0 oder 1. > Im zweiten Beispiel wird ledState 0 oder 0xFF wenn ledState uint8_t ist. Wohl kaum, mal in einem C-Buch den Unterschied zwischen logischer und Bit-Negierung nachlesen.
Gast
#5865424
Die "Verbesserung" funktioniert nur identisch, wenn LOW 0 ist und HIGH 1 oder umgekehrt. Bei allen anderen Werten (evtl gibt es ja OFF, LOW, MEDIUM, HIGH?) klappt das "!" nicht. Der Sinn und Zweck von benamten Konstanten ist es ja, dass einem der konkrete Wert nicht interessiert. Durch das "!" machst du genau das Gegenteil, du verlässt dich auf konkrete Werte. Bei numerischem LOW/HIGH (und nur die beiden) ginge:
Ob das aber, insbesondere für Anfänger, lesbarer wäre?
Gast
#5865426
wie wär's mit led = led ^ 1 ? :) oder auch led ^=1
Gast
#5865445
Arduino Fanboy D. schrieb im Beitrag #5865391:
> Es ist int.
Dann poste bitte den relevanten Code.
Karli schrieb: > Wäre es nicht sinnvoll, diesen durch ledState = !ledstate; > zu ersetzen? Die Frage ist eher, was der bezweckte Sinn ist. Ist es, möglichst "effizienten" Code zu schreiben, oder Anfängern die Sprache beizubringen?
Gast
#5865461
Karli schrieb: > Wäre es nicht sinnvoll, Komplett auf die Variable zu verzichten und das Bit im Ausgangsregister zu toggeln?
Gast
#5865464
googoo schrieb: > wie wär's mit led = led ^ 1 ? :) > oder auch led ^=1 Ich würde bit-weise invertieren, dann kann man die anderen PortPin's noch für andere Zwecke verwenden.
Durch Addition, z.B. (PP3+PP5+PP7), können mehrere PortPin's angesteuert werden.
Gast
#5865466
GEKU schrieb: > #define PP6 = 0x04,; > #define PP7 = 0x08; natürlich:
Gast
#5865476
#define in dem Zusammenhang ist Rückschritt. Dann lieber den originalen Syntax.
Gast
#5865513
The Mule schrieb: > #define in dem Zusammenhang ist Rückschritt. Dient nur zur Erklärung. Man kann natürlich auch eine Konstante definieren. Reine Geschmackssache!
Gast
#5865514
The Mule schrieb: > Dann lieber den originalen > Syntax. Und wie wurde LOW & HIGH definiert? GEKU schrieb: > port ~= PP5; // für PortPin 5 was soll das tun? das wäre ja ausgeschrieben
Ich würde sowas wie missing operator erwarten. Oder ist ~ in CPP anders definiert? --- Probieren --- GCC (C) sagt: error: expected ';' before '~' token
Gast
#5865535
Liebe Leute, aller Arduino Quellcode liegt im Internet öffentlich aus. GEKU schrieb: > Und wie wurde LOW & HIGH definiert? https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Arduino.h und: A. S. schrieb: > Arduino Fanboy D. schrieb im Beitrag #5865391: >> Es ist int. > > Dann poste bitte den relevanten Code. https://github.com/arduino/Arduino/tree/ee1967cd530ceb9a1d638875e385157e90d532e8/build/shared/examples/02.Digital/BlinkWithoutDelay ---------- Ich finde das Beispiel übrigens auch nicht sonderlich schön. Und hätte sicherlich bool als Datentype für die Variable verwendet.
Gast
#5865537
GEKU schrieb: > natürlich:#define PP6 = 0x40; > #define PP7 = 0x80; ? ? ? Was soll das = da, oder das ; Welche Sprache ist das? Andre schrieb: > Karli schrieb: >> Wäre es nicht sinnvoll, > > Komplett auf die Variable zu verzichten und das Bit im Ausgangsregister > zu toggeln? Oder noch effizienter: Die LED direkt an einen Timer-PWM hängen, dann blinkt die sogar ohne Code (und der TO lernt, wie man einen Timer aufsetzt) VG Roland Sowas geht auch
Gast
#5865619
Oder ganz easy.. ledState = !ledState?HIGH:LOW; wäre nach dem Beispiel gekürzt: digitalWrite(ledPin, (!ledState?HIGH:LOW));
Gast
#5865628
GEKU schrieb: > Ich würde bit-weise invertieren GEKU schrieb: > port ~= PP5; // für PortPin 5 Was du meinst ist XOR, ^ Die Tilde die du verwendest ist Bitweise-Invertieren und ein unärer Operator, dh. er erwartet EINEN Operanden zB ~ 00 ergibt FF ~ 88 ergibt 77 usw Theoretisch müsste "port~=;" funktionieren ;) kann das aber grad nicht testen;) Philipp_K59 schrieb: > wäre nach dem Beispiel gekürzt: > > digitalWrite(ledPin, (!ledState?HIGH:LOW)); Eher so.. bin da nicht so der Short-If Profi. digitalWrite(ledPin, (ledState=!ledState?HIGH:LOW)); Irgendwie komme ich mit dem Hingucken einfach nicht nach! Ich assoziiere "Blink" mit etwas, was man sehen kann. Die Code-Fragmente flackern mir zu schnell. Der Ansatz: "Ohne Delay" ist ein Witz, wenn dieses einfach, ersatzlos weggelassen wird. Karli schrieb: > In der Arduino Software findet sich im Beispiel "Blink without Delay" > folgender Codeschnipsel: >
> Wäre es nicht sinnvoll, diesen durch >
> zu ersetzen?
Was genau wäre dadurch gewonnen?
Der generierte Maschinencode wird genau der gleiche sein.
Gast
#5865646
Sebastian S. schrieb: > Der Ansatz: "Ohne Delay" ist ein Witz, wenn dieses einfach, ersatzlos > weggelassen wird. Die Idee dahinter ist, den Code für´s Bit-Toggeln so ineffizient langsam zu machen, daß ein extra Delay unnötig wird :P
Gast
#5865648
Mark B. schrieb: > Der generierte Maschinencode wird genau der gleiche sein. Es geht grundsätzlich um eine Designentscheidung: Kurz-und-knapp-mathematisch oder eher in Prosaform. Spätestens wenn man ein Programm mit sagen wir 300 Zeilen durcharbeiten (zB Bugs finden) muss, macht es nen Unterschied ob es 300 oder 1500 Zeilen sind (sprich 3000, 30000 Zeilen usw obwohl das dann schon pervers ist) gurgl schrieb: > Mark B. schrieb: >> Der generierte Maschinencode wird genau der gleiche sein. > > Es geht grundsätzlich um eine Designentscheidung: > Kurz-und-knapp-mathematisch oder eher in Prosaform. > > Spätestens wenn man ein Programm mit sagen wir 300 Zeilen durcharbeiten > (zB Bugs finden) muss, macht es nen Unterschied ob es 300 oder 1500 > Zeilen sind Wenn die einzelnen Funktionen kurz und übersichtlich sind, weil man vernünftig programmiert hat, ist es relativ egal ob die gesamte Software nun aus 300 oder 3.000 Zeilen Code besteht. Code wird jedenfalls nicht automatisch besser, wenn man mehr davon in eine Zeile packt. In dem Beispiel oben mag es okay sein, aber oft genug führt "Zeilenquetscherei" eher zu schlechter lesbarem und wartbarem Code.
Gast
#5865664
Philipp_K59 schrieb: > Oder ganz easy.. > > ledState = !ledState?HIGH:LOW; ? ? ledState = !(ledState?HIGH:LOW); ledState = (!ledState)?HIGH:LOW; ledState = ledState?LOW:HIGH); ledState = !ledState; Naja, ob der Trenäre Operator in einem "Blink without delay" gut aufgehoben ist, möchte ich bezweifeln.
Gast
#5865686
Mark B. schrieb: > aber oft genug > führt "Zeilenquetscherei" eher zu schlechter lesbarem und wartbarem > Code. Das liegt immer am Programmierer selbst.
Gast
#5865689
Arduino Fanboy D. schrieb: > Trenäre Operator ledState = (ledState == HIGH) ? LOW : HIGH ; da müsste ich jetzt auch 2 mal hinsehen, schön isses nicht aber wenn schon so dann so.
Gast
#5865699
vodoo schrieb: > (ledState == HIGH) vodoo schrieb: > aber wenn schon so dann so. Da bin ich gegen... Ein Vergleich mit HIGH ist unsinnig, wenn die Variable sowieso nur HIGH und LOW werden kann. (ledState == HIGH) Würde zu (HIGH == HIGH) oder (LOW == HIGH) Einfach nur (ledState) ist an der Stelle völlig ausreichend (Die Klammern sind auch noch über)
Gast
#5865723
Arduino erregt die Geister Ah , die kostbare Zeit !!!
Gast
#5865732
Arduino ist gut! Ebenso Bascom!
Gast
#5865747
Arduino Fanboy D. schrieb: > (Die Klammern sind auch noch über) klammern waren ja wegen dem vergleich und an dem würde ich unbedingt festhalten da sich ja high, low verändern könnten in anderen arduinoversionen, so ist dat sicher! Nehmt den Arduino, er ist sehr gut!
Gast
#5865754
vodoo schrieb: > so ist dat sicher! Ob du hier ledState = (ledState == HIGH) ? LOW : HIGH ; oder ledState = ledState == HIGH ? LOW : HIGH ; oder ledState = ledState ? LOW : HIGH ; oder ledState = not ledState; schreibst ist völlig irrelvant. Komme was wolle
Beitrag #5865771 wurde von einem Moderator gelöscht.
Gast
#5865777
Karl Max schrieb im Beitrag #5865771: > und/oder in der Variablendeklaration Wenn das auf meinen Mist gewachsen wäre, würde sicherlich sowas da stehen: > bool ledState;
Gast
#5865803
Man sollte sich den ganzen Code ansehen:
Karli schrieb: > Wäre es nicht sinnvoll, diesen durch ledState = !ledstate; > zu ersetzen? Am besten kuckt man Assembler-Code von beiden übersetzten Varianten. Ich denke, deine Variante erzeugt mehr Code, da zuerst Pin-Zustand gelesen sein muß, danach invertiert und wieder in Port geschrieben. Etwa so:
insgesamt 4 Word 4 Cycles Wenn einfach auf 0 oder 1 setzen, dann wird für die meisten ATMega-Ports kürzere Behehl von Compiler gewählt. Z.B.
oder
Jeweils 1 Word 2 Cycles. Das ist immer so: wenn zu Compilieren-Zeit alle Daten bekannt sind, bekommt man kürzere Maschinencode als mit Variablen.
Gast
#5865816
Maxim B. schrieb: > Ich denke, deine Variante erzeugt mehr Code, da zuerst Pin-Zustand > gelesen sein muß, danach invertiert und wieder in Port geschrieben. Da ist nix mit Port! Eine einfache Variable, es ist. Ist ledState eine Variable in RAM, die nichts außen macht? Wenn man damit LED ansteuern will, dann ist das bestimmt Portpin. Es ist besser, keine Variablen dort zu benutzen, wo es um im voraus bekannte Ports geht. So wird Programm schneller und kürzer. Sonst bekommen wir 2000 Worte in Code, wo auch 5 genügt.
Gast
#5865833
Farim schrieb: > Man sollte sich den ganzen Code ansehen: Oer es gleich anders machen....
Natürlich kann die Ausgabe durch direkte Registerzugriffe deutlich
beschleunigt werden.
> PORTB = _BV(PB5); // toggelt den Pin in einem Takt
Gast
#5865843
Arduino Fanboy D. schrieb: > Natürlich kann die Ausgabe durch direkte Registerzugriffe deutlich > beschleunigt werden. >> PORTB = _BV(PB5); // toggelt den Pin in einem Takt Möp. Dazu musst du das PINB Register beschreiben. Aber erkläre das mal einem Prinzipienreiter (wenn man einen Output machen will, soll das auch so heissen ...).
Gast
#5865848
Stefanus F. schrieb: > Möp. Dazu musst du das PINB Register beschreiben. Da hast du wahr! Arduino Fanboy D. schrieb: >> PORTB = _BV(PB5); // toggelt den Pin in einem Takt PINB = _BV(PB5); // toggelt den Pin in einem Takt Muss es heißen.
Gast
#5865987
gurgl schrieb: > Was du meinst ist XOR, ^ Der Unterschied zwischen ^ und ~ ist: ^ ändert das ganz Port (XOR) und ~ nur ein Bit (NOT) https://de.m.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorität
Gast
#5865995
GEKU schrieb: > Der Unterschied zwischen ^ und ~ ist: > > ^ ändert das ganz Port (XOR) und > ~ nur ein Bit (NOT) Bitte poste keinen Unsinn. leo
Gast
#5866035
Sorry die Hitze leo schrieb: > Bitte poste keinen Unsinn.
Gast
#5866074
Wenn ich beim Arduino schnell nen einfachen Blinker brauche, nehm ich folgende Zeile: digitalWrite(LED_BUILTIN, millis() & 0x80); // Blinken mit 4Hz Takt Hummelfan schrieb: > Wenn ich beim Arduino schnell nen einfachen Blinker brauche, nehm ich > folgende Zeile: > digitalWrite(LED_BUILTIN, millis() & 0x80); // Blinken mit 4Hz Takt Das erinnert mich an den "Blink-Merker" bei der S7 ;-) Hummelfan schrieb: > Wenn ich beim Arduino schnell nen einfachen Blinker brauche, nehm ich > folgende Zeile: > digitalWrite(LED_BUILTIN, millis() & 0x80); // Blinken mit 4Hz Takt Klar: man kann auch mit einem Mikroskop statt Hammer die Nägel einschlagen...
Gast
#5868720
Mark B. schrieb: > Wenn die einzelnen Funktionen kurz und übersichtlich sind, weil man > vernünftig programmiert hat, ist es relativ egal ob die gesamte Software > nun aus 300 oder 3.000 Zeilen Code besteht. Das sehe ich genauso. Auch 30.000 Zeilen kann man noch nach Lehrbuch coden, so mit McCabe einstellig und nur eine Bildschirm-Seite. Skalieren tut es aber (leider) nicht. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|