Si vous aimez les microcontrôleurs et que vous aimez découvrir leur fonctionnement, Elecia White veut vous aider à découvrir leurs secrets les plus intimes à l’aide de fichiers de carte mémoire. Dans ce discours d’ouverture rafraîchissant, drôle mais très profond du Hackaday Remoticon 2021, Elecia nous guide à travers l’un des artefacts de compilation les plus intimidants – un fichier qui répertorie où tout est mis dans la mémoire du microcontrôleur – et signale des points de repère qui aident à le rendre plus navigable.
Et lorsque vous avez besoin de consulter le fichier de carte, vous avez probablement vraiment avoir besoin pour regarder dans le fichier de carte. Lorsque votre widget intégré cesse mystérieusement de fonctionner, les problèmes de mémoire font partie des suspects habituels. Peut-être que vous avez manqué de RAM ou d’espace de stockage flash, peut-être avez-vous une erreur matérielle étrange et vous voulez savoir quelle partie du programme cause le problème, ou peut-être devez-vous effectuer un profilage de vitesse pour que tout s’exécute plus rapidement. Dans tous ces cas, vous obtenez une adresse mémoire absolue. Qu’est-ce qui y vit ? Recherchez-le dans la carte mémoire !
Tracer un parcours
Elecia commence avec le fichier map d’un programme « hello world », mais c’est un hello world fonctionnant sur un RTOS, donc il y a déjà assez de viande à creuser. Elle commence par la vue d’ensemble de haut niveau : flash pour le code et RAM pour le programme à utiliser. En flash, le code vit dans .text
et .const
, et RAM a des sections qui devraient vous être familières comme .heap
et .stack
, mais aussi .data
et .bss
. Le fichier de carte mémoire suit également cette structure : d’abord une vue d’ensemble, puis les marqueurs de section, puis les détails de ce qu’il y a à l’intérieur de chaque section.
Si vous obtenez un plantage, par exemple, et que vous savez où se situe la valeur numérique du compteur de programme lorsqu’il a pris la forme d’une poire, le .text
La section répertorie le nom de la fonction où cela s’est produit. La section avec les définitions des variables globales, classées par ordre alphabétique ? Vous pouvez probablement simplement faire défiler par cela – il y a beaucoup de redondance dans le fichier de carte, parfois trié par adresse mémoire, parfois trié par ordre alphabétique. Tu ne veux pas lire un fichier de carte, vous voulez juste plonger, obtenir ce dont vous avez besoin et sortir. Vous pensez que vous avez une variable écrasée ? Trouvez-le dans la section répertoriée par adresse et examinez ses voisins – l’un d’entre eux pourrait être dépassé.
Et aucune discussion sur la mémoire dans les microcontrôleurs n’est complète sans noter les dangers de ce qui se passe lorsque le tas de la RAM, qui croît vers le bas, embrasse la pile de la RAM, qui croît vers le haut. Que se passe-t-il alors ? Encore un appel de fonction et les fonctions commencent à écraser vos données. « C’est bon. Comme un chien assis dans un café en feu. Le problème est que c’est la partie de la gestion de la mémoire qui est dynamique, les fonctions appellent d’autres fonctions et la mémoire est allouée et effacée. L’entrée de l’utilisateur modifie les parties du programme exécutées et, par conséquent, l’emplacement de stockage des données. Voici le seul endroit où la carte mémoire habitude vous aider, sauf pour découvrir ce qui se trouve à proximité de l’endroit où l’accident s’est produit. Mais la vraie réponse à « Combien de RAM ai-je maintenant ? » est vraiment ineffable « Je ne sais pas ».
Si vous débutez dans la conception embarquée, les vingt premières minutes de l’exposé sont peut-être pour vous, et même si vous êtes un vétéran aguerri, vous apprendrez quelque chose des sections suivantes. J’ai vraiment apprécié le discours d’Elecia, et vous aussi. Vous pouvez le regarder intégré juste en dessous. Apportez également une copie des diapositives.