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.
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.
Phil Frost
Adam Haile
Chris Stratton
Adam Haile
Chris Stratton