matriz - memoria dinamica c struct
Asignación de memoria dinámica en C integrado (3)
¿Puedo usar funciones malloc y eliminar en C incrustado? Por ejemplo, tengo una función, donde se creó un puntero en la estructura con la función malloc. Esta función devuelve la dirección en RAM y puedo usar esto. Después de salir de mi función, ¿dónde se asignó la memoria, este puntero se eliminará o esta memoria se reservará para esto, mientras que no se eliminará la función de eliminación?
Typedef struct {
Char varA;
Char varB
} myStruct ;
Void myfunc ( void)
{
myStruct * ptrStruct = ( myStruct *) malloc ( sizeof (myStruct)) ;
// Code here
//........
return ;
}
No hay nada específico acerca de los sistemas integrados que impidan el uso de la memoria dinámica.
Sin embargo, es posible que deba brindarle soporte de varias maneras, por ejemplo:
- Debe asegurarse de que el vinculador asigna suficiente espacio para el montón dinámico. Algunas secuencias de comandos del vinculador ya pueden asignar automáticamente toda la memoria restante al montón después de la pila y cualquier otra asignación reservada.
- Es posible que necesite implementar trozos de bajo nivel para permitir que la biblioteca acceda a la memoria del montón; por ejemplo, en la biblioteca newlib, debe implementar
sbrk_r()
para quemalloc()
etc. funcione correctamente. - En un sistema de subprocesos múltiples, es posible que necesite implementar trozos mutex para garantizar la asignación segura del montón. Si la biblioteca no proporciona tales stubs, entonces no será seguro usar
malloc()
/free()
etc. en dicho entorno, y debe escribir funciones de contenedor que afirmen los bloqueos externamente.
Sin embargo, hay una serie de razones por las que puede optar por evitar el uso de la memoria dinámica (o al menos la memoria dinámica estándar implementada por la biblioteca) en un sistema integrado:
- Los esquemas de asignación estándar tienen un tiempo no determinista inapropiado para los sistemas de tiempo real.
- Debe manejar la posibilidad de falla de asignación con gracia para cada asignación. Manejar un error de tiempo de ejecución no determinista potencial de forma segura es más complejo que simplemente hacer que el compilador le diga que tiene memoria insuficiente en tiempo de compilación.
- Debe protegerse contra fugas de memoria; cierto para cualquier sistema, pero sin sistema operativo para gestionar el agotamiento de la memoria y matar a un proceso de fuga ¿cómo se comportará su sistema?
- Es posible que la gestión del montón de la biblioteca estándar no sea segura para subprocesos sin los stubs mute o funciones de contenedor.
- Es improbable que los errores que corrompen el montón afecten la ejecución de inmediato, a menudo solo causan una falla observable cuando se realiza una nueva operación de almacenamiento dinámico, lo que resulta en un comportamiento no determinante en un momento y ubicación no relacionados con la causa real, lo que dificulta su diagnóstico. De nuevo, esto es cierto para cualquier sistema, pero las instalaciones de depuración en un sistema integrado alojado cruzado a menudo son menos sofisticadas que en un sistema autohospedado.
Sí, puede utilizar malloc en C. incrustada Algunos sistemas incorporados tienen sus propias API de asignación de memoria encapsulada. malloc () es la API de C lib.
La memoria se asigna desde el montón, un rango de memoria dedicado definido por el diseñador del sistema. Si no liberó la memoria asignada después de que finaliza su función, la memoria asignada se reserva y otros procesos no pueden usarla. Por lo general, es una pérdida de memoria. Si libera la memoria asignada pero aún usa el puntero después de eso, es un puntero salvaje y causará un comportamiento desconocido.
En general, no debe utilizar malloc
en sistemas integrados, porque hacerlo no tiene ningún sentido, como se explica aquí . En particular, no tiene ningún sentido usarlo en sistemas de metal desnudo.
El único lugar en el que tiene sentido utilizar la asignación de memoria dinámica es en sistemas hospedados y multiprocesos de gran tamaño donde varios procesos comparten la misma RAM. Si su definición de un sistema integrado es un teléfono inteligente Android o una PC portátil, entonces sí, está bien utilizar malloc.
Si te encuentras utilizándolo en otro lugar, es casi seguro que significa que el diseño de tu programa es fundamentalmente defectuoso y también que no sabes cómo funciona un montón.
Además, casi todos los estándares de programación de sistemas integrados prohíben la asignación de memoria dinámica.