Hallo, ich habe einen Atmega und mein Ausgabewert in Abhängigkeit von der Eingabe kann ich mit folgender Formel darstellen: y = 1000-7,85(x-3)+4,53(x-3)2-0.55(x-3)^3-0.02(x-3)^4 oder bereits fertig berechnet als Array für meine 120 Eingabemöglichkeiten. Was ist hier effektiver? Mein RAM ist ziemlich ausgelastet. Wie würdet ihr das Programmieren?? Danke, Markus
Hallo! Ich würd das Array im Flash ablegen und dann drauf zugreifen. gruß, Bjoern
[mäßig ot] effektiv != effizient effektivität guckt aufs ende effizienz auf den weg [/]
Also, wenn ich das Array ins Flash stecke, würde es mich 240 int-Werte, also 480 Byte kosten. Kann man auch sagen, wieviele Taktzyklen eine Berechnung kosten würde?
Markus schrieb: > Also, wenn ich das Array ins Flash stecke, würde es mich 240 int-Werte, > also 480 Byte kosten. > > Kann man auch sagen, wieviele Taktzyklen eine Berechnung kosten würde? Über den Daumen gepeilt dauert die Berechnung sicher 2 Zehnerpotenzen länger als ein Tabellenzugriff. Außerdem mußt Du, falls noch nicht geschehen, die Floating-Point-Library mit einbinden, das kostet auch Speicher. Letztendlich mußt Du halt beide Varianten mal programmieren und austesten, was besser paßt.
Was ist daran mäßig unpassend, wenn man als Anfänger zwei Wege sieht und nicht weiß, welchen man am Besten wählt. Es könnte ja sein, dass ich einen Grund nicht berücksichtige, der einen dieser Wege als "schlecht" herausfiltert. Und wenn ich hier die Profis nicht fragen kann, wenn und wo soll ich dann fragen?
Markus schrieb: > Hallo, > > ich habe einen Atmega und mein Ausgabewert in Abhängigkeit von der > Eingabe kann ich mit folgender Formel darstellen: > > y = 1000-7,85(x-3)+4,53(x-3)2-0.55(x-3)^3-0.02(x-3)^4 > > oder bereits fertig berechnet als Array für meine 120 > Eingabemöglichkeiten. > > Was ist hier effektiver? Mein RAM ist ziemlich ausgelastet. Wie würdet > ihr das Programmieren?? Hallo Markus, wie immer: es kommt darauf an. Brauchst Du denn Wert jede Millisekunde oder jede Sekunde? Kriegst Du die Tabelle noch ins Flash gequetscht oder ist das Flash (wie das RAM) schon voll? Hast Du noch massig Rechenzeit übrig oder ist der Prozessor schon am Anschlag? Ich würde es erst mit der Tabelle versuchen (die ist recht schnell erzeugt leichter zu debuggen als ein Rechenfehler, vor allem einer in Festkomma) und erst dann, wenn der Linker sich über mangelnden Platz beschwert, es mit dem rechnerischen Ansatz probieren. Notfalls kannst Du ja auch das Array auf z.B. 60 Werte reduzieren und geeignet interpolieren.
@Markus: Das [mäßig ot] sollte eine Formatierung sein und bezog sich darum auf den Text danach (also die Erklärung), nicht auf deine Frage.
y = 1000-7,85(x-3)+4,53(x-3)^2-0.55(x-3)^3-0.02(x-3)^4 vllt. kannst Du die Formel noch etwas vereinfachen, aber was auch noch interessant ist, welche (120) Werte kann x haben und welche Auflösung von y ist gewünscht. Wie bereits erwähnt wurde, versuch mal rauszufinden, wie viel Speicher die Float-Lib braucht.
Markus schrieb: > Was ist daran mäßig unpassend, wenn man als Anfänger zwei Wege sieht und > nicht weiß, welchen man am Besten wählt. nichts. Unpassend und besserwisserisch war der Kommentar von "jihm".
Was du auch versuchen kannst ist ein ungenutzter Pin vor der Berechnung ein und danach wieder auszuschalten. Das Ganze in eine Endlosschleife mit einem Delay verpackt und ein Oszi an den Pin, kannst du schnell mal ausprobieren wie lange die Berechnung tatsächlich braucht, ganz ohne theoretische Betrachtungen.
Wenn es nur 120 EIngangswerte gibt, und die floating-point libs sonst im Programm nicht benötigt werden, ist die Version mit der Tabelle viel schneller und verbraucht viel weniger Flash und Ram. Dagegen spricht, daß das Programm unübersichtlicher und schlechter wartbar wird. Ob das "viel weniger" allerdings entscheidend ist, musst du selber wissen. Es gibt von Atmel weder Geld für ungenutztes Flash noch für nicht verbrauchte Rechenzeit zurück. Oliver
Markus schrieb: > Kann man auch sagen, wieviele Taktzyklen eine Berechnung kosten würde? Wenn man das berechnen will, dann schaut man sich die generierten Assembler-Anweisungen an: Aus den benötigten Ausführungszyklen der Befehle und der Taktfrequenz ergibt sich die benötigte Rechenzeit. Oder man misst es mit einem Oszilloskop, so wie oben beschrieben. > Es gibt von Atmel weder Geld für ungenutztes Flash noch für > nicht verbrauchte Rechenzeit zurück. :-)
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.