Unit-Test AVR-Assemblersprache


11

Wie testen Sie Ihren Baugruppencode?

Ich arbeite an einem seriellen Servocontroller als Teil eines Hexapod-Roboterprojekts und der Code ist an einem Punkt angelangt, an dem er kompliziert wird;) Wie auch immer, ich bin es gewohnt, in meiner täglichen Arbeit als C ++ - Serverentwickler und Unit-Tests zu verwenden Ich habe also versucht, die gleichen Arten von Tests auf meinen AVR-Assemblycode anzuwenden. Ich habe einen Weg gefunden, der für mich in Ordnung ist (siehe hier ), aber ich bin interessiert, ob es Standardwerkzeuge oder -techniken gibt, die mir fehlen.

Aktualisiert: Für diejenigen von Ihnen, die die volle Quelle an den Servoregler und die Unit - Tests sind jetzt verfügbar sind interessiert hier .

Antworten:


3

Ich würde dies auch als elegant beschreiben, möchte aber das Problem hinzufügen, wenn Sie mir mein Eindringen verzeihen.

Ich weiß, dass es sehr teure Softwarepakete gibt, um solche Situationen zu bewältigen, aber in der Firma, in der ich arbeite, können wir uns die Kosten nur leisten, wenn wir sicher sind, dass sie das tun, was wir brauchen.

Test Driven Development (TDD) ist eines der besseren Systeme, von denen ich für die Entwicklung gehört habe, und es macht mir Spaß, aber die Probleme, die meine Zeit in Anspruch nehmen, werden normalerweise durch komplexe Interrupt- und Hardwareereignisse verursacht, die viele als Störungen bezeichnen würden. Es scheint eine Kleinigkeit zu sein, alle 2 Stunden ein Problem zu haben, wenn sich die Sterne ausrichten. Wenn Ihr Telefon jedoch nur einmal pro Woche einfriert, verfluchen Sie den Namen des Ingenieurs. In unserem Fall müssen wir uns auf ein Futterplatz begeben, wenn die Dinge wirklich kaputt gehen, was ich, wie Sie sich vorstellen können, gerne meide.

Ich habe sehr intelligente Lösungen für die Überprüfung der Funktionalität von Subsystemen gesehen, die mir bei ordnungsgemäßer Implementierung wahrscheinlich 3 Stunden von einer 50-Stunden-Woche ersparen würden. Wenn es jedoch eine intelligente Möglichkeit gäbe, Pannensituationen zu finden, würde dies mir Wochen Arbeit ersparen auf der Suche nach dem "Bug", der gelegentlich unter starker Last auf dem Feld auftritt.

Dieser Beitrag hilft wahrscheinlich nicht viel, aber ich finde, alles ins Licht zu bringen macht es einfacher, alles zu lösen. Wenn es eine TDD-Methode zum Auffinden von Pannensituationen gäbe, könnte ich Zehntausende zuweisen, um dafür zu bezahlen. -Max


1
Ich habe nicht wirklich darüber nachgedacht, die Interaktion zwischen dem Interrupt-Code und dem Nicht-Interrupt-Code zu testen. Das ist ein guter Punkt. Ich hatte vor, meinen PWM-Generierungs-Timer-Interrupt-Code außerhalb einer Unterbrechungssituation zu testen, ähnlich wie ich meinen seriellen Hauptleitungscode teste. Ich denke, selbst wenn ich für all das Berichterstattung habe, fehlt mir immer noch die Interaktion. Ich nehme an, dass ich Interrupts innerhalb der Tests auslösen könnte (es ist einfach mit dem Timer-Interrupt, aber der gesamte Interrupt-Code könnte so eingestellt werden, dass er auf einem Timer-Interrupt innerhalb des Testkabels ausgeführt wird). Nicht trivial.
Len Holgate

