Forum: Compiler & IDEs Rechnen oder Tabelle, was ist effektiver


von Markus (Gast)


Lesenswert?

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

von Tishima (Gast)


Lesenswert?

Hallo!

Ich würd das Array im Flash ablegen und dann drauf zugreifen.

gruß,
Bjoern

von jihm (Gast)


Lesenswert?

[mäßig ot]
effektiv != effizient
effektivität guckt aufs ende
effizienz auf den weg
[/]

von Markus (Gast)


Lesenswert?

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?

von Johann (Gast)


Lesenswert?

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.

von Johann (Gast)


Lesenswert?

jihm schrieb:
> [mäßig ot]

nein, komplett

von Markus (Gast)


Lesenswert?

Was soll das bedeuten:
[mäßig ot]

von Johann (Gast)


Lesenswert?

Markus schrieb:
> Was soll das bedeuten:
> [mäßig ot]

mäßig / ein wenig
ot = off topic / unpassend

von Markus (Gast)


Lesenswert?

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?

von l0wside (Gast)


Lesenswert?

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.

von 4???? (Gast)


Lesenswert?

@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.

von mar IO (Gast)


Lesenswert?

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.

von Johann (Gast)


Lesenswert?

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".

von U.R. Schmitt (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von Mark B. (markbrandis)


Lesenswert?

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
Noch kein Account? Hier anmelden.