Limite de memoria de programa

Buenas

Estoy trabajando en un proyecto. Se trata de un cronometro láser para carreras contrarreloj con pantalla tft táctil.

Al principio todo funciona bien pero a medida que voy programando mas opciones y mejorando la interfaz gráfica deja de mostrarme las imagenes bmp que con programas con menos funciones auxiliares si muestra.

He usado 31.394 bytes (de un máximo de 32.256 bytes)

Si borro unas funciones auxiliares y reduzco el peso del programa si muestra las imágenes.

Es posible que sea debido a que estoy llegando al limite de la memoria del dispositivo (arduino UNO)

Y porque no pasas a un MEGA? Simple. A ver no te molestes por el comentario pero veo que para hacer lo que haces es porque eres muy capaz. Que sentido tiene darse contra la pared si tienes limitada la capacidad? Si mañana se te ocurren mas funciones que haras? Achicar los bmp? Yo en tu situación haria eso. No me complico o bien uso algun elemento externo que me agregue espacio, como una SD o una memoria serie I2C que albergue los bmp. Son alternativas.

hola primero que nada gracias por tu respuesta segundo ir probando placas hasta ver lo que funciona no es mi estilo, suelo enfrentarme a los problemas desde el analisis y la reflexión

tercero las imagenes ya las guardo en la SD y añadir una memoria i2c no agregara espacio de programa al sistema

saludos

Estoy trabajando en un proyecto. Se trata de un cronometro láser para carreras contrarreloj con pantalla tft táctil.

Al principio todo funciona bien pero a medida que voy programando mas opciones y mejorando la interfaz gráfica deja de mostrarme las imagenes bmp que con programas con menos funciones auxiliares si muestra. He usado 31.394 bytes (de un máximo de 32.256 bytes) Si borro unas funciones auxiliares y reduzco el peso del programa si muestra las imágenes. Es posible que sea debido a que estoy llegando al limite de la memoria del dispositivo (arduino UNO)

Para comenzar y vale aclararlo, yo no respondo mas que para ayudar, que quede claro eso porque sino pensaras que mi intención es otra. Volviendo a tu respuesta, : Donde dices en tu post inicial que usas SD?. Go_zalo : No se trata de ir probando placas, si pasas directamente a MEGA tienes espacio de sobra y si no quieres hacerlo alla tú porque lo haras a expensas de tiempo pero yo no impongo nada.

De acuerdo a la documentación de Arduino, un ATmega328 tiene 32k de flash para el bootloader + tu programa y solo 2Kb de SRAM para los datos en tiempo real. Un ATmega2560 tiene un poco mas, totaliza 256KB y 8KB respectivamente. Asi que ninguna prueba. El MEGA es una solución 100% segura.

Pero como dije, si aun no terminas el código y estas limitado y para mañana resulta que se te ocurre algo mas para sumarle al proyecto y dime de que te vas a disfrazar? La única manera que tienes desde el Análisis es reescribir las librerias en uso y anular funciones no utilizadas, e incuso considerar trabajar en ambiente ATMEL STUDIO 6.2 y optimizar el código por tamaño. Yo iría mas lejos y vería la posibilidad de quitar código innecesario o usar asembler.

Para ello primero haria un análisis de cada librería en uso, su peso en la solución final y ver claro está si es posible reducirla. Si por costos la idea de pasar a MEGA no es factible, haría cada uno de los pasos que te describí que estoy seguro muchos de ellos también los has considerado (sino todos).

Me acabo de acordar de algunos tips que tal vez estes usando o no. Con probar y comentartelos no pierdo nada en haras de ayudar . 1) Para mi te ayudarías mucho posteando elcódigo. 2) imagino el uso de un menú para algun teclado con el cual elijas opciones y hagas configuraciones. Pregunto: los strings estan definidos como const? 3) Supongo has analizado las variables y sus rangos. Muchas veces se define variables como enteras cuyos valores no superan 255 ya que se usan en ciclos o como indices acotados de vectores. Definirlas como byte recupera memoria. 4) Aprovecha la EEPROM para guardar mensajes, es limitada pero esta para usarse. 5) Siempre usa Serial.print(F("HELLO")); vs Serial.print("HELLO"); ahorra RAM y es valido para lcd.print también. 6) Pone al final del setup() esto Serial.println(freeMemory(), DEC); // imprime cuanta RAM esta disponible o usala en pasos intermedios de loop

Es interesante lo del:

Siempre usa Serial.print(F("HELLO"));

¿Qué diferencia tiene con usarlo sin la "F"? ¿Qué hace exactamente esa "F"?

Usar F(“string”) te permite pasar string almacenados en memoria directamente a Serial.print o lcd.print

You can pass flash-memory based strings to Serial.print() by wrapping them with F(). For example :

Serial.print(F(“Hello World”))

Gracias esto si que es una muy buena respuesta

