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
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.
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.
:-)