Ich möchte zu Testzwecken eine möglichst kleine Skizze erstellen. Das Problem ist, wenn ich die BareMinimum-Skizze kompiliere (mit einem leeren Setup und einer leeren Schleife), bekomme ich 466 Bytes für das Uno und satte 4.242 für das Leonardo. Gibt es eine Möglichkeit, eigenen Code zu schreiben, der keine zusätzlichen Funktionen hat (nämlich Timer0 für millis()
und delay()
) ? Ich möchte auch die Tastatur- / Mausfunktionen für den Leonardo deaktivieren können.
programming
sketch
arduino-leonardo
Der Doktor
quelle
quelle
Antworten:
Sie sollten in der Lage sein, Ihre eigene Board-Definition mit einer benutzerdefinierten board.txt-Datei gemäß https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification zu erstellen . Wie ich sehe, enthält die Definition des Leonardo mehrere USB-Funktionen. Ich würde hoffen, dass die Kompilierungsaufnahme des 4K auf diesen Flags und nicht auf dem Prozessortyp basiert.
Wo die board.txt den Upload verwenden würde, werden Bootloader-Abschnitte von Leonardo und der Build von Uno verwendet.
Dies alles setzt voraus, dass der Build der Kernbibliothek keine prozessorspezifischen Flags verwendet, um USB-Funktionen einzuschließen.
Wenn Sie solche Arbeit bekommen. post back, ich bin sicher, dass andere daran interessiert wären.
Ich bin kürzlich auf diese 4K-Einschränkung für eine Bibliotheksdemo gestoßen, die die UNO tatsächlich ausgereizt hat und eine einfügen musste
um einen großen Teil der zusätzlichen Funktionen in der Skizze, die auf den Leonardo passen.
Ich hatte angenommen (falsch), dass dieses 4K war, weil ich immer noch Serial.print enthielt, das über die CDC des USB auf dem Leo lief. Aber ich sehe nach einem Speicherauszug einer leeren Skizze, dass sie immer noch da sind.
Was Sinn macht. Da der Leonardo weiterhin den USB-CDC-Client (den 4K) benötigt, um die 1200-Baud-Verbindung von AVR-DUDE zu erkennen, um den Remote-Neustart durchzuführen.
Daher muss auch eine benutzerdefinierte Boards.txt ohne USB im Build erstellt werden
entfernt.
Nach dem Laden auf das Ziel muss der Upload mit einem manuellen Zurücksetzen des Ziels synchronisiert werden. Da die Fähigkeit zum Remote-Neustart verloren geht.
quelle
Ich wollte vor kurzem genau das tun. Da es keinen guten Weg gibt, habe ich einen Patch für das Stino Sublime-Text-Arduino-Plugin geschrieben, um genau dies zu tun. Es wurde später akzeptiert, daher sollte es in allen aktuellen Stino-Installationen enthalten sein.
Dies fügt Stino eine neue Option hinzu:
Wenn Sie diesen Modus verwenden, werden folgende Kompilierungsergebnisse erzielt:
Für eine Uno:
Für einen Leonardo
Eigentlich Programmierung den leonardo mit der oben kompilierte Ausgabe ist wahrscheinlich eine schlechte Idee, wie es vielleicht die Auto-Reset - Funktionalität brechen, aber man könnte , wenn man will. Hutspitze an mpflaga, weil er dies in seiner Antwort vermerkt hat.
Beachten Sie, dass die Speicherberichte tatsächlich falsch sind, dies ist jedoch ein separates Problem .
Der oben genannte Code lautet:
Einige Notizen:
milis()
oder ähnlich.#include <Arduino.h>
.main
. Du kommst nie zurück vonmain
. Wenn Sie Setup-Sachen wollen, geht es vor demwhile (1)
.quelle
Obwohl dies von Ihrer Skizze abhängt, können Sie die Größe etwas verringern, indem Sie Code mit Methoden wiederverwenden.
Nehmen Sie diesen Code:
1.322 Bytes auf Arduino Uno. Lassen Sie es uns jetzt etwas verkleinern:
1.194 Bytes. Das sind ungefähr 10% weniger!
Obwohl es eine Skizze nicht stark verkleinert, kann es manchmal die einfachste Route sein, wenn Sie zwei Bytes über dem Grenzwert liegen oder zunächst nur eine kompaktere Skizze erstellen möchten, ohne die Funktionalität zu verlieren. Es ist nicht für jede Situation geeignet, aber ich finde es manchmal nützlich.
quelle
@annonomus Pinguin, sicher können wir Obwohl der Code in 1180 Bytes Flash + 13 Bytes RAM für ein Uno auf meinem Computer kompiliert wird, können wir es verbessern :) Also Golf Herausforderung angenommen und auch ein paar nützliche Tipps, da wir im Geschäft von sind Lernen.
Schritt 1: Verringern Sie die variablen Anforderungen. Die Verwendung eines int für einen LED-Port scheint etwas übertrieben, wir haben sicherlich keine 65535 adressierbaren E / A-Ports auf dem Arduino :) Also ändern wir es nur zum Spaß in ein Byte. Wir werden es später auf #define umstellen, aber um die Auswirkungen der Verwendung zu großer Variablentypen zu zeigen.
Kompiliert in 1172 Bytes + 13 Bytes RAM. Dies spart 8 Byte Flash, da weniger Operationen für das Byte anstelle einer Ganzzahl erforderlich sind. Ich würde 12 Bytes RAM erwarten, aber okay. Nicht so viel, aber jedes gespeicherte Byte ist gut.
Schritt 2: Ändern Sie die Variable in definiert, wann es sinnvoll ist. Zum Beispiel wird das LED-Byte nicht benötigt, der Pin löst sich nicht von selbst.
Kompiliert in 1142 Bytesflash + 11 Bytes RAM. Bereits 38 Bytes gespeichert. Dies ist auf weniger Registeroperationen zurückzuführen, die zum Abrufen des int-Werts erforderlich sind. Außerdem haben wir 2 Bytes aus dem RAM gespeichert. (Ich frage mich immer noch, warum das Byte nicht zu 1 Byte RAM weniger kompiliert wurde .....)
Schritt 3: Code optimieren. Ich sehe 2 Verzögerungen. Ich frage mich, ob ich es auf 1 Verzögerung ändere, um Platz zu sparen, aber ich muss den Wert des LED-Pins herausfinden und ihn umschalten (umkehren). Wir können das mit digitalRead () machen, aber wird es Platz sparen?
Kompiliert in 1134 Bytes + 11 Bytes RAM. Yay! weitere 8 Bytes. Das ergibt insgesamt 46 Bytes und 2 Codezeilen weniger.
Auch ein weiterer allgemeiner Tipp zum Verringern der Codegröße. Verwenden Sie nicht die String-Klasse. Es ist RIESIG, lernen Sie, wie man mit char-Arrays umgeht, strcpy (), strcmp (). Wenn Sie nur einige grundlegende Zeichenfolgenoperationen haben, verschwendet die Verwendung der Zeichenfolgenklasse meist nur Speicherplatz auf Flash und RAM.
quelle