No posteo el código por que no se trata de un error de compilación o que no funcione de la manera esperada y veo engorroso que os tengáis que mira tantísimas lineas de código La interfaz gráfica no la controlo con teclado sino que utilizo la pantalla táctil a través de entradas analógicas Las variables están optimizadas al rango necesario e incluso reutilizandolas en diferentes funciones en la medida de lo posible Guardar los mensajes en la EEPROM lo he descartado por capacidad, he pensado en hacer una especie de base de dados con frases e indices y guardarla en un archivo de la SD esto no lo he probado se tendría que evaluar si realmente se reduce el espacio en flash y ahorra sram Utilizar F("") hace mas grave el problema de falta de flash en mi caso Serial.println(freeMemory(), DEC); me gusta lo tengo que investigar

gracias!

Son 720 lineas de cogido :roll_eyes:

Utilizar F("") hace mas grave el problema de falta de flash en mi caso

ademas me doy cuenta que no funciona con mi función de escribir en el tft

Bien. GO_zalo, creo que el problema es de memoria SRAM primero, y luego claro la falta de espacio en la FLASH. Pero el comportamiento anómalo es x falta de SRAM.

Que opinas de reveer las librerias utilizadas para quitar lo que no se use? Aunque el código funcione mal o no este listo sería interesante darte una mano en achicarlo o pensar en como hacerlo. Qué pena que no tengo UNO, pero si tengo el TFT y un MEGA. Podria trabajar en paralelo contigo, considerando el limite de 32k del UNO. Es mi oferta para colaborar, si quieres claro. Si no seguiré aportando desde acá.

Además reconozco que soy un enamorado de aprender las técnicas de programación de otros. Considéralo.

gracias todas mis colaboraciones (has ahora en otros foros de electrónica) son en la vía publica por que considero que mi problema puede ser el de otros y mis respuestas ayudar a varias personas

saludos

Bien. Sencillamente adjunta tu código actual y a buen seguro podemos encontrar algún modo de adelgazar el uso de memoria.

Truco 1 para ahorrar ram: no declares variables globales si no es necesario.

Aca a lo que me refería cuando te sugerí usar Atmel Studio 6.X con tu proyecto
Adjunto imagen con la modificación en el compilador para que OPTIMIZE por TAMAÑO

gracias la verdad es que tengo todas las variables del main como globales lo cambiare a ver si mejora

probare atmel studio y te digo algo

Como ves.. intentamos ayudar, pero si no dejas que te ayudemos llevará mas tiempo de tu parte.

ATMEL STUDIO 6 WITH ARDUINO BOARDS

Como anduvo GO_zalo

al final los problemas no eran por falta de memoria flash, eran por falta de ram, lo he solucionado reutilizando mas aun las variable que no se solapan (hasta el punto de hacer el código totalmente ilegible, lo cual me ha echo volver atras y utilizar DEFINE diferentes para una misma variable. También he recortado el tamaño de los strings que ve el usuario.

En definitiva he comprobado que se puede usar la flash hasta el limite que tiene sin problemas, ahora ya he superado el limite y sigo programando y probando el código por partes, manteniendo entre comentarios las partes ya probadas que son auxiliares en mi programa por ejemplo la parte de mostrar los resultados de la SD con la que los almacena

He pedido ya varias placas arduino DUE para el montaje final y modificado un arduino uno para que funcione a 3.3V y asi asegurarme que el hw funcionara bien.

por otro lado como otra posible solución estoy buscando si alguien sabe si es posible guardar varios codigos en la memoria SD y cargar un bootloader que me permita seleccionar uno u otro y se grave a la flash y al acabar dicho modulo vuelva al bootloader para cargar otro si es necesario

saludos y gracias

bueno, entonces mi sugerencia de la lectura RAM te sirvió para descubrir el problema Estas usando ATMEL STUDIO? Te pregunto porque entre la info que da al compilar figura siempre la RAM utilizada, algo que inmediatamente hubieras detectado. Además la otra gran ventaja de ATMEL STUDIO es su velocidad de compilación. Lento para cargar pero luego una luz.

Respecto del bootloader no respondo porque no se. Tambien estoy buscando la forma de actualizar un firmware a un dispositivo remoto. Es un enfoque diferente pero para el caso tiene algunas semejanzas.

si lo de ver la ram restante me ha venido bien gracias
no he podido usar atmel studio por que lo he instalado y ahora no me deja abrirlo, tendré que descargarlo otra vez (la verdad es que mi vecino tiene que ponerse un wifi mas rápido por que así no hay quien trabaje :smiley: )

Ahhh si. Yo también lidié con ese problema. da un error. Investiga en Internet y encontrarás la respuesta.
Me da gusto que sigas adelante.
Vaya has llenado todo el espacio disponible. Eso supera lo que yo he hecho jajajaja