Arduino Uno no puede manejar matrices bidimensionales

Ahora el código que estoy escribiendo en Arduino (usando Arduino) usa múltiples matrices bidimensionales. Ahora cuando Imprimo algo usando el Monitor Serial, lo imprime correctamente pero cuando declaro e inicializo la matriz bidimensional no lo imprime.

Código:

 void setup() { Serial.begin(9600); int image_width = 56; int image_height = 96; int image_result[image_width][image_height]; for (int i=0; i<image_height; i++) { for (int j=0; j<image_width; j++) { image_result[j][i] = 5; } } Serial.print("code works"); }  

Ahora, en este caso,» el código funciona «no se imprime, pero cuando elimino la declaración de matriz y el código de inicialización funciona, se imprime. ¿Cuál es el problema?

¿Las matrices bidimensionales funcionan de manera diferente en Arduino o es un problema de espacio?

Comentarios

  • Incluso una matriz unidimensional de 5376 bytes, en un procesador con 2048 bytes, fallará.
  • Quiero decir, 10752 bytes. Pasé por alto que cada elemento de la matriz tiene 2 bytes. Tenga en cuenta que no ‘ ni siquiera tiene todos esos 2048 bytes disponibles. Los búferes de transmisión y recepción en serie solo usan 128 bytes.
  • Bueno, si conecto un automóvil micro-SD, ¿hay algún método para declarar una matriz en esa memoria?
  • Puede conectar un Tarjeta SD y escribe datos en el contenido de tu ‘ s. Sin embargo, puede ‘ t » declarar la matriz en la memoria » en ella. ¿Cuál es tu aplicación aquí? Un Arduino con 2 KB de RAM no es ‘ t lo mejor para el procesamiento de imágenes.
  • Necesito leer un archivo BMP pequeño en una matriz de entradas en Arduino y necesito procesarlo. Y el tamaño del archivo es de 56 por 96 píxeles.

Respuesta

Las matrices 2D funcionan bien en arduino, pero quedarse sin espacio muy rápidamente.

Un uno tiene 2 kilobytes de RAM; su matriz tiene 56 * 96 = 5376 elementos de 2 bytes.

Supongo que está escribiendo sobre algún valor crítico de memoria con un 5 en algún momento, lo que hace que el programa falle.

Comentarios

  • No solo sobre la memoria, sino probablemente también sobre todos los registros de E / S.
  • Direccionamiento de 16 bits, con SRAM a partir de 256. De modo que ‘ s 65279 bytes de espacio de direcciones. Así que no ‘ lograste eso. Además, ‘ estoy bastante seguro de que existe algún tipo de protección que evita que esto suceda.
  • No hay protección. Los registros de la CPU se asignan en memoria comenzando en la dirección 0, luego los registros de E / S desde la dirección 32, luego la RAM asignada estáticamente comienza en la dirección 256.

Respuesta

Está intentando utilizar más memoria de la que tiene disponible: 96 * 56 * 2 = 10.752KBytes. No hay mucho que pueda hacer la MCU cuando esto sucede.

Si observa la hoja de datos , verá que su microcontrolador (ATmega328p) solo tiene 2 KBytes de RAM.

Supongo que la pregunta es preguntarse si realmente necesita una matriz tan grande. Puede considerar la posibilidad de obtener un chip flash externo o un protector de tarjeta SD. Si solo lo necesita para fines de solo lectura (como una búsqueda table), puede usar parte de su memoria flash del programa (tiene 32 KBytes).

