Il est bien connu que je ne suis pas un grand fan de l'infrastructure Arduino. Certes, ces jours-ci, vous avez plus d'options avec l'IDE pro et la plate-forme IO, par exemple. Mais l'IDE d'origine me donne toujours des brûlures d'estomac. J'ai réalisé combien de brûlures d'estomac l'autre jour quand je voulais quelque chose de très simple: augmenter le tampon de réception sur un port série ATmega32. La solution à laquelle je suis parvenu pourrait vous aider à faire d'autres choses, donc même si vous n'avez pas besoin de cette fonctionnalité exacte, vous pourriez toujours trouver utile de voir ce que j'ai fait.

Suite à cette expérience, je suis vraiment déchiré. D'une part, je méprise l'éditeur terne pour me cacher trop de détails et fournir peu d'outils utiles. D'un autre côté, j'ai été impressionné par son extensibilité si vous pouvez découvrir les détails de son fonctionnement en interne.

Tout d'abord, vous vous demandez peut-être pourquoi j'utilise l'IDE. La réponse courte est non. Mais quand vous produisez des choses pour les autres, vous ne pouvez presque pas les ignorer. Peu importe comment vous créez votre environnement personnel, dès que votre code arrive sur Internet, quelqu'un essaiera de l'utiliser dans l'IDE. Il y a quelque temps, j'avais écrit sur l'ordinateur Z80 à 4 $ par (Just4Fun). J'ai rarement le temps de construire des choses sur lesquelles j'écris, mais je voulais vraiment essayer ce petit ordinateur. Les pièces sont restées partiellement assemblées pendant un certain temps, puis un PCB est sorti pour cela. J'ai eu le PCB et – vous l'avez deviné – il s'est assis un peu plus, partiellement assemblé. Mais j'ai finalement trouvé le temps de le terminer et j'ai fait démarrer CP / M.

Le seul problème était qu'il n'y avait pas beaucoup de bonnes options pour transférer des données dans les deux sens vers le PC. Il semblait que le meilleur pari était de faire des fichiers hexadécimaux Intel et de les transférer copier et coller sur le terminal. Je voulais mieux et cela m'a envoyé dans un terrier de lapin le samedi matin. Je me suis retrouvé avec un moyen de créer vos propres menus dans l'IDE Arduino pour définir les options du compilateur en fonction du matériel cible pour le projet. C'est une astuce qui vaut la peine d'être connue car elle sera utile au-delà de ce seul problème.

Le problème: la limite de taille du tampon série Arduino

Je ne vous ennuierai pas avec les détails pour faire fonctionner la planche, car vous ne vous en soucierez que si vous en avez une. Les détails sont disponibles dans une discussion sur Hackaday.io, si vous voulez vraiment le suivre. Mais le résultat était que pour les transferts XModem, (Just4Fun) avait l'impression que le tampon série Arduino par défaut n'était pas assez grand pour être fiable. Cela semblait fonctionner avec le tampon par défaut de 64 octets, mais XModem envoie plus de données que cela et il serait facile d'imaginer qu'il soit dépassé.

Comment peut-il être difficile de mettre à jour le tampon? D'une certaine manière, c'est trivial. D'une autre manière, c'est très difficile car les outils veulent tellement vous aider.

Chaîne d'outils

Le petit projet informatique utilise une véritable puce Z80 et utilise un ATMega32A pour presque toutes les fonctions de support. Il génère l'horloge, agit comme un port série, agit comme un lecteur de disque, etc. Cependant, l'ATMega32 ne prend pas directement en charge Arduino IDE, vous devez donc installer une chaîne d'outils pour cela. Le projet a appelé MightyCore donc c'est ce que j'ai utilisé.

Les bibliothèques pour le matériel série ont toutes été configurées à l'aide d'instructions #define pour vous permettre d'ajuster les tailles de tampon. Par défaut, si vous n'avez rien configuré, vous obtenez une valeur par défaut basée sur la quantité de RAM fournie par votre processeur:


#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 le changement

C'est donc facile, non? Définissez simplement ces symboles avant HardwareSerial.h charges. Euh oh. Ce fichier est chargé par Arduino.h. L'IDE veut ajouter cela à votre programme et il l'oblige à être le premier. Il semble y avoir des versions IDE qui vérifient si vous l'avez déjà inclus afin qu'elles ne l'incluent pas deux fois, mais la version 1.8.5 ne semble pas le faire. Je peux peut-être ajouter quelques options dans les préférences pour passer au compilateur. Nan. Pas via l'IDE, de toute façon.

