Halllo, ich bin gerade dabei mich in die Wii-Copter Software MultiWii1_7 einzuarbeiten um neue Sensoren anzusprechen. Leider hab ich bisher nur in Delphi programmiert deshalb meine vielleicht dumme Frage. Original Code : #define LEDPIN_PINMODE pinMode (13, OUTPUT); #define LEDPIN_OFF PORTB &= ~(1<<5); #define LEDPIN_ON PORTB |= (1<<5); Bei der Definition des Pins beziehen sich die Programmierer einmal auf den Pin des Evaluationboards (Arduino Nano) und einmal direkt auf die Ports des Atmega 328. hat das einen tieferen Grund oder wäre der Code nicht lesbarer wenn man sich immer auf das Gleiche beziehen würde, wie z.B.: #define LEDPIN_PINMODE pinMode (13, OUTPUT); #define LEDPIN_OFF digitalWrite(13, LOW); #define LEDPIN_ON digitalWrite(13, HIGH); Hoffentlich bin ich im richtigen Forum aber die Arduino-Software scheint sich vom GCC abzuleiten Viele Grüße Thomas Rapp
Das liegt wahrscheinlich daran, dass mehrere Menschen an dem Code arbeiten und der eine das lieber so macht und der andere anders.
Höchst wahrscheinlich wird digitalWrite(13, LOW); langsamer in der Ausführung sein, weil ja zuerst einmal aus der 13 ermittelt werden muss, welcher Pin an welchem Port das ist, während bei PORTB &= ~( 1 << 5 ); schon alle Angaben darüber schon enthalten sind und der Compiler das in 1 Assembler Instruktion übersetzen kann. Was allerdings kein Grund dafür ist, die Umschaltung auf Ausgang mittels #define LEDPIN_PINMODE pinMode (13, OUTPUT); zu machen. OK, hier ist der Gedanke, dass ein Pin auf Ausgang gesetzt wird besser ablesbar als in DDRB |= ( 1 << 5 ); und diese Anweisung wird im Programm höchst wahrscheinlich nur an einer Stelle vorkommen, so dass hier keine Notwendigkeit besteht, die schnellere Variante vorzuziehen. Wenn du das allerdings vereinheitlichst, dann so, dass die Portschreibweise benutzt wird. Denn es hat mit Sicherheit einen Grund, warum hier der schnelleren Variante der Vorzug gegeben wurde. Wii-Copter klingt nach Quadrokopter. Und da ist Speed nun mal essentiell.
Wie mein Vorredner schon sagte, es liegt höchstwahrscheinlich daran, dass ca. 5 Leute den Code bearbeiten. Ich selber bin gerade dabei mir einen Quadcopter zu bauen, aber auf Basis eines LPC 1769. Den Code des Wii Copter verwende ich dazu allerdings nicht, er ist unübersichtlich wie sonstwas und Variablen werden wild deklariert. Aber das wird wohl am Arduino liegen. Die meisten Leute die dort Einsteigen kennen dann nur den einen "Sketch". Ich selber habe vor einigen Jahren so programmiert weil ich es nicht anders kannte, aber es ist wirklich nicht zu empfehlen. Besser ist es sich den Code anzusehen und danach selbst umzusetzen. Und vielleicht nicht gleich jede Variable im Namespace der main zu deklarieren ;) Je nachdem wie die Funktion "digitalwrite" ausgeführt ist macht es auch keinen Geschwindigkeitsunterschied. der Aufruf enthält nur feste Werte, bei richtiger Implementation wird der Compiler vermutlich eh den Code zusammenstreichen und das ganze inline einsetzen. Einfach mal mit -O3 kompilieren und in dem .elf nachschauen.
Okay, wenn ich das richtig verstanden habe werde ich den ganzen Code auf Port Ebene umschreiben. Ich mag's lieber einheitlich. Und das hätte den Vorteil dass das Program sich nur auf den Prozessor bezieht und nicht von der Arduino-Hardware abhängt. Allerdings glaub ich nicht dass digitalWrite(13, LOW); langsamer ist als PORTB &= ~( 1 << 5 ); ich denke das wird ja nicht zur Laufzeit erstellt sondern vom Compiler hoffentlich mit minimalem Code umgesetzt. Hallo Johannes V, was nimmst dann Du als Software Grundlage. Neben dem MultiWii kenn ich sonst nur Adrupirat und eine Version in Bascom Gruß Thomas
> > digitalWrite(13, LOW); langsamer ist als PORTB &= ~( 1 << 5 ); > > ich denke das wird ja nicht zur Laufzeit erstellt sondern vom Compiler > hoffentlich mit minimalem Code umgesetzt. Ich weiß es nicht. Dazu müsste man sich die Implementierung von digitalWrite ansehen. Du kannst sie ja mal raussuchen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.