Forum: Mikrocontroller und Digitale Elektronik Embedded C mit Matlab/Octave verifizieren


von Matthias (Gast)


Lesenswert?

Hallo,
ich bin unlangs zu einer anderen Firma gewechselt und werde dort nun 
verstärkt im embedded C Bereich eingesetzt, obwohl ich mehr aus der VHDL 
Ecke komme. Ich bin direkt in ein gerade gestartetes Projekt gesetzt, 
soll heißen dass die Vorüberlegungen zum Thema "welcher Controller" etc. 
schon beschlossen sind.
Im Kern geht es darum dass die Hardware die wir für den Kunden machen 
eine Reihe von digitalen Filtern und anderen Algorithmen beinhaltet. 
Diese sind allesamt schon in Octave designed, inklusive Stimuli und 
erwarteten Ausgangsdaten. Nun hat mein Projektleiter mir aufgetragen, 
genau diese schon bestehende Information zum Aufsetzen eines mehr oder 
weniger automatischen Test-Systems zu verwenden.
In der VHDL Ecke habe ich sowas ziemlich häufig gemacht (Matlab Modell, 
VHDL Simulation und Ausgangsdaten vergleichen). Da ich nicht so 
bewandert bin in der Test-Ecke von Embedded C wollte ich mal fragen ob 
mir jemand etwas Starthilfe geben könnte in dieser Sache um mich etwas 
einzulesen oder mich mit Prozeduren vertraut zu machen?!?
Unterm Strich wird dies ein Pilot-Projekt für 'Design by Test' in 
unserer Firma. Das bedeutet dass ich auch einen Continious Integration 
Server mit diesen automatischen Tests laufen lassen will/soll.
Soweit ich weiß (das Projekt ist mir gerade erst zugeteilt, ich hatte 
noch keine Gelegenheit die Details zu beschauen) sind die Matlab/Octave 
Modelle nicht wahnsinnig kompliziert, allerdings sind sie ziemlich 
zahlreich. Vorerst sollen die Test nur funktionell den zu erstellenden 
C-Code verifizieren. Erst im zweiten Schritt soll das ganze dann auch 
auf der Zielhardware getestet werden.
Im Vorraus vielen Dank
Matthias

von Test (Gast)


Lesenswert?

Wo ist hier die Frage?

TROLLALARM !!!

von Matthias (Gast)


Lesenswert?

Die Frage in Kurzfassung wäre, wie die Kopplung zwischen den schon 
bestehenden matlab/octave modellen inkl der stimuli und dem dann 
ersteltem quellcode (der dann auf der zielhardware laufen soll) aussehen 
soll. Irgendiwe sehe ich das noch nicht so richtig vor mir wie octave 
mit einer hand voll C Funktionen umgeht. Gut möglich dass das alles ganz 
einfach ist, aber mangels Erfahrung kann ich mir nunmal noch keinen Reim 
drauf machen.
Ich hoffe dass das die Situation etwas deutlicher macht?!?

Schade das immer gleich die Trolle bemüht werden müssen nur wenn man mal 
die Frage nicht versteht.

von Test (Gast)


Lesenswert?

Was willst du überhaupt testen ? Wenn ihr eh schon verifizierte Modelle 
habt und mit Codegenerierung arbeitet bringt es nichts da irgendetwas 
gegen zu testen...das einzig sinnvolle ist das ganze mit der echten 
Hardware zu verifizieren

von Ralf (Gast)


Lesenswert?

Moin Moin!
Verstehe ich Dich richtig, dass Du zum einen Simulationsmodelle auf dem 
PC hast die dann manuell in C-Code übertragen wurden und nun auf einem 
uC laufen? Diese Handcodierten Funktionen sollen nun auf dem uC getestet 
werden, oder? D.h. der Code soll auf dem uC Laufen und dann mit diversen 
Testdaten gefüttert werden und dann das Ergebnis mit den Ergebnissen aus 
den Simulationsmodellen verglichen werden?
Wenn ja, könntest Du das ganze über einen Debugger testen. D.h. manche 
Debugumgebungen unterstützen auch Skripsprachen um Tests zu 
automatisieren. Hier könnte man die Ergebnisse aus den Simulationen 
einlesen und dann mit den Ergebnissen aus dem Target vergleichen. Wie 
das ganze dann mit einem CI-Server zusammenläuft weiß ich nicht.
Ein anderer Ansatz wäre z.B. eine Erweiterung von Octave. Soweit ich 
weiß kann Octave mittels C-Funktionen erweitert werden. Hier Könntest Du 
eine Erweiterung schreiben die eine Verbindung zu deinem Target uC 
herstellt (z.B. per UART oder so). Dann känntest Du direkt von Octave 
aus Die Daten aus dem uC auslesen und direkt mit den Daten aus der 
Simulation vergleichen.

