¿Se acepta "nuevo" cuando se utilizan objetos C ++ en una aplicación FreeRTOS?

1

He leído que se debe evitar malloc () al diseñar aplicaciones FreeRTOS. ¿Se aplica lo mismo cuando se usa "nuevo"?

Por ejemplo:

TestObject* test = new TestObject();

En una nota al margen, ¿se pueden compilar los archivos de FreeRTOS C con un compilador de C ++?

    
pregunta M-R

3 respuestas

5

Esto no se trata de malloc vs new, sino de "¿debería usar la asignación de almacenamiento dinámico en un sistema integrado, o no?" que es más una cuestión filosófica.

La administración de la memoria del montón es muy útil desde el punto de vista de un programador, sin embargo, en una aplicación integrada / en tiempo real, cuando falla una asignación, estás en problemas.

Si toda la memoria está preasignada (es decir, estáticamente), entonces puede probar que el software nunca se quedará sin memoria. No puedes probarlo cuando usas asignación dinámica. Si administra la memoria manualmente (lo cual es un dolor), también puede haber fugas de memoria, doble libertad y otros errores sofisticados. Además, dado que está utilizando un sistema operativo multitarea preferente, debe preguntarse si su asignador de memoria es seguro para subprocesos. Si su código utiliza muchas asignaciones, la sobrecarga puede ser considerable.

Fragmentación de la memoria también es un problema real en sistemas de larga duración. Y este es bastante sutil. Necesita un asignador diseñado para mitigar esto, pero solo funcionará si las asignaciones son lo suficientemente pequeñas.

Entonces ... es una compensación. Tienes que pensar en los detalles.

    
respondido por el peufeu
2

El problema es que el soporte de memoria dinámica en sistemas integrados a menudo es muy limitado. Si está trabajando en una plataforma en la que se recomienda evitar malloc , entonces también debe evitar new .

No hay ningún requisito en C ++ para implementar new y delete de ninguna manera en particular, pero generalmente las implementaciones predeterminadas usarán malloc y free bajo el capó.

    
respondido por el Cort Ammon
0

Puede haber problemas al compilar archivos C con un compilador de C ++. Por ejemplo, C ++ tiene palabras clave adicionales como "clase" y "nuevo" que, en C, podrían usarse como nombres de variables o funciones y causaría un error si se compila con un compilador de C ++. La forma habitual de evitar esto es rodear el código C con construcciones como:

#ifdef __cplusplus
extern "C" {
#endif

// C source code 

#ifdef __cplusplus
}
#endif

Los compiladores de C ++ predefinen __cplusplus para que sean distintos de cero, mientras que los compiladores de C no lo definen.

Si verifica los archivos de fuente y encabezado de FreeRTOS, encontrará que esto ya se ha hecho, por lo que debería ser seguro compilarlo con un compilador de C ++.

    
respondido por el Steve G

Lea otras preguntas en las etiquetas