Operation zur Erhöhung des Serial-Port-Puffers der Arduino IDE





Ich bin kein großer Fan der Arduino-Infrastruktur. Ja, heute haben wir bereits mehr Optionen - zum Beispiel Pro IDE und Platform IO . Von der ursprünglichen IDE bekomme ich jedoch immer Sodbrennen. Und ich habe seine volle Ausdehnung erst am Tag zuvor geschätzt, als ich etwas sehr Einfaches tun wollte: den Empfangspuffer der seriellen ATmega32-Schnittstelle erhöhen. Am Ende habe ich eine Lösung gefunden, die Ihnen auch bei anderen Problemen helfen kann. Selbst wenn Sie diese Funktion nicht speziell benötigen, ist es möglicherweise hilfreich, zu sehen, was genau ich getan habe.



Diese Erfahrung hinterließ einen doppelten Eindruck. Einerseits verachte ich diesen unscheinbaren Editor, weil er sich zu sehr vor mir versteckt und nur sehr wenige nützliche Werkzeuge zur Verfügung stellt. Andererseits war ich beeindruckt, wie flexibel es ist, wenn man sich mit den Details seiner internen Struktur befasst.



Zunächst fragen Sie sich wahrscheinlich, warum ich eine IDE verwende. Kurz gesagt, ich benutze es nicht. Wenn Sie jedoch etwas tun, das andere verwenden, ist es fast unmöglich, es zu ignorieren. Wie auch immer Sie Ihre eigene IDE einrichten, sobald Ihr Code online geht, wird jemand versuchen, ihn mit der IDE zu verwenden. Ich habe einmal über einen Z80-basierten Computer für 4 US-Dollar geschrieben . Ich habe selten Zeit, um das zu bauen, worüber ich schreibe, aber ich wollte unbedingt versuchen, diesen kleinen Computer zu bauen. Für eine Weile lag alles in einem halb zerlegten Zustand, und dann schickten sie mir eine Zahlung für ihn. Ich habe es erhalten, und - wie Sie vielleicht vermutet haben - lag es immer noch ein wenig halb zerlegt. Aber ich fand endlich die Zeit, das Projekt abzuschließen und lud CP / M herunter.







Das einzige Problem mit dem Projekt war das Fehlen guter Optionen für die Übertragung von Daten vom PC auf den PC und umgekehrt. Es schien das Beste zu sein, Intel Hex-Dateien zu erstellen und sie über das Terminal zu kopieren / einzufügen. Ich wollte etwas Besseres und landete am Samstagmorgen in einem Kaninchenbau. Als Ergebnis habe ich eine Möglichkeit gefunden, der Arduino IDE meine eigenen Menüelemente hinzuzufügen, um die Compilereinstellungen abhängig von der im Projekt verwendeten Hardware zu bearbeiten. Dieser Trick ist es wert, erlernt zu werden, da er außerhalb dieser speziellen Aufgabe nützlich sein kann.



Problem: Begrenzung der Puffergröße der seriellen Arduino-Schnittstelle



Ich werde Sie nicht mit Details darüber belästigen, wie das Board funktioniert, da Sie nur interessiert sind, wenn Sie eines haben. Alle Details finden Sie in der Diskussion auf Hackaday.io, wenn Sie es wirklich brauchen. Infolgedessen war der serielle Arduino-Port-Puffer nicht groß genug, um als zuverlässig für die Übertragung über XModem angesehen zu werden. Alles schien mit dem Standardpuffer von 64 Byte zu funktionieren, aber XModem sendet mehr Daten und es ist leicht vorstellbar, dass der Puffer überläuft.



Wie schwierig kann es sein, einen Puffer zu aktualisieren? Auf der anderen Seite ist dies eine triviale Aufgabe. Auf der anderen Seite ist es sehr schwierig, weil Ihre Werkzeuge sehr bemüht sind, Ihnen zu helfen.



Werkzeugset



Das kleine Computerprojekt verwendet für fast alle Zusatzfunktionen einen echten Z80-Chip und ATMega32A. Es bietet Taktrate, serielle Schnittstelle, Speicher usw. Die Arduino IDE unterstützt ATMega32A jedoch nicht direkt. Daher müssen Sie dazu eine Toolbox installieren. Die Situation erforderte MightyCore , also habe ich es benutzt.



