Frage

Ich arbeite an einem eingebetteten C-Projekt, das auf einem externen HW abhängt. Ich wünsche den Code Stub diese Teile zugreifen, so kann ich das System simulieren, ohne dass HW zu verwenden. Bis jetzt habe ich einige Makros verwendet, aber dies zwingt mich ein wenig auf meinem Produktionscode zu ändern, was Ich mag würde vermeiden.

Beispiel:

stub.h
#ifdef _STUB_HW
#define STUB_HW(name) Stub_##name
#else /*_STUB_HW*/
#define STUB_HW(name) name
#endif /*_STUB_HW*/

my_hw.c
WORD STUB_HW(clear_RX_TX)()
{ /* clear my rx/tx buffer on target HW */ }

test_my_hw.c
#ifdef _STUB_HW
WORD clear_RX_TX()
{ /* simulate clear rx/tx buffer on target HW */ }

Mit diesem Code kann ich ein- / ausschalten das Anstoßen mit dem Prä-Prozessor-Tag _STUB_HW
Gibt es eine Möglichkeit, dies zu erledigenden, ohne dass meinen prod-Code zu ändern, und eine Menge ifdefs zu vermeiden. Und ich werde nicht prod und Testcode in der gleichen Datei mischt, wenn ich es vermeiden kann. Mir ist es egal, wie der Test-Code, so lange sieht aus, als ich so viel wie möglich aus dem Produktionscode halten können.

Edit:

Wäre schön, wenn es posible ist Funktionen auszuwählen / umbenennen, ohne die gesamte Datei zu ersetzen. Wie nehmen Sie alle Funktionen auf nRF_## beginnen und dann einen neuen Namen zu geben und dann test_nRF_## Einfügen nRF_## wenn es posible

War es hilfreich?

Lösung

Ich mache nur zwei Dateien ActualDriver.c und StubDriver.c genau die gleichen Funktionsnamen enthält. Indem zwei Builds Verknüpfung der Produktionscode gegen die verschiedenen Objekte Es gibt keine Namenskonflikte. Auf diese Weise des Produktionscode enthält keine Tests oder bedingten Code.

Andere Tipps

Wie Gerhard sagte, verwenden eine gemeinsame Header-Datei „driver.h“ und separate Hardwareschicht Implementierungsdateien die tatsächliche enthält und stubbed Funktionen.

In Eclipse, habe ich zwei Ziele und ich „ausschließen Build“ der driver.c Datei, die nicht verwendet werden soll, und stellen Sie sicher, die richtige ist im Build enthalten ist. Eclipse erzeugt dann die Make-Datei zum Zeitpunkt der Erstellung.

Ein weiteres Problem, darauf zu hinweisen, ist, dass Sie, um sicherzustellen, definieren feste Größe ganzen Zahlen so Ihr Code das gleiche aus einem Überlauf Perspektive verhält. (Obwohl aus dem Code Probe kann ich sehen, Sie tun das.)

ich mit der oben zustimmen. Die Standard-Lösung ist einen opaken abstrahierten Satz von Funktionsaufrufen zu definieren, die die „Treiber“ auf die hw sind, und daß dann in dem Hauptprogramm aufrufen. Dann bieten zwei verschiedene Treiberimplementierungen, eine für hw, eine für sw. Die SW-Variante wird den IO-Effekt des hw in geeigneter Art und Weise simuliert werden.

Beachten Sie, dass, wenn das Ziel auf einem niedrigeren Niveau ist, das heißt, Code zu schreiben, wo jeder Zugang Hardware simuliert werden soll, anstatt ganze Funktionen, es könnte ein bisschen tricker sein. Aber hier, anders „write_to_memory“ und „read_from_memory“ Funktionen (oder Makros, wenn die Geschwindigkeit auf Ziel wesentlich ist) definiert werden.

Es gibt keine Notwendigkeit, in beiden Fällen die Namen von Funktionen zu ändern, müssen nur zwei verschiedene Batch-Dateien, machen Dateien oder IDE Ziele bauen (je nachdem, welche Tools Sie verwenden).

Schließlich ist in vielen Fällen eine bessere technische Lösung ist für einen ausgewachsenen Zielsystem-Simulator gehen, wie zum Beispiel Qemu , Simics , SystemC , CoWare , VaST , oder ähnliches. Auf diese Weise können Sie den gleichen Code laufen die ganze Zeit, und Sie stattdessen ein Modell der Hardware, wie die eigentliche Hardware aus der Sicht der Software arbeitet bauen. Es braucht eine viel größere Anfangsinvestitionen, aber für viele Projekte es ist die Mühe wert. Es wird im Grunde Loswerden der fiesen Problem verschiedener mit Builds für Ziel und Host und stellt sicher, dass Sie verwenden, um Ihre Cross-Compiler mit Einsatz Build-Optionen immer. Beachten Sie, dass viele Embedded-Compiler Suiten sind mit einigen grundlegenden solche Simulation Fähigkeit eingebaut.

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