Low memory available, stability problems may occur bij een menustructuur

Beste,

Voor een menustructuur doe ik volgende code (werkt prima) :

// Define a structure for our menu text output view
struct Str {
  const char *textLineBold;   // De tekst die in het vet moet staan (Hoofdtitel of subtitel)
  const char *textLineNormal; // De tekst die normaal moet staan (Naast de subtitel)
  const boolean isMenuName;   // Is het een hoofdtitel of een subtitel, true = hoofdtitel of menunaam
  const byte nrMenu;          // volgnummer, gelijke nummers horen bij elkaar
//  boolean isChecked;          // is deze titel ofgecheck, ja = true
};

// Define a structure for our menu list
struct Str MenuList[] = {
  { "BEFORE FLIGHT CHECK" , "", true , 0 } ,
  { "AERODOME REGISTER", "FILLED IN", false , 0  },
  { "MASTER SWITCH" , "ON",false,0  },
  { "FUEL LEVEL" , "CHECK",false,0  },
  { "MASTER SWITCH","OFF",false,0  },
  //0+5=5
  { "EXTERNAL","",true,1 },
  { "EXTERNAL","COMPLETED",false,1  },
  //5+2=7
  { "BEFORE ENGINE START","",true,2 },
  { "SAFETY BELTS","FASTEN",false,2 },
  { "CANOPY","CLOSE LOCK",false,2  },
  { "SWITCHES","OFF",false,2  },
  { "CIRCUIT BRAKERS","ON",false,2  },
  { "BRAKES","HOLD(OR PARKING BRAKE)",false,2  } 

   // en nog vele andere menuregels, ik bespaar het forum de ballast

}

Dit staat voor mijn void setup().

Het lukt me prima om de menustructuur te doorlopen en op het scherm te zetten,
echter, het vreet enorm aan mijn "geheugen lokale variabelen" en ik krijg compiler melding :
"Low memory available, stability problems may occur" , en dat terwijl het menu nog niet volledig af is.

Kan ik deze menu items op een andere manier declareren zodat deze van m'n programma geheugen afnemen ipv het ram geheugen ? De inhoud van de structuur dient niet gewijzigd te worden, dit is alle info die nodig is om het menu op te bouwen, meer niet.

Alvast dank voor enige tips

Groeten,