Die Bibliotheken der seriellen Schnittstelle werden mit # define-Anweisungen konfiguriert, damit Sie die Puffergröße korrigieren können. Wenn nichts konfiguriert ist, erhalten Sie standardmäßig Werte basierend auf der Menge des verfügbaren Arbeitsspeichers:



#if !defined(SERIAL_TX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_TX_BUFFER_SIZE 16
#else
#define SERIAL_TX_BUFFER_SIZE 64
#endif
#endif
#if !defined(SERIAL_RX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_RX_BUFFER_SIZE 16
#else
#define SERIAL_RX_BUFFER_SIZE 64
#endif
#endif


Änderungen machen



Es ist einfach, nicht wahr? Definieren Sie Symbole, bevor Sie HardwareSerial.h laden. Scheiße - diese Datei wird in Arduino.h geladen. Der SP möchte es Ihrem Programm hinzufügen und lässt es zuerst starten. Es scheint, dass einige Versionen der IDE überprüft haben, ob Sie sie bereits aktiviert haben, um sie nicht erneut zu aktivieren, Version 1.8.5 jedoch nicht. Vielleicht kann ich einige Einstellungen an den Compiler übergeben? Nee. Zumindest nicht über die IDE.



Ich habe viele Dinge ausprobiert. Ich wollte natürlich nur die Hauptbibliotheken ändern. Das ist aber nicht gut. Später benötigen Sie möglicherweise die Standardeinstellungen. Wenn Sie die Toolbox aktualisieren, gehen alle Aktualisierungen verloren. Ich wollte das vermeiden. Jemand im Internet hat empfohlen, eine Kopie der Plattformdateien zu erstellen und diese zu ändern. Keine perfekte Lösung.



Annahmen überprüfen mit



Ich konnte sehen, dass das, was ich tat, nicht funktionierte, da ich vorübergehend die Anweisungen #if und #error in HardwareSerial.cpp einfügte. Z.B:



#if SERIAL_RX_BUFFER_SIZE==256
#error 256
#endif


Wenn nun Fehler 256 beim Kompilieren abstürzt, weiß ich, dass die Größe eingestellt ist. Wenn nicht, widersteht das System meinen Änderungen.



Kompromiss: Hinzufügen von Einstellungen zu den Menüs auf Board-Ebene



Ich wollte unbedingt eine Möglichkeit finden, die Einstellungen nur in einem bestimmten Projekt zu ändern und damit die Größe des seriellen Puffers festzulegen. Es ist mir nicht gelungen. Aber ich habe es geschafft, board.txt von Mighty Core zu ändern. Ja, ich muss sicherstellen, dass Updates meine Änderungen nicht überschreiben, aber sie sind einfach. Wenn etwas in der Datei fehlt, ist dies offensichtlich.







Dies liegt natürlich daran, dass ich ein Menü für die IDE erstellt habe, das nur bei Verwendung von ATMega32 für Mighty Core angezeigt wird. Eine der voreingestellten Puffergrößen kann im Menü ausgewählt werden.



Um dieses Ergebnis zu erzielen, müssen Sie drei Schritte ausführen:



  1. Teilen Sie der IDE mit, dass Sie einen neuen Menüpunkt haben, und beschreiben Sie, wie er aussieht.
  2. Das neue Element sollte die Compilereinstellungen ändern.
  3. Da das vorhandene System auch die Compilereinstellungen ändert, müssen Sie sicherstellen, dass sie nicht beschädigt werden.


Der erste Schritt ist einfach. Meine board.txt-Datei befand sich in ~ / .arduino15 / packages / MightyCore / hardware / avr / 2.0.5 /boards.txt. Fast ganz oben befindet sich eine Liste mit Menüpunkten, und am Ende habe ich meine hinzugefügt:



# Menu options
menu.clock=Clock
menu.BOD=BOD
menu.LTO=Compiler LTO
menu.variant=Variant
menu.pinout=Pinout
menu.bootloader=Bootloader
menu.SerialBuf=Serial Port Buffers (RX/TX)


Dann habe ich die Zeilen nach unten verschoben und mein Menü vor dem vorhandenen LTO-Setup für ATMega32 hinzugefügt:



32.menu.SerialBuf.disabled=Default
32.menu.SerialBuf.disabled.compilerSB.c.extra_flags=
32.menu.SerialBuf.disabled.compilerSB.cpp.extra_flags=
 
32.menu.SerialBuf.SB64=64/64
32.menu.SerialBuf.SB64.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=64 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB64.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=64 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB128=128/128
32.menu.SerialBuf.SB128.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=128
32.menu.SerialBuf.SB128.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=128
 
32.menu.SerialBuf.SB12864=128/64
32.menu.SerialBuf.SB12864.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB12864.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB256=256/256
32.menu.SerialBuf.SB256.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=256
32.menu.SerialBuf.SB256.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=256
 
32.menu.SerialBuf.SB25664=256/64
32.menu.SerialBuf.SB25664.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB25664.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB25632=256/32
32.menu.SerialBuf.SB25632.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=32
32.menu.SerialBuf.SB25632.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=32


Menüstruktur



Sie können sehen, dass das 32.menu-Objekt alle Elemente für einen bestimmten Prozessor zusammenfasst. Als nächstes kommt unser Menüschlüssel (SerialBuf). Darauf folgen eindeutige Tasten für jeden Menüpunkt. Es ist wichtig, sie nicht wiederzuverwenden. Wenn Sie beispielsweise zwei SB64-Schlüssel haben, funktioniert nur einer.



Wenn Sie dieser Taste ein Gleichheitszeichen zuweisen, können Sie diesem Menüpunkt Text zuweisen. Zum Beispiel "Standard" oder "64/64". Sie können dem Schlüssel auch eine Eigenschaft hinzufügen, die bei Aktivierung des Elements zugewiesen wird.



Wenn Sie beispielsweise 256/256 auswählen, legt der Compiler die Eigenschaft compilerSB.c.extra_flags fest. Warum ich einen solchen Namen für die Immobilie gefunden habe, werden Sie etwas später verstehen.



Friedliches Zusammenleben



Die Eigenschaft compilerSB.c.extra_flags ist nicht vorhanden. Richtig heißt es compiler.c.extra_flags. Das Mighty Core LTO-Setup verwendet jedoch denselben Schlüssel. Daher war es wichtig, dass das neue Menü zuerst angezeigt wurde und auch eine gefälschte Eigenschaft festgelegt wurde. Dann müssen Sie den LTO-Code korrigieren:



# Compiler link time optimization
32.menu.LTO.Os=LTO disabled
32.menu.LTO.Os.compiler.c.extra_flags={compilerSB.c.extra_flags}
32.menu.LTO.Os.compiler.c.elf.extra_flags=
32.menu.LTO.Os.compiler.cpp.extra_flags={compilerSB.cpp.extra_flags}
32.menu.LTO.Os.ltoarcmd=avr-ar
 
32.menu.LTO.Os_flto=LTO enabled
32.menu.LTO.Os_flto.compiler.c.extra_flags={compilerSB.c.extra_flags} -Wextra -flto -g
32.menu.LTO.Os_flto.compiler.c.elf.extra_flags=-w -flto -g
32.menu.LTO.Os_flto.compiler.cpp.extra_flags={compilerSB.cpp.extra_flags} -Wextra -flto -g
32.menu.LTO.Os_flto.ltoarcmd=avr-gcc-ar


Die Hauptänderung besteht darin, dass jeder Satz von Flags zum voreingestellten Menü hinzugefügt wird. Dadurch werden alle Flags zur richtigen Eigenschaft compiler.c.extra_flags hinzugefügt.



Ich habe die Fehlerbehebung für alle Fälle konfiguriert, um sicherzustellen, dass alles korrekt zugewiesen ist.



Anpassung für sich



Sie können die Optionen natürlich ändern, wenn Sie etwas anderes benötigen. Sie können diesen Trick auch verwenden, um andere Parameter festzulegen, bevor die Datei Arduino.h die Kontrolle erhält. Es gibt eine Dokumentation zum Konfigurieren verschiedener Plattformparameter, einschließlich board.txt.



Es ist vielleicht besser, meine eigene separate board.txt-Datei mit denselben Informationen zu erstellen, aber dann müsste ich den Rest von Mighty Core mitnehmen. Stattdessen habe ich gerade eine Kopie dieser Datei als Boards.txt.custom gespeichert. Wenn mein Menü verschwindet, vergleiche ich den Inhalt einfach mit Boards.txt, um festzustellen, was sich geändert hat.



Wenn Sie sich nicht mit der Unterstützung von Personen befassen müssen, die die IDE verwenden, können Sie dies natürlich einfach vergessen. Es ist besser, die Pro IDE zu verwenden, auch wenn einige ihrer Nachteile bestehen. Nun, Sie können immer auf Platform.io verweisen.



Siehe auch:






All Articles