Frage

Es gibt zwar viele Unit-Test-Frameworks ist die C unterstützen, ich bin ein wenig ratlos, wie Unit-Tests für Microcontroller-Code zu schreiben (PIC in meinem Fall, aber ich denke, die Frage als allgemeiner ist).

Ein großer Teil der Code für Mikrocontroller geschrieben dreht Schreiben um Konfiguration und Datenwerte in Register, Lesen eingehenden Daten aus Registern und reagiert Ereignisse zu unterbrechen. Ich frage mich, ob jemand einige Hinweise auf der effektivste Weg, um diese zur Verfügung stellen kann.

War es hilfreich?

Lösung

Sie schreiben;

„Ein großer Teil des Code für Mikrocontroller geschrieben drehen Schreiben um Konfiguration und Datenwerte in Registern, eingehende Daten aus den Registern zu lesen und reagieren Ereignisse zu unterbrechen“.

Ich bin damit einverstanden, dass dies oft der Fall in der Praxis, aber ich weiß nicht wirklich denke, das ist eine gute Sache, und ich denke, die Dinge ein wenig zu überdenken werden Ihnen mit Ihren Testzielen helfen.

Vielleicht, weil Mikrocontroller Programmierer können erreichen und berühren die Hardware jederzeit die sie mögen, viele (die meisten?) Von ihnen haben sich angewöhnt, nur zu tun, dass, während ihres gesamten Code. Oft wird diese Gewohnheit fraglos gefolgt, vielleicht weil so viele Leute diese Art von Arbeit zu tun sind EEs nicht Informatiker durch Ausbildung und Neigung. Ich weiß, begann ich mich auf diese Weise aus.

Der Punkt, auf den ich versuche, ist, dass Mikrocontroller-Projekte können und sollten gut wie jede andere Software-Projekt entwickelt werden. Ein wirklich wichtiger Teil von gutem Design ist der Hardware-Zugriff auf Hardware-Treiber zu beschränken! Abzuteilen den gesamten Code, Register schreibt, reagiert auf Interrupts usw. in Module, die den Rest der Software mit schönen, sauberen, abstrahiert Zugriff auf die Hardware zur Verfügung stellen. Testen Sie diese Treibermodule auf dem Ziel mit Logikanalysatoren, Oszilloskope, kundenspezifische Prüfstände oder was auch immer sonst macht Sinn.

Ein wirklich wichtiger Punkt ist, dass jetzt der Rest der Software, hoffentlich die große Mehrheit davon, jetzt nur C-Code, den Sie auf einem Host-System laufen und testen können. Auf dem Host-System wird die Hardware-Module in eine Art und Weise stubbed aus, die Sichtbarkeit in dem, was der im Test befindlichen Code liefert tut. Sie können Test Mainstream-Einheit Ansätze auf diesem Code verwenden. Dies muss einige Vorbereitungen und Arbeit, aber wenn Sie gut organisiert sind, können Sie ein wiederverwendbares System erstellen, die für alle Ihre Projekte anwenden können. Die potenziellen Vorteile sind enorm. Ich schrieb ein wenig mehr über diese Ideen hier;

[ http://discuss.joelonsoftware.com/default .asp? joel.3.530964.12] [1]

Andere Tipps

Ein Ansatz hierfür könnte sein, einen Emulator zu verwenden. Ich habe auf einem AVR-Emulator arbeitet und eine der Ideen, denn es ist in der Tat zu Unit-Test-Code. Der Emulator implementiert die CPU und Register, Interrupts und verschiedene Peripheriegeräte, und (in meinem Fall) Bytes zu dem emulierten UART zum regulären stdout des Emulators gehen geschrieben. Auf diese Weise Code Unit-Test kann im Emulator laufen und ihre Testergebnisse an die Konsole schreiben.

Natürlich muss man auch dafür sorgen, dass der Emulator richtig das Verhalten der realen CPU implementiert, da sonst die Unit-Tests oben auf, dass nicht vertraut werden kann.

Schreiben Sie Mock-Versionen Ihrer Registerzugriffsfunktionen / Makros. Beachten Sie, dass dies setzt voraus, dass Ihr Code verwendet einen gemeinsamen Satz von Registerzugriffsfunktionen und nicht ad-hoc-Sachen wie *(volatile int*)0xDEADBEEF = 0xBADF00D überall.

Rufen Sie Ihre Interrupt-Handler direkt von Ihrem Testcode, ein „Software-Interrupt“, wenn vorhanden, oder von einem Timer-Interrupt-Handler (kann auch auf einigen architectures¹ problematisch sein), wenn Sie sie benötigen asynchron auszuführen. Diese erforderlich machen können Interrupt aktivieren / deaktivieren Code in Funktionen / Makros Verpackung, die Sie spotten kann.

¹ 8051 in den Sinn kommt: zumindest mit dem Keil 8051 Compiler, können Sie direkt Interrupt-Funktionen nicht aufrufen. Dies obwohl mit dem C-Präprozessor werden könnte ausgearbeitet.

Gibt es vielleicht irgendeine Art von Loopback-Modus, so dass Sie die Steuerung selbst Ereignisse zu erzeugen, verwenden können, die Sie testen gegen können?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top