¿Hay algún inconveniente en la asignación de una gran cantidad de la pila para una única matriz en un sistema integrado?

12

Por lo general, no tengo problemas para decidir si algunos datos tienen que ser globales, estáticos o en la pila (aquí no hay una asignación dinámica, por lo que no hay uso del montón). También he leído algunas preguntas y respuestas, como esta pero mi pregunta es más específico ya que involucra una gran cantidad de datos, enorme en comparación con la memoria del sistema.

Estoy trabajando en un código existente que trato de mejorar (diseño, posibles problemas, actuaciones, etc.). Este código se ejecuta en una MCU de 8 bits con solo 4KB de RAM . En este código me enfrento al uso de una matriz de casi 1 KB (sí, 1 KB en un sistema de RAM de 4 KB ). Se usa cada byte de esta matriz, esa no es la pregunta. El problema es que esta matriz es una matriz estática en el archivo donde se declara, por lo que su ciclo de vida es el mismo que el programa uno (es decir, puede considerarse infinito).

Sin embargo, después de leer el código, acabo de descubrir que esta matriz no necesita un ciclo de vida infinito, se construye y se trata de una manera completamente procesal, por lo que deberíamos poder declararlo solo en la función donde se usa, de esta manera estaría en la pila, y por lo tanto guardaríamos este 1KB de RAM.

Ahora la pregunta: ¿Sería una buena idea? Desde el punto de vista del diseño, si no necesita un ciclo de vida infinito / global, pertenece a la pila. Pero bueno, eso es 1KB de 4KB, ¿no hay ningún inconveniente en la asignación de un 25% de la RAM de esta manera? (que podría ser el 50% o más de la pila)

¿Podría alguien compartir algo de experiencia con este tipo de situación, o alguien podría pensar en alguna razón válida para no poner esta matriz en la pila? Estoy buscando inconvenientes técnicos, así como comentarios sobre el diseño.

Lo único que tengo en cuenta es que debo asegurarme de que tengo 1KB de pila libre al ingresar a esta función. Tal vez eso es todo lo que tengo que cuidar, tal vez no.

    
pregunta Tim 11.10.2016 - 13:56

5 respuestas

7
  

Lo único que tengo en cuenta es que debo asegurarme de que tengo 1KB de pila libre al ingresar a esta función.

Sí, y eso es una fuerte restricción. Será mejor que se asegure estáticamente de lo que tiene un espacio tan grande disponible en la pila. Si el código es pequeño, si está utilizando un GCC reciente para compilar su código, consulte esto .

Por cierto, algunos microprocesadores baratos pueden hacer uso de un marco de llamada "grande" más costoso que uno "normal" (por ejemplo, porque su conjunto de instrucciones favorecería un desplazamiento de un byte desde el puntero de pila). YMMV.

Además, si está codificando en C y cree que su amplia matriz puede reutilizar su espacio para otros fines, podría considerar convertirlo en miembro de la unión (con una variable global de tipo union ). Sí, eso es bastante feo.

Alternativamente, podría considerar codificar un asignador de pila primitivo adecuado para su aplicación (y podría tener una API diferente de malloc & free ....).

    
respondido por el Basile Starynkevitch 11.10.2016 - 14:09
6

Las personas tienden a ser cautelosas con una pila grande, porque crece hacia atrás en la RAM y sobrescribe los valores de las variables, lo que lleva a un comportamiento inexplicable. Se vuelve aún peor, porque necesita saber la dirección de puntero de pila más baja posible y restar el tamaño para asignar al ingresar a la rutina.

Todo esto es un trabajo para la administración de la memoria del hardware (debe generar trampas o fallas cuando se produce un desbordamiento de pila) o para el compilador, dado que tiene características para este tipo de análisis.

De lo contrario, puedes hacer lo que quieras con tu RAM.

    
respondido por el Martin Sugioarto 11.10.2016 - 14:17
4

Como han señalado las respuestas anteriores, también recomendaría dejar la matriz estática si cabe en la memoria. En la mayoría de los casos, es mucho más importante tener una huella determinista en la memoria, incluso si eso significa que se "desperdicia" la memoria por variables que no se usan todo el tiempo. Colocar matrices grandes en su pila lo hará explotar con demasiada facilidad, y los desbordamientos de la pila tienden a causar problemas difíciles de encontrar y difíciles de reproducir (si no puede usar MMU para proteger la pila).

La sugerencia de compartir el bloque con algunos otros datos con union es IMO válida, aunque también puede ser fuente de problemas difíciles de encontrar, si ubica variables incorrectas en él.

Si se está quedando sin memoria y necesita desesperadamente hacer variables de vida más corta para compartirla, antes de mover la matriz a la pila, consideraría agregar una asignación de memoria dinámica, aunque tenga sus propios inconvenientes. En este caso, puede que no sea una respuesta, ya que la matriz suena bastante grande en comparación con la memoria disponible.

    
respondido por el MaKo 11.10.2016 - 20:42
1

Tienes otra opción si tienes algún tipo de almacenamiento flash. Puede intercambiar la velocidad de acceso a ram almacenando sus datos en flash y leyendo & buscando allí. Solo necesitarías cargar un registro a la vez en el ram. Será un poco más complicado si necesita poder actualizar los registros. Necesitará un mecanismo segmentado desgastado. He hecho esto en el pasado e incluí un índice para acelerar el acceso.

    
respondido por el Tereus Scott 12.10.2016 - 23:48
1

Especialmente cuando trabajas con sistemas integrados, quieres que ocurran muchos de los posibles fallos en el momento de la compilación y nada nunca falla en el tiempo de ejecución (aunque sería bueno si pudiéramos lograrlo ...) .

Hacer arrays grandes que pueda necesitar en estados arbitrarios de su programa asignados estáticamente hace exactamente eso: el enlazador eventualmente le advertirá que "esto no cabe en la RAM", mientras que la asignación de pila simplemente hará que su programa se bloquee con dificultad. -debug desbordamientos de pila.

    
respondido por el tofro 31.10.2016 - 10:28

Lea otras preguntas en las etiquetas