Je hebt nu een maal een limiet van 2KRAM geheugen en al die strings worden in het RAM gezet. Ik weet niet of het werkt. maar mogelijk kun je al die constanten in Flash zetten (als je daar nog voldoende ruimte over hebt. Maar dat ligt een beetje aan het menu programma. Ik ken het niet dus geen idee of die library dat ondersteunt.

Je kan het testen door een van de strings bijv:

 { "BEFORE FLIGHT CHECK" , "", true , 0 } ,

te vervangen voor"

{ F("BEFORE FLIGHT CHECK") , "", true , 0 },

Werkt dit niet dan moet je die library gaan aanpassen of een andere zoeken.

Verder moet je wel de hele code hier zetten om te zien of er nog meer opties zijn om RAM geheugen uit te sparen.

kan hij #define gebruiken (tenminste voor de teksten want die zijn niet variabel?
want dan doet de compiler het verzetten.

Nope,
De precompiler gaat ze gelijk op de plekken substitueren. En daarna gaat de compiler pas echt zijn werk doen. Ik heb ook geen idee of dit een eigen brouwsel is. Het kan altijd aangepast worden. Immers. Je menu wordt ergens op getoond. En je hoeft maar een beperkt deel van het menu werkelijk te tonen. En als het op een LCD komt kun je zelfs volstaand door een enkele regel echt in RAM te gebruiken. Immers is de regel op het scherm heb je hem niet meer nodig in RAM. Maakt het wel een stuk complexer, maar de rest kan dan gewoon in Flash.

Om alles een beetje bij te houden. dit lijkt uiteindelijk goed te werken.

#include "Arduino.h"

//
// feature from : http://arduino.stackexchange.com/questions/13545/using-progmem-to-store-array-of-structs
//
template<typename T> void PROGMEM_readAnything(const T * sce, T& dest) {
	memcpy_P(&dest, sce, sizeof(T));
}

//template<typename T> T PROGMEM_getAnything(const T * sce) {
//	static T temp;
//	memcpy_P(&temp, sce, sizeof(T));
//	return temp;
//}

// number of items in an array
template< typename T, size_t N > size_t ArraySize (T (&) [N]){ return N; }


// Define a structure for our menu text output view
struct Str {
  char   textLineBold[25];   	// De tekst die in het vet moet staan (Hoofdtitel of subtitel)
  char  textLineNormal[25]; 	// De tekst die normaal moet staan (Naast de subtitel)
  boolean isMenuName;   		// Is het een hoofdtitel of een subtitel, true = hoofdtitel of menunaam
  char nrMenu;          		// volgnummer, gelijke nummers horen bij elkaar
//  boolean isChecked;          // is deze titel ofgecheck, ja = true
};


// Define a structure for our menu list
const Str MenuList[] PROGMEM = {
  { "BEFORE FLIGHT CHECK"	, ""			, true 	, 0} ,
  { "AERODOME REGISTER"		, "FILLED IN"	, false , 0},
  { "MASTER SWITCH" 		, "ON"			, false	, 0},
  { "FUEL LEVEL" 			, "CHECK"		, false	, 0},
  { "MASTER SWITCH"			, "OFF"			, false	, 0}
};

void setup()
{
	Serial.begin(9600);
	Serial.flush();
	for (uint8_t i = 0; i < ArraySize(MenuList); i++) {
		Str regelUitTabel;
		PROGMEM_readAnything (&MenuList [i], regelUitTabel);
		Serial.print(regelUitTabel.textLineBold);
		Serial.print(",");
		Serial.println(regelUitTabel.textLineNormal);
	}
}

// The loop function is called in an endless loop
void loop()
{
//Add your repeated code here
}

Bleek dat dit programma in de compilatie op 1.6.5 stuk liep terwijl ik in de EclipseArduino geen enkel probleem had. Hij liep stuk op de templates. Ik heb het nu opgelost door de juiste code er gelijk in te zetten, maar ik zie ff niet wat er verkeerd is. Iemand?
Zo werkt het nu maar ik zou toch wel willen weten waarom die template niet goed gaat.

#include "Arduino.h"
  
// number of items in an array
template< typename T, size_t N > size_t ArraySize (T (&) [N]){ return N; }
  
  
// Define a structure for our menu text output view
struc]t Str {
  char   textLineBold[25];      // De tekst die in het vet moet staan (Hoofdtitel of subtitel)
  char  textLineNormal[25];     // De tekst die normaal moet staan (Naast de subtitel)
  boolean isMenuName;           // Is het een hoofdtitel of een subtitel, true = hoofdtitel of menunaam
  char nrMenu;                  // volgnummer, gelijke nummers horen bij elkaar
//  boolean isChecked;          // is deze titel ofgecheck, ja = true
};
  
  
// Define a structure for our menu list
const Str MenuList[] PROGMEM = {
  { "BEFORE FLIGHT CHECK"   , ""            , true  , 0} ,
  { "AERODOME REGISTER"     , "FILLED IN"   , false , 0},
  { "MASTER SWITCH"         , "ON"          , false , 0},
  { "FUEL LEVEL"            , "CHECK"       , false , 0},
  { "MASTER SWITCH"         , "OFF"         , false , 0}
};
  
void setup()
{
    Serial.begin(9600);
    Serial.flush();
    for (uint8_t i = 0; i < ArraySize(MenuList); i++) {
        Str regelUitTabel;                  
        //
        // kopieer de juiste item regel uit de menu lijst naar een 
        // lokale buffer voor de lengte van die buffer
        //
        memcpy_P(&regelUitTabel, &MenuList[i], sizeof(regelUitTabel));
        //
        // toon test gegevens
        //
        Serial.print(regelUitTabel.textLineBold);
        Serial.print(",");
        Serial.println(regelUitTabel.textLineNormal);
    }
}
  
// The loop function is called in an endless loop
void loop()
{
}