Comentarios

  • Yo ‘ estoy usando un escudo de tarjeta SD pero ‘ estoy leyendo los datos en una matriz declarada como esta. ¿Cómo podría usar la memoria de la tarjeta SD?
  • Usted no ‘ normalmente no necesita tratar con los 5376 elementos de su matriz en un instante. Considere dividir la imagen en trozos más pequeños para procesarla. Según el tipo de procesamiento que realice, es posible que necesite diferentes conocimientos para optimizar el proceso . 😉
  • Se pueden escribir datos en la memoria flash una y otra vez. ¿A qué te refieres con solo lectura? ¿Cómo se escriben los datos una vez en él? Por ejemplo, quiero escribir los datos de la imagen en la memoria flash. ¿Cómo podré hacerlo?
  • Me refiero a la memoria flash de su programa. AFAIK, solo puede escribir en el programa flash durante la programación. Una vez que arranca su MCU, la memoria flash del programa se usa como memoria de solo lectura (de modo que no ‘ t estropeemos el programa cuando ‘ s en ejecución.) Ya que desea escribir sus datos, el programa flash no es adecuado.
  • ¿Realmente necesita procesar toda la imagen de una vez? Como ‘ he mencionado antes, puedes dividir tu imagen en bloques más pequeños, digamos que chunk [8] [8] sería un tamaño cómodo para que Arduino tragar, y funciona bien incluso si usa filtros de convolución. (Habiendo dicho eso, debo enfatizar que el Arduino Uno es inadecuado para cualquier aplicación seria de procesamiento de imágenes.)

Respuesta

De hecho, este es un problema de RAM disponible.Si no necesita 8 bits por pieza de datos (si tal vez está dispuesto a reducir la calidad de la imagen, por ejemplo), considere compactar sus datos de manera que tenga varios datos por bit. Por ejemplo, los valores hexadecimales o BCD (decimales codificados en binario) podrían funcionar, dependiendo del tamaño de cada dato.

Comentarios

  • El OP quiere leer un archivo BMP en la memoria, así que dudo que se pueda convertir en BCD de manera muy útil.
  • Ese ‘ es un buen punto. ¿Quizás ‘ está dispuesto a disminuir significativamente la calidad de su imagen? De cualquier forma, sería prudente disponer de almacenamiento adicional.

Respuesta

Como han señalado otros, su matriz es más grande que la RAM disponible en su Arduino. Otros mencionaron la memoria Flash que podría ser una solución para usted. Su Arduino tiene 32 KB de memoria que podría contener su matriz. Consulte la siguiente referencia para obtener más información sobre la memoria Flash. Tenga en cuenta que Flash y EEPROM tienen un número limitado de ciclos de escritura antes de volverse poco fiables.

Potencias ocultas: almacenamiento de datos en Flash y EEPROM

Respuesta

En caso de que la matriz esté casi vacía o de todos modos tenga valores que se puedan calcular mediante programación, matrices dispersas podrían acudir al rescate. Requiere asignación de memoria y saltos, por lo que el tiempo de acceso a elementos individuales no es determinista, pero puede calcular el peor de los casos.

Respuesta

Esto es lo que le di a mi Uno:

 #define IMAGEWIDTH 56 #define IMAGEHEIGHT 96 void setup() { Serial.begin(9600); int i, j; int image_result[IMAGEWIDTH][IMAGEHEIGHT]; for (i = 0; i < IMAGEWIDTH; i++) { Serial.print("\nIMAGEWIDTH "); Serial.print(i + 1); Serial.println(":"); for (j = 0; j < IMAGEHEIGHT; j++) { image_result[i][j] = i + j; Serial.print("image_result["); Serial.print(i + 1); Serial.print("]["); Serial.print(j + 1); Serial.print("]: "); Serial.println(image_result[i][j]); } } Serial.println(F("\nDone!")); } void loop() { }  

Este se ejecutará en toda la matriz, mientras imprime el progreso en Serial, que luego imprime «¡Listo!» una vez que lo es. Sugiero cambiar:

 #define IMAGEWIDTH 56 #define IMAGEHEIGHT 96  

a valores menores, a menos que tenga algunos buenos minutos a la mano.

Comentarios

  • Esto no va a resolver su problema en absoluto. No es ‘ t tiempo, es el tamaño de la matriz. 56 * 96 * 2 (un int son dos bytes) usa 10752 bytes. Tu Uno tiene 2048 bytes. El problema no es el tiempo, es el almacenamiento.
  • Nick tenía razón, esto no ha ‘ t resuelto mi problema. De todos modos, gracias por intentarlo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *