Forum: Compiler & IDEs Wii-Copter Software


von Thomas R. (segelfam)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Das liegt wahrscheinlich daran, dass mehrere Menschen an dem Code 
arbeiten und der eine das lieber so macht und der andere anders.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Johannes V. (Gast)


Lesenswert?

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.

von Thomas R. (segelfam)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

>
> 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
Noch kein Account? Hier anmelden.