Hallo,
ich benötige eine Lösung für folgende Problemstellung
Randbedingungen:
- Cortex M3/ 32-bit/ Clock Frequenz 72MHz
- 8 A/D Kanäle (wir nennen das mal X)
- 8 D/A Kanäle (wir nennen das mal Y)
- Abtastraten jeweils ca. 200Hz (konstant)
Aufgabe:
Y=F(X)
Wobei F() nicht fix ist, sondern durch den Anwender per UART vom
PC aus einstellbar ist.
Ein Beispiel wäre:
y1 = 0.5 * (x1 + x2);
wenn x3 < 0.5 y2 = 0 sonst y2 = 1;
y3 = 0.25 * x4^2;
y4 = x4 + 0.5 * x5;
Ok, klar ist, dass das Set an Möglichkeiten eingeschränkt werden muss
und
die Rechenzeit ausreichen muss, um alles einmal pro 200Hz-Zyklus zu
berechnen. Das Compilieren der Funktionen ist nicht möglich. Es wird zur
Laufzeit konfiguriert.
Frage:
Wie könnte die Beschreibung der Abbildung F() im PC erfolgen und wie
könnte man alles im Cortex M3 so vorbereiten, dass er dann so flexibel
rechnen kann?
Gruss
- Frank
Hallo Olaf,
also was chris meinte hab' ich verstanden und ist im Prinzip die Lösung,
wenn auch nicht so simpel.
Kannst Du mir bitte nochmal erklären, wie ich z.B. yacc benutze? Meinst
Du, ich compiliere es für den Cortex M3 und lasse es dort laufen oder
ich lasse es auf dem PC laufen und schicke was zum uC?
Danke & Gruss
- Frank
> Meinst> Du, ich compiliere es für den Cortex M3 und lasse es dort laufen oder> ich lasse es auf dem PC laufen und schicke was zum uC?
Also ich habe ein vergleichbares Problem (forth-compiler) vor einigen
Jahren mal mit flex geloest. Da beschreibst du die Syntax mit der
flex-Sprache und das Programm erzeugt dir dann einen C-Source. Den
kannst du dann in deinem Project uebersetzen.
Du definierst also z.b was eine Zahl sein soll, was ein Operator usw.
Der Parser wird automatisch generiert und ruft dann deine Funktionen auf
die mit den einzelnen Elementen arbeiten. Das ist natuerlich nicht ganz
so effizient als wenn du alles selber von Hand machen wuerdest, hat aber
den grossen Vorteil das du deine Sprache einfach um neue Elemente
erweitern kannst. Mit anderen Worten fuer einen Mega8 wohl nicht die
beste Loesung, fuer deinen Prozessor sollte das aber wohl gehen.
Schau dir mal die Datei forth.lex an, da siehst du das Prinzip.
http://www.criseis.ruhr.de/st6/st61.html> Ja, ich bin auch schon gespannt, wie dieser Informatikpraktikant> dein Problem mit Yacc auf die Schnelle löst.
Und was ist mit dir? Bischen rumstaenkern ohne es besser zu koennen oder
war es dir nur langweilig unter deinem Stein?
Olaf
Hallo Olaf,
danke, dass Du nochmal geantwortet hast.
Ich hab's immer noch nicht verstanden. Kannst Du bitte nochmal erklären,
wo ich was laufen lasse und wer wann was übersetzt. Vielleicht ein
Beispiel zum Verständnis?
Sorry, dass ich so auf dem Schlauch stehe! ;-)
Gruss
- Frank
Frank schrieb:> Hallo,>> ich benötige eine Lösung für folgende Problemstellung>> Randbedingungen:> - Cortex M3/ 32-bit/ Clock Frequenz 72MHz> - 8 A/D Kanäle (wir nennen das mal X)> - 8 D/A Kanäle (wir nennen das mal Y)> - Abtastraten jeweils ca. 200Hz (konstant)>> Aufgabe:>> Y=F(X)
Wenn Dir lineare Abbildungen ausreichen, kannst Du Dein Problem in
Matrizenform formulieren:
(jetzt mal für n=2 dargestellt)
Das kann man dann relativ effizient ausrechnen
Benute eine Lib, die die Rechnung parst und entsprechend auswerted.
Wenn Geschwindigkeit gefragt ist, kann dieselbe Funktion die Gleichung
nach Präzedenz entschlüsseln, asm zurechtlegen und den codeblock
abspeichern/ausführen, je nach dem wie das gelöst wird mit der
permanenten Datenspeicherung.
hier ein Beispiel wie ich es meine, dies ist nicht die lib auf die ich
mich
beziehe, die ist auf einem anderen Rechner, es ist eine ähnliche
einfachere Sache, aber das Prinzip ist dasselbe.
http://www8.cs.umu.se/~isak/snippets/eval.c
> Ich hab's immer noch nicht verstanden. Kannst Du bitte nochmal erklären,> wo ich was laufen lasse und wer wann was übersetzt. Vielleicht ein> Beispiel zum Verständnis?
Hm..ganz einfach. Du brauchst einen Parser. Also ein Programm das deinen
Eingabestring zerlegt in Dinge mit denen ein Computer arbeiten kann.
Hast du dir mal die von mir erwaehnte Datei angeschaut?
Da wird definiert wie die Elemente ausehen. In meinem Beispiel also
also Zahlen und Befehle. Diese Datei mit der Endung .lex wird auf deinem
Computer mit flex in ein C-Source uebersetzt. Den kannst du dann
ueberrall, also auch auf deinem Controller einbinden.
Du bekommst dann einen Source dem du deine Eingabe geben kannst und der
von dir zu schreibende C-Funktionen aufruft wenn er eine Zahl findet
oder sagen wir mal einen Operator wir * oder +. Du siehst so ein
Programm nimmt dir die dumme fehlerintensive Arbeit ab. Rechnen musst du
aber hinterher noch selber.
Interessant wird es natuerlich hinterher mit dem rechnen. Du koenntest
natuerlich das was der Parser dir liefert jedesmal erneut ausrechnen.
Und du bist ja recht langsam. Allerdings haengt die Geschwindigkeit
natuerlich auch von der Eingabefunktion ab. Es koennte also sein das du
sie ersetzen musst du sagen wir mal eine Funktion n'ter Ordnung. Damit
verlierst du vielleicht an Genauigkeit, dafuer ist deine Rechnenzeit
vorhersagbar.
Auf jedenfall eine interessante Aufgabe die du dir da ausgesucht hast.
:-)
> Wenn Dir lineare Abbildungen ausreichen, kannst Du Dein Problem in> Matrizenform formulieren:
Sowas ist natuerlich am einfachsten. Aber dann muss der Anwender immer
vorher arbeiten was der Programmierer an Aufwand gespart hat. :-)
Olaf