Chirurgie pour augmenter le tampon du port série de l'IDE Arduino





Je ne suis pas un grand fan de l'infrastructure Arduino. Oui, aujourd'hui, nous avons déjà plus d'options - par exemple, pro IDE et Platform IO . Cependant, je reçois toujours des brûlures d'estomac de l'IDE d'origine. Et je n'ai apprécié son ampleur que la veille, lorsque je voulais faire quelque chose de très simple: augmenter le buffer de réception du port série ATmega32. En fin de compte, j'ai trouvé une solution qui pourrait également vous aider avec d'autres problèmes - donc même si vous n'avez pas spécifiquement besoin de cette fonctionnalité, vous trouverez peut-être utile de voir ce que j'ai fait exactement.



Cette expérience m'a laissé une double impression. D'une part, je méprise cet éditeur indescriptible pour me cacher trop et fournir très peu d'outils utiles. D'un autre côté, j'ai été impressionné par sa flexibilité lorsque vous approfondissez les détails de sa structure interne.



Tout d'abord, vous vous demandez probablement pourquoi j'utilise un IDE. Bref, je ne l'utilise pas. Cependant, si vous faites quelque chose que d'autres utiliseront, il est presque impossible de l'ignorer. Quelle que soit la manière dont vous configurez votre propre IDE, dès que votre code sera en ligne, quelqu'un essaiera de l'utiliser avec l'IDE. J'ai écrit une fois sur un ordinateur basé sur le Z80 à 4 $ . J'ai rarement le temps de construire ce sur quoi j'écris, mais je voulais vraiment essayer de construire ce petit ordinateur. Pendant un certain temps, tout est resté à moitié démonté, puis ils m'ont envoyé un paiement pour lui. Je l'ai reçu et - comme vous l'avez peut-être deviné - il était encore un peu à moitié démonté. Mais j'ai finalement trouvé le temps de terminer le projet et téléchargé CP / M.







Le seul problème avec le projet était le manque de bonnes options pour transférer les données de celui-ci vers le PC et vice versa. Il semblait que la meilleure chose à faire était de créer des fichiers Intel hexadécimaux et de les copier / coller via le terminal. Je voulais quelque chose de mieux et je me suis retrouvé samedi matin dans un terrier de lapin. En conséquence, j'ai trouvé un moyen d'ajouter mes propres éléments de menu à l'IDE Arduino pour modifier les paramètres du compilateur en fonction du matériel utilisé dans le projet. Cette astuce vaut la peine d'être apprise car elle peut être utile en dehors de cette tâche particulière.



Problème: limitation de la taille de la mémoire tampon du port série Arduino



Je ne vous dérangerai pas avec des détails sur la façon de faire fonctionner le tableau, car vous ne serez intéressé que si vous en avez un. Tous les détails sont dans la discussion sur Hackaday.io si vous en avez vraiment besoin. En conséquence, la mémoire tampon du port série Arduino n'était pas assez grande pour être considérée comme fiable pour la transmission via XModem. Tout semblait fonctionner avec le tampon par défaut de 64 octets, mais XModem envoie plus de données et il est facile d'imaginer le débordement du tampon.



Dans quelle mesure peut-il être difficile de mettre à jour un tampon? D'un autre côté, c'est une tâche triviale. D'un autre côté, c'est très difficile, car vos outils essaient très fort de vous aider.



Un ensemble d'outils



Le petit projet informatique utilise une vraie puce Z80 et ATMega32A pour presque toutes les fonctions auxiliaires. Il fournit la vitesse d'horloge, le port série, le stockage, etc. Cependant, l'IDE Arduino ne prend pas directement en charge ATMega32A, vous devez donc installer une boîte à outils pour ce faire. La situation nécessitait MightyCore , alors je l'ai utilisé.



Les bibliothèques de ports série sont configurées avec des instructions #define afin que vous puissiez corriger la taille de la mémoire tampon. Par défaut, si rien n'est configuré, vous obtiendrez des valeurs basées sur la quantité de RAM disponible:



#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


Faire des changements



C'est simple, non? Définissez des symboles avant de charger HardwareSerial.h. Merde - ce fichier est chargé dans Arduino.h. Le SP veut l'ajouter à votre programme et le fait démarrer en premier. Il semble que certaines versions de l'EDI aient vérifié si vous l'aviez déjà activé pour ne pas le réactiver, mais pas la version 1.8.5. Peut-être que je peux transmettre certains paramètres au compilateur? Nan. Du moins pas via l'IDE.



J'ai essayé beaucoup de choses. Je voulais, bien sûr, simplement changer les bibliothèques principales. Mais ce n'est pas bon. Plus tard, vous aurez peut-être besoin des paramètres par défaut. Si vous mettez à jour la boîte à outils, toutes les mises à jour sont perdues. Je voulais éviter cela. Quelqu'un sur Internet a conseillé de faire une copie des fichiers de la plate-forme et de les modifier. Pas une solution parfaite.