1
Ich kann Sie falsch verstehen, aber ich versuche sehr vorsichtig mit Interrupt- und Interrupt-Code-Interaktionen umzugehen. Ich sollte bei der Verwendung von atomaren Operationen wahrscheinlich nachlässiger sein, aber es hat sich nie gezeigt, dass es auf der Ebene, auf der ich unseren Optimierer habe, Schaden anrichtet. Die Probleme treten auf, wenn ein Interrupt einen anderen verzögert. Ein häufiges Problem, bei dem ich Schülern helfe, ist die Interrupt-gesteuerte PWM-Generierung. Wenn Sie eine extrem präzise Geschwindigkeit benötigen, beispielsweise die Verwendung eines Vergleichsmoduls in Ihrem Chip, und ein anderer Interrupt beschäftigt ist, Zeit für etwas anderes zu verbringen, und Sie um 50 us verzögert, was ein Ende der Welt bedeuten könnte.
Kortuk

1
In einigen Fällen können Sie Priorität haben, oder Sie können sogar einen Interrupt selbst deaktivieren lassen und globale Interrupts intern wieder aktivieren, plattformabhängig, aber der einfachste Weg für meine eigene Entwicklung besteht darin, die Zeit für Interrupts auf absolut notwendige Dinge zu beschränken und normalen Code ausführen zu lassen der Rest der Arbeit.
Kortuk

1
Mein aktuelles Design wird in meinem Blog erklärt, ebenso wie ein vorgeschlagenes neues Design. Im Moment habe ich 64 PWM-Kanäle, die durch einen Timer-Interrupt und keine anderen Interrupts erzeugt wurden. Seriennummer wird durch Abfrage erstellt. Dies bedeutet, dass die PWM absolut solide ist, die Serie jedoch möglicherweise Probleme aufweist. Mein neues Design würde Interrupts für UART sowie den Timer für die PWM-Generierung und die sorgfältige Wiederaktivierung und Blockierung von Interrupts verwenden, um eine störungsfreie PWM- und störungsfreie UART-Verarbeitung sicherzustellen ...
Len Holgate

2
Ich habe das PWM als Beispiel verwendet. Das System, auf dem dieses Problem aufgetreten ist, verfügt über 3 SPI-Schnittstellen, wobei 1 der SPI-Verbindungen 3 Chips enthält, die wir verwenden. Es gibt 4 verschiedene Port-Interrupts, die über die Änderung des Zustands externer Chips und einige andere Dinge informieren. Das Problem wird umso schlimmer, je mehr Schnittstellen Sie haben.
Kortuk

2

Interessant. Nach Weihnachten hatte ich vor, Assembler mit Bildern zu machen. Wenn ich etwas mehr Zeit habe, werde ich mir Ihr System genauer ansehen.

Eine Möglichkeit, die ich sehen könnte, wäre, ein Framework in einer anderen Sprache zu schreiben, um die Scheinobjekte usw. zu erstellen und abzureißen, aber wie Sie dies mit dem Chip / der Simulation verbinden würden, wäre ein Problem.

Wenn es jedoch zu lästig wird, überwiegt dies die Vorteile von Unit-Tests und macht Sie weniger daran interessiert, es zu verwenden.


Es war meine erste Hürde, es im Simulator zum Laufen zu bringen, bis ich herausgefunden hatte, wie ich den Code in separate Dateien aufteilen und einfach einige der Beschriftungen "verspotten" kann, zu denen ich im realen Code springen würde. Ich werde das Ganze posten, sobald ich fertig bin. Das Nachrüsten der Komponententests an den Code dauert eine Weile, hat sich aber gelohnt.
Len Holgate

Jetzt, da ich die Gelegenheit hatte, Ihre Methodik durchzusehen, finde ich sie ziemlich elegant. Vielleicht schaue ich mir avrs nach Weihnachten an, da es für sie viel mehr Community-basierte Dinge zu geben scheint als für die Bilder. Irgendwelche Ideen, was eine anständige Linux-IDE für die AVR Assembler-Programmierung sein könnte.
Amos

1
Es gibt eine GNU-Toolkette, die Sie anstelle von AVR Studio (dem kostenlosen Toolset von Atmel) verwenden können. Es ist wahrscheinlich möglich, das unter Linux auszuführen, aber ich habe es nicht gebraucht.
Len Holgate


Mein Hauptanliegen bei diesem Artikel ist, dass er aus dem Jahr 2005 stammt und daher möglicherweise veraltet ist.
Amos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.