Ich arbeite an einem kleinen HTTP-Server. Ich baue einen Router und da es einige Routen geben könnte, wollte ich sie in den Flash-Speicher legen, damit ich nicht den wertvollen SRAM verwenden muss. Aber entweder verstehe ich etwas nicht richtig oder etwas Seltsames passiert, da ich nicht in der Lage bin, meine gespeicherten Daten aus dem Flash zu lesen.Arduino Progmem liest verzerrte Daten
Ich habe eine Struktur, die einen Funktionszeiger und einen Char-Zeiger enthält. Ich möchte ein Array dieser Strukturen in Flash speichern und sie zurücklesen. Bei einem kleinen Debug-Druck kann ich jedoch sehen, dass ich den Char-Zeiger nicht korrekt zurücklesen kann. Es druckt Trash auf den seriellen Port.
Hier ist ein kleines Beispiel.
#include <avr/pgmspace.h>
typedef struct {
void (*func)();
const char *URI;
} Route;
void test1() {
Serial.println("Executed testfunc1");
}
void test2() {
Serial.println("Executed testfunc2");
}
const char route1URI[] PROGMEM = "/route1";
const Route route1 PROGMEM = {
test1,
route1URI
};
const char route2URI[] PROGMEM = "/route2";
const Route route2 PROGMEM = {
test2,
route2URI
};
const Route routingTable[] PROGMEM = {
route1,
route2
};
void (*getRoute(char *URI))() {
Route *r = (Route *)pgm_read_word(routingTable + 0);
char *f = (char *)pgm_read_word(r->URI);
Serial.println(f);
return r->func;
}
void setup() {
Serial.begin(9600);
while (!Serial) { }
Serial.println("started setup");
void (*fn)() = getRoute("sometest");
// will cause errors if called
//fn();
Serial.println("ended setup");
}
void loop() {
// put your main code here, to run repeatedly:
}
derzeit unterstützt meine URI bis zu 254 Zeichen, also wäre dies wirklich ein Schritt zurück. Außerdem würde dies Speicher für jede URL, die weniger als 15 Zeichen lang ist, verschwenden. –
Sie haben es in der Frage nicht erwähnt, dass Ihr URI so lange sein wird. Sie sind richtig, dass dieser Ansatz Speicher verschwendet, aber wenn die Reihenfolge mehrere Bytes ist, denke ich, dass es akzeptabel ist. In deinem Fall ist @KIIV Antwort die bessere Lösung. – putu