Question

Arrière-plan:

Je développe un projet à l'aide largish ATmega2560 Atmel AVR. Ce projet contient beaucoup de fonctions à base de matériel (7 périphériques SPI, 2 I2C, 2 ports RS485 MODBUS, beaucoup de analogique et numérique E / S). J'ai développé « pilotes » pour tous ces appareils qui fournissent la boucle principale de l'application avec une interface pour accéder aux données requises.

Question:

Le projet que je développe finira par répondre à des normes SIL.

Je voudrais être en mesure de tester le code et fournir un bon niveau de couverture de code. Cependant, je suis incapable de trouver des informations à me lancer sur la façon dont un tel cadre de test devrait être mis en place.

L'idée est que je peux avoir une suite de tests automatisés qui permettront l'avenir des corrections de bugs et l'ajout de fonctionnalités à tester pour voir si elles briser le code. La chose est que je ne comprends pas comment le code peut être testé sur puce.

Ai-je besoin de matériel pour surveiller les E / S sur l'appareil et émuler les périphériques externes connectés? Tous les indicateurs qui pourraient être fournis seraient très appréciés.

- Steve

Était-ce utile?

La solution

Ceci est une très bonne question - une préoccupation commune pour les développeurs de systèmes embarqués. Malheureusement, les développeurs les plus intégrés ne sont pas aussi préoccupés que vous êtes et tester uniquement le code sur le matériel réel. Mais comme une autre réponse a souligné, cela peut fondamentalement juste tester la fonctionnalité nominale du code et non pas les cas coin / d'erreur.

Il n'y a pas de solution simple et unique à ce problème. Certaines lignes directrices et techniques existent, pour faire un travail relativement bon.

Tout d'abord, séparer votre code en couches. Une couche doit être « agnostique matériel » - à savoir la fonction appelle . Ne pas demander à l'utilisateur d'écrire dans HW directement enregistre. Les autres offres de couche (inférieure) avec le HW. Cette couche peut être « moqué » afin de tester le niveau supérieur. Le niveau inférieur ne peut pas être vraiment testé sans HW, mais il ne va pas changer souvent et a besoin de l'intégration HW profonde, il est donc pas un problème.

« faisceau de test » A sera tout votre code agnostique HW de haut niveau avec un niveau inférieur « faux » spécifiquement pour les tests. Cela peut simuler les dispositifs HW pour la fonctionnalité correcte et incorrecte et vous permettre ainsi d'exécuter des tests automatisés sur le PC.

Autres conseils

Ne jamais exécuter des tests unitaires ou contre le matériel réel. Toujours se moquer de vos interfaces d'E / S. Dans le cas contraire, vous ne pouvez pas simuler les conditions d'erreur et, plus important encore, vous ne pouvez pas compter sur le test pour réussir.

Alors, que vous avez besoin est de diviser votre application en plusieurs morceaux que vous pouvez tester de façon indépendante. Simulator (ou maquette) tout le matériel que vous avez besoin pour ces tests et de les exécuter sur votre PC de développement.

Cela devrait couvrir la plupart de votre code et vous laisse avec les pilotes. Essayez de faire autant du code de conduite que le travail possible sans le matériel. Pour le reste, vous devrez trouver un moyen de rendre le code exécuté sur le matériel. Cela signifie généralement que vous devez créer un banc d'essai avec des appareils externes qui répondent aux signaux, etc. Comme il est fragile (comme dans « vos tests ne peuvent pas faire ce travail automatiquement »), vous devez exécuter ces tests manuellement après la préparation du matériel.

VectorCAST est un outil commercial pour exécuter des tests unitaires sur le matériel avec une couverture de code.

Avez-vous un connecteur JTAG? Vous pourrez peut-être utiliser JTAG pour simuler les conditions d'erreur sur la puce.

Je tiens à séparer les tâches. Par exemple, quand je fait un tampon circulaire pour mon Atmel AVR je l'ai écrit tout au Code :: Blocks et compilé avec le compilateur GCC régulier au lieu du compilateur GCC AVR, puis-je créer un test unitaire pour elle. J'ai utilisé un fichier d'en-tête spécial pour fournir les types de données appropriés que je voulais travailler avec (uint8_t par exemple). J'ai trouvé des erreurs avec les tests unitaires, les fixes, puis a pris le code fixe vers AVR Studio et l'intègre. Après cela, j'écrit les fonctions de support et ISR pour être compatibles avec le tampon en code utile (c.-à-pop un octet de la mémoire tampon, le pousser dans le registre de sortie de données UART, ajouter une constante de chaîne dans la mémoire tampon pour une fonction printf, etc.). Ensuite, je le simulateur AVR pour vous assurer que mes fonctions et ISRs étaient appelés et que les bonnes données ont montré dans les registres. Après que je l'ai programmé sur la puce et cela a fonctionné parfaitement.

Je préfère grandement les capacités de débogage du Code :: Blocks par rapport à AVR Studio donc j'utiliser l'approche ci-dessus chaque fois que je peux. Quand je ne peux pas me traiter habituellement avec du matériel seulement. Par exemple, j'ai une minuterie qui produit automatiquement une onde carrée. Le mieux que je pouvais faire était de voir que le bit de la broche était twiddled dans le simulateur. Après que je devais juste accrocher un champ et assurez-vous.

J'aime utiliser une approche multi-niveau lors du débogage des problèmes. Par exemple, avec l'horloge la première couche est «Mettez une sonde sur la broche d'horloge et voir s'il y a un signal là-bas. Sinon, sonder la broche sur le uC et chercher le signal. Ensuite, je une interface codé débogage dans un de mes UART où je peux regarder les valeurs de registre spécifiques et assurez-vous qu'ils sont ce qu'ils sont censés être. Donc, si cela ne fonctionne pas à l'étape suivante est « appeler la valeur du registre et assurez-vous qu'il est correct. »

Essayez de penser à quatre étapes à venir ou si à chaque fois que vous planifiez votre débogage. Il devrait y avoir + 5V, mais s'il n'y a pas? Ecrire dans l'interface de débogage une façon de basculer la broche et voir si cela change. Et si cela ne fonctionne pas? Faites quelque chose d'autre, etc etc etc Vous arrivez à un point où vous rencontrez « Je ne sais pas pourquoi cette chose dang NE FONCTIONNE PAS !!!! » mais nous espérons que vous allez découvrir la raison au préalable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top