Unit-Tests der AVR-Assemblersprache

Wie testen Sie Ihren Assembler-Code?

Ich arbeite an einem seriellen Servocontroller als Teil eines Hexapod-Roboterprojekts und der Code ist an einem Punkt angelangt, an dem es kompliziert wird ;) Wie auch immer, ich bin es gewohnt, Unit-Tests in meinem täglichen Job als C++-Serverentwickler zu verwenden und Ich habe also versucht, die gleichen Arten von Tests auf meinen AVR-Assemblercode 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 unter Ihnen, die daran interessiert sind, sind jetzt die vollständigen Quellen zum Servocontroller und die Komponententests hier verfügbar .

Antworten (2)

Ich würde dies auch als elegant bezeichnen, möchte aber das Problem hinzufügen, wenn Sie meine Störung verzeihen.

Ich weiß, dass es sehr teure Softwarepakete gibt, um Situationen wie diese zu bewältigen, aber in der Firma, in der ich arbeite, können wir uns die Kosten nicht leisten, wenn wir nicht 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 ich genieße es, aber die Probleme, die meine Zeit in Anspruch nehmen, werden normalerweise durch komplexe Interrupts und Hardwareereignisse verursacht, die viele Glitches nennen würden. Es scheint eine Kleinigkeit zu sein, alle 2 Stunden ein Problem zu haben, wenn sich die Sterne ausrichten, aber wenn Ihr Telefon nur einmal pro Woche einfriert, würden Sie den Namen des Ingenieurs verfluchen. In unserem Fall müssen wir in einen Futterplatz wandern, wenn es wirklich kaputt geht, was ich, wie Sie sich vorstellen können, gerne vermeide.

Ich habe sehr intelligente Lösungen zur Überprüfung der Funktionalität von Subsystemen gesehen, die mir bei richtiger Implementierung wahrscheinlich 3 Stunden einer 50-Stunden-Woche einsparen würden, aber wenn es einen intelligenten Weg gäbe, Glitch-Situationen zu finden, würde mir das Wochen Arbeit ersparen Suchen Sie nach dem "Fehler", der gelegentlich im Feld unter hoher Last auftritt.

Dieser Beitrag hilft wahrscheinlich nicht viel, aber ich finde, alles ans Licht zu bringen, macht es einfacher, alles zu lösen. Wenn es eine TDD-Methode zum Auffinden von Glitch-Situationen gäbe, könnte ich Zehntausende dafür bekommen, dafür zu bezahlen. -max

Ich habe nicht wirklich darüber nachgedacht, die Interaktion zwischen dem Interrupt-Code und dem Nicht-Interrupt-Code zu testen. Es ist ein guter Punkt. Ich hatte vor, meinen PWM-Generierungs-Timer-Interrupt-Code außerhalb einer Unterbrechungssituation auf ähnliche Weise zu testen, wie ich meinen seriellen Hauptleitungscode teste. Ich denke, selbst wenn ich all das abgedeckt habe, vermisse ich immer noch die Interaktion. Ich nehme an, dass ich Interrupts innerhalb der Tests auslösen könnte (mit dem Timer-Interrupt ist es einfach, aber der gesamte Interrupt-Code könnte so eingestellt werden, dass er auf einem Timer-Interrupt innerhalb des Testrahmens ausgeführt wird). Allerdings nicht trivial.
Ich verstehe Sie vielleicht falsch, aber ich versuche, bei Code-Interaktionen ohne Interrupt und Interrupt sehr vorsichtig zu sein. Ich sollte bei der Verwendung atomarer Operationen wahrscheinlich lockerer 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 Studenten helfe, wäre die Interrupt-gesteuerte PWM-Erzeugung. Wenn Sie eine extrem genaue Geschwindigkeit benötigen, zum Beispiel mit einem Vergleichsmodul in Ihrem Chip, und ein anderer Interrupt damit beschäftigt ist, Zeit mit etwas anderem zu verbringen, und Sie um 50 uS verzögert, könnte dies das Ende der Welt bedeuten.
In einigen Fällen können Sie Priorität haben, oder Sie können sogar einen Interrupt selbst deaktivieren und globale Interrupts intern wieder aktivieren, plattformabhängig, aber der einfachste Weg für meine eigene Entwicklung besteht darin, die Zeit im Interrupt auf absolut notwendige Dinge zu beschränken und normalen Code zu erledigen der Rest der Arbeit.
Mein aktuelles Design wird in meinem Blog erklärt, ebenso wie ein vorgeschlagenes neues Design. Im Moment habe ich 64 PWM-Kanäle, die von einem Timer-Interrupt und keinen anderen Interrupts generiert werden. seriell erfolgt durch Polling. Das bedeutet, dass die PWM felsenfest ist, aber die Serie kann Probleme haben. Mein neues Design würde Interrupts für UART sowie den Timer für die PWM-Generierung und eine sorgfältige Wiederaktivierung und Blockierung von Interrupts verwenden, um eine störungsfreie PWM- und störungsfreie UART-Verarbeitung sicherzustellen ...
Ich habe PWM als Beispiel verwendet, das System, auf dem ich dieses Problem hatte, hat 3 SPI-Schnittstellen, wobei 1 der SPI-Verbindungen 3 Chips hat, die wir darauf verwenden. Es gibt 4 verschiedene Port-Interrupts, die über Statusänderungen externer Chips und einige andere Vorgänge informieren. Das Problem wird schlimmer, je mehr Schnittstellen Sie haben.
Verstehe. Ich habe noch nicht herausgefunden, wie es möglich sein könnte, solche Wechselwirkungen zu testen. Der Hauptgrund für die Frage war herauszufinden, ob andere bessere Ideen hatten :)
Ja, ich habe Ihre Frage verstanden und fand sie ausgezeichnet. Ich konnte der Antwort nichts hinzufügen, warum also nicht den Fragenraum erweitern?

Interessant. Nach Weihnachten hatte ich vor, mich mit Assembler mit Pics zu beschäftigen, wenn ich etwas mehr Zeit habe, werde ich mir Ihr System genau ansehen.

Eine Möglichkeit, die ich sehen könnte, wäre, eine Art 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 mühsam wird, überwiegt das die Vorteile von Unit-Tests und macht Sie auch weniger daran interessiert, es zu verwenden.

Es im Simulator zum Laufen zu bringen, war meine erste Hürde, bis ich herausfand, wie ich den Code in separate Dateien aufteilen und einfach einige der Labels "mocken" konnte, zu denen ich im echten Code springen würde. Ich poste das Ganze sobald ich fertig bin. Das Nachrüsten der Unit-Tests in den Code dauert eine Weile, aber es hat sich gelohnt.
Jetzt, wo ich Gelegenheit hatte, Ihre Methodik durchzusehen, finde ich sie ziemlich elegant. Vielleicht schaue ich mir nach Weihnachten mal avrs an, da es anscheinend viel mehr Community-basiertes Zeug für sie gibt als für die Pics. Irgendwelche Ideen, was eine anständige Linux-IDE für die AVR-Assembler-Programmierung sein könnte.
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 musste es nicht.
Ich habe gerade diesen Link zu einem Artikel im Linux Journal über die Entwicklung für AVR unter Linux gefunden: linuxjournal.com/article/7289
Mein Hauptanliegen bei diesem Artikel ist, dass er aus dem Jahr 2005 stammt und daher möglicherweise veraltet ist.
Ich mache die ganze Zeit AVR-GCC unter Linux. Es funktioniert wie ein Weltmeister. (und wenn Sie Arduino unter Linux verwendet haben, haben Sie es auch verwendet)