Viele Grüße...

von Matthias (Gast)


Lesenswert?

Ralf schrieb:
> Moin Moin!
> Verstehe ich Dich richtig, dass Du zum einen Simulationsmodelle auf dem
> PC hast die dann manuell in C-Code übertragen wurden und nun auf einem
> uC laufen? Diese Handcodierten Funktionen sollen nun auf dem uC getestet
> werden, oder? D.h. der Code soll auf dem uC Laufen und dann mit diversen
> Testdaten gefüttert werden und dann das Ergebnis mit den Ergebnissen aus
> den Simulationsmodellen verglichen werden?

Das wäre der zweite Schritt, das stimmt.
Der erste Schritt, so wurde mir aufgetragen, ist die reine funktionale 
Kontrolle. Soll heißen, die Eigenschaften eines bestimmten Algorithmus 
werden in C-Code übertragen, und genau dieser Code soll nun vom schon 
bestehenden Matlab Modell wieder verifiziert werden.
Soweit ich das bisher verstanden habe, besteht schon ein System dass so 
aussieht in Matlab:

Stimuli --> Filter --> Resultat

Diese 3 Dinge bestehen bereits. Was man jetzt scheinbar möchte ist den 
in Matlab erstellten Code durch den C-Code der auf dem uC laufen soll zu 
ersetzen. Die Stimuli füttern den Code, das resultat sollte, wenn man 
alles richtig gemacht hat, dann gleich dem theoretischen Modell sein 
(rundungsfehler ausgenommen vielleicht).
Im ersten Schritt läuft das ganze noch PC basiert, später dann auf dem 
uC. Wenn ich nur erstmal matlab/Octave soweit kriege den von mir 
erstellen sourcecode zu verwenden dann bin ich schon ziemlich weit 
gekommen.

von Martin (Gast)


Lesenswert?

Die Kunst liegt darin Stimulifiles zu erstellen
die  die Filter bin an den Rand der Aussteuergrenze bringen.

Wenn man  wirklich was falsch gemacht hat  dann sieht man das oft nicht
weil bestimmte Frequenzen interne Register  nur wenig aussteuern, andere
Frequenzen dafür umso mehr.

Also:  waveform  auf uC übertragen, uC Filter filtern lassen, gefilterte 
Waveform auf PC übertragen  und vergleichen. Wenn die Waveform  nicht
voll in den uC  Speicherpasst :  oops.

von Christopher (Gast)


Lesenswert?

Hallo,

wenn du Matlab hast dann solltest du vielleicht in einem Matlab-Forum 
fragen. In gomatlab.de wurde mir schon oft geholfen.

Wenn euer Code schön modular ist und die eigentlichen Funktionen keine 
mikrocontrollerspezifischen Zugriffe (interne Peripherie) haben, sollte 
es möglich sein C Code in Matlab einzubinden.

Eine automatisierte Auswertung auf dem Mikrocontroller wird da wohl 
schon schwieriger, da du dann möglicherweise die eigentliche 
Funktionskette von Sensor zur Verarbeitung zu Ausgabe/Steuerung/... mit 
dem Stimuli unterbrechen müsstest. Dabei änderst du aber schon wieder 
die Gesamtbedingungen und stellst damit die Frage nach der Wirksamkeit 
dieser Tests.

von Jan K. (jan_k)


Lesenswert?