Non pas que je n'ai pas essayé beaucoup de choses. Il était tentant, bien sûr, de simplement changer les bibliothèques de base. Mais c'est mauvais. Vous voudrez peut-être les valeurs par défaut plus tard. Si vous mettez à jour la chaîne d'outils, vous perdrez vos mises à jour. Je voulais éviter ça. Certaines personnes sur Internet ont suggéré de faire une copie des fichiers de la plate-forme et de les modifier. Toujours pas idéal.

Testez vos hypothèses avec un rapport d'erreurs personnalisé

Je pouvais dire que les choses que j'essayais ne fonctionnaient pas parce que #if déclarations et #error déclarations temporairement HardwareSerial.cpp. Par exemple:

#if SERIAL_RX_BUFFER_SIZE==256
#error 256
#endif

Maintenant, si une compilation provoque une erreur 256, je sais que j'ai pu définir la taille. Sinon, le système résistait à mes changements.

Compromis: ajouter des options de menu au niveau de la carte

Je voulais vraiment un moyen de faire un changement juste dans mon projet et de définir les tailles de tampon série. J'ai échoué. Ce que j'ai fait, c'est apporter une modification au boards.txt fourni par Mighty Core. Oui, je devrai surveiller les mises à niveau écrasant mes modifications, mais elles sont simples et il sera évident qu'elles manquent.

La raison pour laquelle il sera évident est que j'ai créé un menu pour l'IDE qui n'apparaît que lorsque vous utilisez ATMega32 pour Mighty Core. Ce menu vous permet de sélectionner quelques tailles de mémoire tampon prédéfinies.

Pour que ce travail se déroule en trois parties:

  1. Vous devez dire à l'IDE que vous avez un élément de menu et à quoi il ressemble.
  2. Le nouvel élément doit définir certaines options du compilateur.
  3. Étant donné que le système existant définit également certaines options du compilateur, vous devez vous assurer de ne pas les encombrer.

La première partie est simple. le boards.txt le fichier était (pour moi) dans ~/.arduino15/packages/MightyCore/hardware/avr/2.0.5/boards.txt. Près du haut, il y a une liste de touches de menu et j'ai ajouté la mienne à la fin:


# 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 descendu le fichier et ajouté mon menu avant l'option de menu LTO existante pour l'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 le 32.menu objet regroupe tous les éléments ensemble pour ce processeur. La partie suivante est notre touche de menu (SerialBuf). Après cela, une clé unique pour chaque élément de la mémoire. Il est important de ne pas les réutiliser. Ainsi, par exemple, si vous en avez deux SB64 clés, une seule va fonctionner.

Si vous vous arrêtez à cette touche et mettez un signe égal, vous pouvez attribuer à l'élément de menu le texte que vous souhaitez afficher. Par exemple, «Par défaut» ou «64/64». Vous pouvez également étendre la clé avec une propriété et cette propriété sera définie si l'option est active.

Ainsi, par exemple, si vous sélectionnez 256/256, le compilerSB.c.extra_flags la propriété sera définie. J'ai d'ailleurs fait ce nom, et vous comprendrez pourquoi dans une minute.

Coexistence pacifique

Il n'y a aucune propriété appelée compilerSB.c.extra_flags. La propriété correcte est compiler.c.extra_flags. Cependant, le Mighty Core LTO L'option utilise la même clé. C'est pourquoi il était important que le nouveau menu apparaisse en premier et qu'il définisse une fausse propriété. Puis le LTO le code a besoin d'une légère modification:


# 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 grand changement est que chaque ensemble de drapeaux s'ajoute à tout ce que le nouveau menu a défini dans sa propriété personnalisée. De cette façon, tous les indicateurs sont placés dans la bonne propriété, compiler.c.extra_flags.

J'ai mis en place des pièges d'erreur pour attraper tous les cas pour m'assurer qu'ils étaient bien réglés. De plus, après avoir retiré ces pièges, je pouvais voir mon utilisation de la mémoire augmenter en conséquence.

Personnaliser

Bien sûr, vous pouvez modifier les paramètres si vous voulez 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 prenne le relais. Il existe de la documentation sur la configuration des définitions de plate-forme, notamment boards.txt.

Il aurait probablement été préférable pour moi de faire une boards.txt fichier avec les mêmes informations mais je devrais alors prendre le reste de Mighty Core avec moi. Au lieu de cela, je garde simplement une copie du fichier appelé boards.txt.custom et si mon menu disparaît, je n'ai qu'à comparer ce fichier avec le fichier boards.txt pour voir ce qui a changé.

Bien sûr, si vous n’avez pas à soutenir les personnes utilisant l’IDE, vous pouvez peut-être simplement y renoncer. L'IDE IDE est meilleur, même s'il présente quelques lacunes. De plus, il y a toujours Platform.io.

LAISSER UN COMMENTAIRE

Rédigez votre commentaire !
Entrez votre nom ici