Test unitaire du langage d'assemblage AVR

11

Comment testez-vous à l'unité votre code d'assemblage?

Je travaille sur un servocontrôleur série dans le cadre d'un projet de robot hexapode et le code est au point où ça devient compliqué;) Quoi qu'il en soit, j'ai l'habitude d'utiliser des tests unitaires dans mon travail de jour en tant que développeur de serveur C ++ et ont donc essayé d'appliquer les mêmes types de tests à mon code d'assemblage AVR. J'ai trouvé un moyen qui fonctionne bien pour moi (voir ici ) mais je suis intéressé s'il y a des outils ou des techniques standard qui me manquent.

Mise à jour: Pour ceux d'entre vous qui sont intéressés, la source complète du servo-contrôleur et les tests unitaires sont maintenant disponibles ici .

Len Holgate
la source

Réponses:

3

Je décrirais également cela comme élégant, mais je voudrais ajouter le problème, si vous pardonnez mon intrusion.

Je sais qu'il existe des logiciels très coûteux pour gérer des situations comme celle-ci, mais dans l'entreprise où je travaille, nous ne pouvons pas nous permettre le coût à moins d'être sûrs qu'il fait ce dont nous avons besoin.

Le développement piloté par les tests (TDD) est l'un des meilleurs systèmes dont j'ai entendu parler pour le développement, et je l'apprécie, mais les problèmes qui prennent mon temps sont généralement causés par des interruptions complexes et des événements matériels que beaucoup appellent des problèmes. Cela semble être une chose mineure d'avoir un problème toutes les 2 heures lorsque les étoiles s'alignent, mais si votre téléphone gelait une fois par semaine, vous maudiriez le nom de l'ingénieur. Dans notre cas, nous devons marcher dans un lot d'alimentation lorsque les choses se cassent vraiment, ce que, comme vous pouvez l'imaginer, j'aime éviter.

J'ai vu des solutions très intelligentes pour vérifier la fonctionnalité des sous-systèmes, qui, si elles étaient correctement mises en œuvre, me feraient probablement gagner 3 heures sur une semaine de travail de 50 heures, mais s'il y avait un moyen intelligent de trouver des situations de pépin, cela me ferait économiser des semaines de travail à la recherche du "bug" qui se produit occasionnellement sur le terrain sous une lourde charge.

Ce message n'aide probablement pas beaucoup, mais je trouve que tout mettre en lumière rend tout plus facile à résoudre. S'il y avait une méthode TDD pour trouver des situations de pépin, je pourrais obtenir 10s de milliers alloués pour le payer. -Max

Kortuk
la source
1
Je n'ai pas vraiment pensé à tester l'interaction entre le code d'interruption et le code de non interruption. C'est un bon point. Je prévoyais de tester mon code d'interruption du minuteur de génération PWM en dehors d'une situation d'interruption d'une manière similaire à la façon dont je teste mon code série de ligne principale. Je suppose que même une fois que j'ai une couverture pour tout cela, l'interaction me manque toujours. Je suppose que je pourrais déclencher des interruptions à partir des tests (c'est facile avec l'interruption de la minuterie mais tout le code d'interruption peut être défini pour s'exécuter sur une interruption de la minuterie dans le faisceau de test). Non trivial cependant.
Len Holgate
1
Je peux vous mal comprendre, mais j'essaie de faire très attention aux interactions de non-interruption et d'interruption de code. Je devrais probablement être plus laxiste dans mon utilisation des opérations atomiques, mais il n'a jamais été démontré qu'il pouvait nuire au niveau de notre optimiseur. Les problèmes surviennent lorsqu'une interruption en retarde une autre, la plus courante avec laquelle j'aide les élèves serait la génération de PWM déclenchée par interruption. Si vous avez besoin d'une vitesse extrêmement précise, par exemple en utilisant un module Compare dans votre puce, et qu'une autre interruption est occupée à passer du temps sur autre chose et vous retarde de 50uS qui pourrait être la fin du monde.
Kortuk
1
Dans certains cas, vous pouvez avoir la priorité, ou vous pouvez même avoir une interruption se désactiver et réactiver les interruptions globales en interne, en fonction de la plate-forme, mais le chemin le plus simple pour mon propre développement est de limiter le temps d'interruption aux choses absolument nécessaires et d'avoir un code normal. le reste du travail.
Kortuk
1
Mon design actuel est expliqué sur mon blog, tout comme un nouveau design proposé. À l'heure actuelle, j'ai 64 canaux de PWM générés par une interruption de minuterie et aucune autre interruption; la série se fait par interrogation. Cela signifie que le PWM est solide, mais la série peut avoir des problèmes. Ma nouvelle conception utiliserait des interruptions pour UART ainsi que la minuterie pour la génération de PWM et une réactivation et un blocage soigneux des interruptions pour assurer un traitement PWM sans glitch et UART sans glitch ...
Len Holgate
2
J'utilisais le PWM comme exemple, le système sur lequel j'ai eu ce problème a 3 interfaces SPI avec 1 des connexions SPI avec 3 puces que nous utilisons. Il y a 4 interruptions de port différentes informant du changement d'état des puces externes et de quelques autres choses en cours. Le problème s'aggrave à mesure que vous disposez d'interfaces.
Kortuk
2

Intéressant. Après Noël, je prévoyais de faire un assembleur avec des photos, quand j'aurai un peu plus de temps, j'aurai un bon aperçu de votre système.

Une façon que je pourrais voir serait de scripter une sorte de framework dans un langage différent pour créer et démolir les objets fictifs, etc., mais comment vous interfaceriez cela avec la puce / simulation serait un problème.

Si cela devient trop onéreux, cela l'emportera sur les avantages des tests unitaires et vous rendra moins désireux de l'utiliser.

Amos
la source
Le faire fonctionner à l'intérieur du simulateur a été mon obstacle initial jusqu'à ce que je trouve comment séparer le code en fichiers séparés et simplement "simuler" certaines des étiquettes que je sauterais dans le vrai code. Je posterai le tout une fois que j'aurai terminé. La conversion des tests unitaires en code prend du temps, mais cela en valait la peine.
Len Holgate
Maintenant que j'ai eu la chance de parcourir votre méthodologie, je pense que c'est assez élégant. Je vais peut-être jeter un œil aux avrs après Noël, car il semble y avoir beaucoup plus de choses basées sur la communauté pour eux que pour les photos. Toutes les idées que pourrait être un IDE Linux décent pour la programmation de l'assembleur AVR.
Amos
1
Il existe une chaîne d'outils GNU que vous pouvez utiliser à la place d'AVR Studio (qui est le jeu d'outils gratuit d'Atmel). Il est probablement possible de l'exécuter sous Linux, mais je n'en ai pas eu besoin.
Len Holgate
Je viens de trouver ce lien vers un article du Linux Journal sur le développement pour AVR sous Linux: linuxjournal.com/article/7289
Len Holgate
Ma principale préoccupation avec cet article est qu'il date de 2005 et peut donc être obsolète.
Amos