Lectura de matrices 2D en un microcontrolador [cerrado]

Tengo un escenario en el que tengo matrices 2D de tamaños variables y varios tipos de datos (dobles y booleanos a partir de ahora). Estas matrices deben ser leídas y procesadas por un microcontrolador que tenga 256 KB de SRAM.

En mi configuración, planeo transferir estas matrices desde la tarjeta SD (almacenadas como archivos) a SRAM para su procesamiento. Actualmente puedo pensar en seguir posibles enfoques

  1. Estas matrices son en realidad matrices de MATLAB. Así que tengo la intención de guardar las variables de MATLAB como .mat y reutilizar el código de matimport.c
  2. Guarde los datos contenidos en las variables en un archivo xml. Utilice un analizador XML para el microcontrolador de destino
  3. Cree archivos binarios personalizados con metadatos asociados. Entonces, el programa en el microcontrolador lee los metadatos (filas, columnas, tipo de datos) sobre el archivo binario y extrae la variable en función de la compensación calculada a partir de los metadatos.

Sol 1 parece fácil y directo. Pero supongo que necesito usar ciertas bibliotecas externas de MATLAB y supongo que estas bibliotecas precompiladas (como libmat.lib, libmx.lib) no están disponibles para ARM.

Sol 2 es fácil si hay buenos analizadores escritos para un microcontrolador. Se aceptan sugerencias de analizadores XML.

Sol 3 implica un poco más de trabajo. Para este método, tengo la intención de escribir una aplicación C que lea archivos .mat y crear un archivo binario personalizado con metadatos y datos reales. Y tener otra función de importación idéntica en el microcontrolador.

El tamaño total de todas las variables combinadas es el rango de 20 KB a 40 KB. Por lo tanto, la tarjeta SD se utiliza en el sistema.

¿Cuál de estas técnicas es adecuada para una solución integrada de bajo impacto? Mi objetivo es elegir una solución que utilice la menor cantidad de memoria y que sea más flexible para la expansión. Por supuesto, sugiera cualquier otro enfoque para resolver este problema.

PD. El dispositivo no está basado en Arduino. Sin embargo, lo agregué, ya que Arduino Development entra en el ámbito de esta pregunta.

¿Podría explicar por qué agregó la arduinoetiqueta? No veo ninguna relación, ni siquiera está basada en ARM.
Además, su primer enfoque no funcionará NO porque no tenga libmat para ARM (quizás lo tenga, en proyectos de código abierto como scilab u octave), sino porque el tiempo de ejecución de MATLAB no cabe en un micro.
Sol 4) No los guarde como .mat, guárdelos como .txt y luego analícelos en matlab cuando los lea. Use enfoques simples al crear prototipos
@DmitryGrigoryev Hay algunas placas que no son ATmega que se basan en ARM. Totalmente de acuerdo en que el tiempo de ejecución de MATLAB no es adecuado para dispositivos con limitaciones de memoria. Investigué un poco después de publicar esta pregunta.
@ laptop2d Almacenarlo en un archivo binario es más adecuado. por ej. Un número entero tomaría el tamaño exacto de un número entero en RAM. Sin embargo, cuando el mismo entero se va a representar usando ASCII, la memoria requerida es grande

Respuestas (1)

Sugiero poner la complejidad del lado de la PC y no del lado del microcontrolador.

Debe almacenar el archivo en la tarjeta SD como una imagen binaria del contenido de la memoria que le gustaría obtener en el microcontrolador. El almacenamiento en un formato binario definido debería poder realizarse directamente desde Matlab.

Todo lo que tiene que hacer es copiar byte tras byte el contenido de su tarjeta SD en un área predefinida en la SRAM.

Una forma aún más simple sería evitar el uso de un sistema de archivos y usar la tarjeta SD como medio sin procesar. Evento más fácil en el lado del microcontrolador...

Tener la complejidad en el lado de la PC hace que esto sea mucho más fácil:

  • Puede usar cualquier lenguaje de programación que desee y no está restringido a lo que está disponible en la MCU. Usaría Python para esto, pero eso es una preferencia personal.
  • Es fácil depurar el software de PC en comparación con MCU.
  • Su MCU tendría menos cosas que hacer y, por lo tanto, más tiempo computacional disponible para hacer otra cosa (o irse a dormir para ahorrar baterías)
Escribir archivos binarios directamente desde MATLAB suena interesante. Supongamos que los datos se almacenan en la fila principal. ¿Cómo puede saber el intérprete en la MCU cuándo cambiar a la segunda fila?
Todas las posibilidades habituales. Un fragmento de metadatos al principio que define el tamaño de la matriz o un delimitador de fila.
La matriz se serializará de todos modos, por lo que también podría usar un fragmento de metadatos para decirle al micro cómo interpretarlo.