Je travaille sur un petit serveur HTTP. Je construis un routeur et comme il pouvait y avoir pas mal de routes, je voulais les mettre dans la mémoire flash pour ne pas avoir à utiliser la précieuse SRAM. Cependant soit je ne comprends pas quelque chose correctement ou quelque chose d'étrange se passe puisque je n'arrive pas à lire mes données stockées depuis le flash.Le progmem Arduino lit les données brouillées
J'ai une structure qui contient un pointeur de fonction et un pointeur char. Je veux stocker un tableau de ces structures dans Flash et les relire. Cependant, avec une petite impression de débogage, je peux voir que je ne peux pas lire correctement le pointeur de char. Il imprime des déchets sur le port série.
Voici un petit exemple.
#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:
}
Actuellement, mon URI prend en charge jusqu'à 254 caractères, donc ce serait vraiment un retour en arrière. De plus, cela gaspillerait de la mémoire sur n'importe quelle URL de moins de 15 caractères. –
Vous ne l'avez pas mentionné dans la question que votre URI sera aussi longue. Vous avez raison, cette approche gaspillera de la mémoire, mais si l'ordre est de plusieurs octets, je pense que c'est acceptable. Dans votre cas, la réponse @KIIV est meilleure. – putu