Go Down

Topic: Optimizar RAM (agotada) mediante el uso de EEPROM y/o FLASH de Arduino (Read 263 times) previous topic - next topic

alfredo_villalba_2560

Hola estimados amigos,




Me pueden orientar para poder manejar un arreglo de dimensión: 10,000 elementos. Ya que tengo problemas de Memoria dinámica en Arduino MEGA2560, llega al tope y no es posible compilar mi programa. Esto me ocurre declarando el arreglo y su tamaño al inicio de mi programa , es decir como una variable global. 


Lo que se me ocurre es echar mano de la memoria FLASH o EEEPROM, pero no se como hacerlo o si me dan algunas otras opciones, de favor.


Saludos Cordialaes.

surbyte

La solucion es usar PROGMEM.

Revisa este ejemplo:

Code: [Select]
// save some unsigned ints
const PROGMEM uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234};

// save some chars
const char signMessage[] PROGMEM = {"I AM PREDATOR,  UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};

unsigned int displayInt;
char myChar;


void setup() {
  Serial.begin(9600);
  while (!Serial);  // wait for serial port to connect. Needed for native USB

  // put your setup code here, to run once:
  // read back a 2-byte int
  for (byte k = 0; k < 5; k++) {
    displayInt = pgm_read_word_near(charSet + k);
    Serial.println(displayInt);
  }
  Serial.println();

  // read back a char
  for (byte k = 0; k < strlen_P(signMessage); k++) {
    myChar = pgm_read_byte_near(signMessage + k);
    Serial.print(myChar);
  }

  Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:
}


Y lleva el vector charSet al limite que permita la flash.

alfredo_villalba_2560

Ya lo intenté, pero no veo como definir un arreglo de 10,000 valores enteros. Ya que lo que veo es únicamente variables definidas o bien arreglo definido, pero no puedo definir esa cantidad de elementos. Ya que los valores los tomo de un sensor, claro en un principio necesito el vector de ese tamaño para ser llenado.

Ayuda por favor.

surbyte

Si los valores los tomas de un sensor entonces guárdalos en una SD o en una memoria extera que tenga la capacidad adecuada.
En EEPROM no puedes y en la flash tampoco porque ese método solo se realiza al momento de la compilación.

PeterKantTropus

 En arduino mega tienes 4K de EEPROM y 8k de SRAM (donde se almacenan el espacio de variables )
pero un arreglo de 10000 int son 156 K es imposible que puedas trabajar con un arreglo tan grande en un arduino. Tienes que almacenarlos externamente, como te indico Surbyte , una  memoria AT24C256 seria suficiente.
Saludos
//-----------------------******------------------------
if (Codigo_con_delay==True) {
Proyecto=Fracaso;
 } 
//-----------------------******-----------------------

alfredo_villalba_2560

Muchas gracias,

Pero creo no me di a entender, ya estoy usando una memoria SD para almacenar los datos.

El proceso es el siguiente:
1. defino una variable global int Arreglo[1000];
2. con una rutina de interrupciones,  recorro el Arreglo, hasta llenarlo con los valores del sensor.
3. una vez llenado el arreglo lo vuelvo a leer para escribir esos valores en la memoria SD.

Nota (realizo el paso 1 y 3 por separado para no leer el sensor y escribir al mismo tiempo en la memoria sd, esto con la finalidad de hacer veloz mi sistema. )

Ahora bien hasta aquí todo de maravilla, mi problema llega cuando mi variable Arreglo le cambio su tamaño a 10,000. Creo yo que debería de haber una solución usando Arduino. Agradecería  mucho sus nuevos comentarios.


Saludos Cordiales.

gatul

No tenés espacio donde guardar tantos datos.
Estas intentando llevar 10 personas sentadas en una motocicleta, le des la vuelta que le des no hay lugar.
Llevá menos gente o cambiá de vehículo.

Saludos

PeterKantTropus

Creo yo que debería de haber una solución usando Arduino.  

Pero la solución, no pasa por cargar los valores en una variable. No puedes cargar 15.6 K de datos en 8 K de Ram.  La SD no es la mejor solución a tu problema. En una eeprom, como la AT24C256, los datos se guardan en forma ordenada con un indice, puedes recorrer los datos de la misma manera que si tratara de un arreglo de una variable (pero en bytes). La contra, es mas lenta que tratar los datos en RAM. Si el tratamiento de datos no es muy exigente, creo que es la mejor solución.
//-----------------------******------------------------
if (Codigo_con_delay==True) {
Proyecto=Fracaso;
 } 
//-----------------------******-----------------------

gatul

Tenés otra opción a usar una eeprom, podés usar una SRAM como la 23K256 que es muchísimo más rápida.
Tené en cuenta que trabaja a 3.3V y los datos se transfieren vía SPI.

Te dejo el link de un tema que habla de este asunto.

Finalmente, si necesitaras más velocidad de transferencia hay SRAM que se comunican en paralelo (con el consiguiente aumento de pines necesarios y manejo de tiempos).
Puedes verlas en el site de Microchip.

Saludos

alfredo_villalba_2560

Buen día,

Muchas gracias a todos por sus comentarios.

Estimado @gatul, en efecto como bien lo mencionas el camino ideal seria conectarle mas  RAM a mi Arduino, esto para manejar buena velocidad. Aunque para hacer esto intervienen varias cosas; espacio, conectividad, recursos, etc. Voy a evaluarlo VS reducir la cantidad de datos a procesar. 


Gracias!!

PeterKantTropus

¿Porque no nos cuentas mas como vas a procesar los datos? tal vez no pase por cargar todos los datos , sino procesar en lotes. 
//-----------------------******------------------------
if (Codigo_con_delay==True) {
Proyecto=Fracaso;
 } 
//-----------------------******-----------------------

Go Up