Vérification des hypothèses avec



Je pouvais voir que ce que je faisais ne fonctionnait pas car j'insérant temporairement des instructions #if et #error dans HardwareSerial.cpp. Par exemple:



#if SERIAL_RX_BUFFER_SIZE==256
#error 256
#endif


Maintenant, si l'erreur 256 se bloque lors de la compilation, je sais que la taille est définie. Sinon, le système résiste à mes modifications.



Compromis: ajout de paramètres aux menus au niveau du tableau



Je voulais vraiment trouver un moyen de modifier les paramètres uniquement dans un projet spécifique, et ainsi définir la taille du tampon série. Je n’ai pas réussi. Mais j'ai réussi à changer boards.txt de Mighty Core. Oui, je devrai m'assurer que les mises à jour n'écrasent pas mes modifications, mais elles sont simples, et s'il manque quelque chose dans le fichier, ce sera évident.







Évidemment, ce sera parce que j'ai créé un menu pour l'EDI, qui n'apparaît que lorsque vous utilisez ATMega32 pour Mighty Core. Dans le menu, vous pouvez sélectionner l'une des tailles de tampon prédéfinies.



Pour atteindre ce résultat, vous devez suivre trois étapes:



  1. Dites à l'EDI que vous avez un nouvel élément de menu et décrivez à quoi il ressemble.
  2. Le nouvel élément doit modifier les paramètres du compilateur.
  3. Étant donné que le système existant modifie également les paramètres du compilateur, vous devez vous assurer qu'ils ne sont pas corrompus.


La première étape est simple. Mon fichier boards.txt se trouvait dans ~ / .arduino15 / packages / MightyCore / hardware / avr / 2.0.5 / boards.txt. Presque tout en haut, il y a une liste d'éléments de menu, et à la fin j'ai ajouté le mien:



# 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)


Ensuite, j'ai déplacé les lignes vers le bas et ajouté mon menu devant la configuration LTO existante pour ATMega32:



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


Structure du menu



Vous pouvez voir que l'objet 32.menu regroupe tous les éléments pour un processeur donné. Vient ensuite notre touche de menu (SerialBuf). Ceci est suivi de touches uniques pour chaque élément de menu. Il est important de ne pas les réutiliser. Si, par exemple, vous avez deux clés SB64, une seule d'entre elles fonctionnera.



Si vous attribuez un signe égal à cette touche, vous pouvez attribuer du texte à cet élément de menu. Par exemple, "Par défaut" ou "64/64". Vous pouvez également ajouter une propriété à la clé et elle sera attribuée lorsque l'élément sera activé.



Si, par exemple, sélectionnez 256/256, le compilateur définit la propriété compilerSB.c.extra_flags. Pourquoi j'ai trouvé un tel nom pour la propriété, vous comprendrez un peu plus tard.



Coexistence pacifique



La propriété compilerSB.c.extra_flags n'est pas présente. Correctement, il est appelé compiler.c.extra_flags. Cependant, la configuration du Mighty Core LTO utilise la même clé. Par conséquent, il était important que le nouveau menu apparaisse en premier et définisse également une fausse propriété. Ensuite, vous devez corriger le code LTO:



# 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


Le principal changement est que chaque ensemble d'indicateurs est ajouté au menu prédéfini. Cela ajoute tous les indicateurs à la propriété correcte, compiler.c.extra_flags.



J'ai configuré le recouvrement des erreurs pour tous les cas pour m'assurer que tout est correctement attribué.



Personnalisation pour vous-même



Vous pouvez bien sûr modifier les options si vous avez besoin de quelque chose de différent. Vous pouvez également utiliser cette astuce pour définir d'autres paramètres avant que le fichier Arduino.h ne soit contrôlé. Il existe de la documentation sur la configuration de divers paramètres de plate-forme, y compris boards.txt.



Il serait peut-être préférable de créer mon propre fichier boards.txt séparé avec les mêmes informations, mais je devrais alors emporter le reste de Mighty Core avec moi. Au lieu de cela, je viens d'enregistrer une copie de ce fichier sous le nom boards.txt.custom, et si mon menu disparaît, je vais simplement comparer son contenu à boards.txt pour voir ce qui a changé.



Naturellement, si vous n'avez pas besoin de traiter avec des personnes de soutien utilisant l'EDI, vous pouvez simplement l'oublier. Mieux vaut utiliser le Pro IDE, même avec certains de ses inconvénients. Eh bien, vous pouvez toujours vous référer à Platform.io.



Voir également:






All Articles