Go Down

Topic: Memoria insuficiente  (Read 165 times) previous topic - next topic

jeec632

Jul 21, 2018, 06:39 am Last Edit: Jul 21, 2018, 06:59 am by jeec632
Buenas noches

Estoy haciendo un programa en donde necesito almacenar en el arduino una matriz de [255][255] o un arreglo de 65025 posiciones,al crearlo me da el error "size of array '...' is too large" se que estoy sobrepasando la capacidad de la memoria, he tenido varias ideas para solucionar el problema pero no se como ejecutarlas:

1) ya que para este proyecto tengo el arduino conectado al pc podría almacenar el arreglo en un bloc de notas y leerlo desde ahí, el problema es que no encuentro como leer un archivo desde el microcontrolador.

2) Almacenar estos datos en la memoria destinada al almacenamiento del programa ya que la memoria para variables globales es mucho mas pequeña.

3) reducir la cantidad de bits de cada elemento del arreglo para así ahorrar memoría, los datos que almaceno en el arreglo son binarios '0' ó '1', si pudiera agruparlos de alguna manera podría reducir la cantidad de elementos.


Si me pueden recomendar ideas para implementar alguna de estas soluciones o nuevas soluciones los agradecería.

blueribbon

Puedes usar algún módulo SD para poder almacenar los datos externamente (suelen ser muy baratos), puesto de que veo muy engorroso enviar los datos desde un computador hacia Arduino, aunque es posible.

surbyte

matrix de 255 x 255 es una locura mi estimado compañero de foro!!!

Según que arduino uses hablas de 65k de datos? No se te ocurrió mirar las especificaciones de memoria de tu arduino y verías que ningúno puede con esta cantidad salvo que lo hagas en FLASH y en algunos pocos Arduinos.

Si fueran bits es un tema, si fueran bytes otro.

Parece que son bits entonces 65k bits digamos que son 65K/8 = 8K bytes en realidad menos pero de nuevo... eso en RAM no es manejable asi que tu procesamiento deberá ser con cuidado.
Usando PROGMEM puedes guardarlo en flash y ahi si podran en cualquier Arduino.

Hace unos dias un amigo usaba una onda seno con 20000 muestras o sea 20kbytes de muestras y las guardamos en flash. El código quedo al 100% de flash ocupada pero funcionaba. Luego bajamos a 2K esos puntos y no se perdió calidad en la señal deseada.

Asi que tus 8K no presentaran problemas.

deberás usar algo asi

Code: [Select]
const byte datos[][] PROGMEM = {}; // definiciones aqui

surbyte

#3
Jul 21, 2018, 08:30 pm Last Edit: Jul 21, 2018, 08:32 pm by surbyte
El foro tiene normas y una de ellas (te las paso por privado) es usar etiquetas cuando posteas un código, aunque sea una línea, de modo que por favor, edita tu post anterior y lee los consejos que te daré por privado.

Mi amigo, si te salen demasiados 1 y 0 pues limita la salida usando dos ciclos que se vayan incrementando y te permita manejar la salida de modo entendible.

Algo como que vaya de 0 a 8, 16 o 32 posiciones, las que quepan en tu monitor serie por linea yluego sigues y sigues con nuevas lineas.

Usas un contador que incrementa la posicion con cada i, j generado donde i y j son los elementos de dos ciclos for. Uno controla las lineas y otro las columnas.

Algo mas


Code: [Select]
const PROGMEM  uint16_t  datos[]  ={

esto dice que has definicido cada posicion como un entero o sea 16 bits. No es lo optimo, lo mejor es que uses byte como te indiqué y definas cada byte de este modo 0b01010111 para un 0x57 hexa por ejemplo ahi se ven todos los bits de un byte y ya son 8 bits en un byte.

Se comprende?

Go Up