PROGMEM-Daten vs. berechnete Daten

In einem Arduino-Projekt, an dem ich arbeite (im Moment ATMega328), habe ich eine Reihe von Vektorentfernungsdaten, die ich für verschiedene Pixel in einer Matrix verwenden muss.

Es ist eine relativ einfache Rechnung:

d = math.sqrt(math.pow(x2 - x1, 4) + math.pow(y2 - y1, 2)) //Not the arduino code

Sehr leicht modifizierte Koordinatenabstandsformel (mit übertriebenen x-Werten)

Ich weiß, dass ein moderner Computer das problemlos tun kann, aber wird dies langsamer oder schneller sein, als wenn die Werte für eine 22x12-Matrix als PROGMEM 2-D-Array von uchar gespeichert werden? (x1 und y1 sind am Mittelpunkt fixiert ... also nur ein Raster).

Diese Werte sind grundsätzlich fest, ich muss sie nur kennen. Ich weiß, dass der Zugriff auf Werte im Flash viel langsamer ist als im SRAM, bin mir aber nicht sicher, wie viele Taktzyklen dies im Vergleich zur obigen Gleichung dauern wird. Ein AVR ist nicht gerade für solche Mathematik optimiert.

Update: Es ist auch nicht so, dass ich bei jedem Durchgang nur einige der Vektorentfernungswerte nachschlagen muss . Bei jeder Schleife brauche ich ALLE diese Werte.

Weniger als nicht optimiert ... Gleitkommaoperationen fehlen im AVR vollständig. Sie können Gleitkommaberechnungen sicher durchführen, indem Sie eine Gleitkommabibliothek einbinden, die nur auf die größeren ATMegas passt und in keiner Weise schnell ist. Haben Sie schon einmal über Fixpunktmathematik nachgedacht?
Nun, ich denke, es würde nur die pow- und square-Funktionen von Math.h verwenden ... nicht sicher, wie schnell diese sind. Vielleicht nicht wirklich Fließkomma im eigentlichen Sinne ...
Ich denke, Sie werden feststellen, dass der Overhead zum Lesen von Daten aus dem Flash im Vergleich zum Ausführen der Berechnung ziemlich gering ist. Je nachdem, was Sie sonst noch speichern müssen, können Sie die Tabelle möglicherweise sogar beim Start in den Arbeitsspeicher kopieren. Aber wenn ich die Berechnung im laufenden Betrieb durchführen würde, würde ich wahrscheinlich eine Festkommaimplementierung durchführen.
Ich bin nicht wirklich an die Einschränkungen von AVR gewöhnt ... was ist überhaupt erforderlich, um Festkomma zu tun? Ich nehme an, dass Double und Float beide noch Gleitkommawerte sind? Oder ist das beim AVR nicht so?
Auf einer Maschine ohne FPU existieren Konzepte wie Double und Float nur im Compiler und können am Ende viel zu implementierenden Code generieren. Eine einfache Festkommaimplementierung wäre, Ihre Eingaben mit einem Skalierungsfaktor (z. B. 256) zu multiplizieren, im Wesentlichen alles zu einem Bruch zu machen, dann ganzzahlige Berechnungen mit dem Zähler durchzuführen und beim Schreiben Ihres Programms zu verfolgen, was die verschiedenen Operationen bewirkt haben der konstante Nenner.

Antworten (1)

Hier ist mein Beispiel für die Verwendung des FLASH-Speicherplatzes zum Nachschlagen von 2D-Tabellen. definiere CONST ARRAY & READ daraus

Der Schlüssel besteht darin, spezielle Makros zu verwenden, um die Zeiger aus Flash ( PROGMEM und pgm_read_word_near ) zu erzwingen und zu lesen, da der Compiler standardmäßig RAM-Speicherplatz verwendet.

Ich kann mir nur vorstellen, dass es viel schneller ist als es zu berechnen.