Du kannst in matlab "normalen", microcontroller_un_spezifischen C und 
C++ Code mit coder.ceval('') einbinden und daraus eine MEX file (doc 
mex, doc coder) erzeugen lassen, oder du erzeugst nur aus dem reinen C 
Code eine MEX file.
Der C code könnte auch automatisch erzeugt werden (embedded coder), aber 
das scheint hier nicht wichtig zu sein.
Du kannst mit der MEX file genau so arbeiten, wie mit einem normalen 
matlab Skript file, du kannst nur nicht mehr "reingucken", da es sich 
dann um eine Binärdatei handelt.


Schöne Grüße,
Jan

von Mark 99 (Gast)


Lesenswert?

Zuerst ist mal zu klären: Hast du Matlab oder Octave?

Octave lehnt sich zwar an die Syntax und Funktion von Matlab an, aber 
für Matlab bekommt man ganz andere Toolboxen (schönes Denglish ...), 
z.B. für Tests mit HIL.

Daher ist es ein wichtiger Unterschied ob Octave oder Matlab. Nehmen wir 
an es ist Octave. Dann darfst du eigentlich alles selber bauen.

ICh habe sowas schon ein paar mal gemacht und die Realität ist, dass man 
das nicht mal eben Schnell in einem Forum-Posting erklären kann. 
Anfangen kannst du damit, dass du dir folgende Fragen beantwortest:

- C Implementierung

Auf der Zielhardware ausführen?
Oder auf einem PC simuliert?
Oder auf einem PC emuliert?

- Stimuli vorhanden

Injection der Daten in die Zielhardware?
Oder nur in die Software auf der Zielhardware?
Oder in die simulierter / emulierte PC Software?
   Entweder auf simulierter / emulierter Hardwareebene?
   Oder auf simulierter / emulierter Softwareebene?


- Erwartete Ergebnisse

Mit welcher Genauigkeit sollen die getroffen werden?
Sind die Testfälle bekannt? Besonders die Grenzfälle?
Wie aus der Zielhardware bekommen?
Oder aus der Simulation/Emulation?

- Steuerung und Ablauf

Steuerung des ganzen durch Octave? Dann ev. eigene Octave-Erweiterungen 
programmieren.
Steuerung z.B. durch eine Skriptsprache? Dann sorgfältige Auswahl (nicht 
einfach so einen Modedreck wie Python)
Wer kann / muss das Ganze warten? Spezialpersonal oder soll  muss  
kann jeder Entwickler neue Tests einbringen?
Steuerung durch ein Continuous Integration System? Welches?
Compilierung der C-Implementierungen durch wen und wann? Build-System, 
CI-System?
Loader / Test-Programm um die jeweiligen Algorithmen-Implementierungen?
Laden der Kompilate in die Hardware  Simulation  Emulation?
Kontrolle der Ausführung in der Hardware  Simulation  Emulation?


An jeder der Antworten hängt ein Rattenschwanz von Details dran, z.B. 
wenn es um Timing geht oder tolerierbare Abweichungen vom vorgegebenen 
Ergebnis.

von Matthias (Gast)


Lesenswert?

Vielen Dank für die vielen sinnvollen Antworten.
Das was ich suchte war das generieren von MEX. Ich hab da jetzt ein 
bisschen mit rumexperimentiert und es leistet auf jeden Fall genau was 
ich gesucht habe. Zugegeben ist das octave nicht gerade eine tolle 
Sprache um vernünftig automatisiert zu kompilieren, aber mit ein 
bisschen Krampf hat auch das hingehauen.
Ich finde die Dokumentation von MEX in Octave (vor allem die Funktion 
mkoctfile) und der Verwendung von mexFunction ein bisschen 
undurchsichtig und es gibt auch nicht wirklich viel darüber zu finden im 
Netz, aber nach ein bisschen Spielerei hat sich alles zu voller 
Zufriedenheit ergeben.
Nochmals danke!

von Frank (Gast)


Lesenswert?

Mark 99 schrieb:
> Steuerung z.B. durch eine Skriptsprache? Dann sorgfältige Auswahl (nicht
> einfach so einen Modedreck wie Python)
Python gibt es seit 1991. Was veranlasst Dich zu dem Prädikat 
'Modedreck'?
Ist TCL von 1988 besser? Welche Alternativen schlägst Du vor?

Frank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.