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
> Vielleicht so:
Noe, der Processor des OPs ist doch bereits erwachsen. Also flex, bison,
Yacc usw.
Olaf
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
Ja, ich bin auch schon gespannt, wie dieser Informatikpraktikant dein Problem mit Yacc auf die Schnelle löst.
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.