¿Cuáles son las ventajas y desventajas de usar C ++ para sistemas integrados en comparación con la programación en C?

Si por sistemas integrados, quiere decir:

  1. Dispositivo con recursos limitados, con 4 MB o menos de almacenamiento (generalmente en chip flash) y en chip RAM (generalmente 1 MB o menos), que ni siquiera puede poner Linux en él
  2. Controlar periféricos específicos (ADC, DAC, PWM)
  3. Periféricos de comunicación integrados típicos (UART, IIC, SPI, CAN)

entonces deberías considerar estas cosas:

  1. A diferencia de las computadoras de uso general (computadora de escritorio, portátil o móvil), el mercado de plataformas integradas está muy fragmentado. En el mundo de propósito general, solo conocemos grandes jugadores como ARM (móvil) y x86 (computadora de escritorio o portátil) y rara vez nos preocupamos por otras plataformas más pequeñas. En el mundo integrado, no existe un proveedor de plataforma tan dominante. Son aproximadamente del mismo tamaño (Atmel, ST, Microchip, TI, etc.).
  2. Con la limitación de recursos y la estrecha integración al hardware, cualquier proyecto solo puede crecer como máximo en un proyecto de tamaño mediano. FreeRTOS es un proyecto muy popular, pero no puedo considerarlo como un gran proyecto.

Con estas cosas en mente, ahora puedo explicar algunos pros y contras usando C ++ sobre C para sistemas embebidos.

Pros

  • La programación orientada a objetos hace que la modularidad del código sea más sencilla. Podemos emular objetos orientados en C puro, pero es incómodo. Si eres un practicante de OOP y un evangelista, entonces C ++ es tu única opción para sistemas integrados.

Contras

  • Debido a las plataformas muy fragmentadas y la complejidad del lenguaje C ++, no puede confiar plenamente en su compilador. De hecho, tiendo a desconfiar de cualquier compilador de C ++ si no es Clang, GCC o MSVC.
  • C ++ es un lenguaje difícil, que a menudo te distrae por la peculiaridad del lenguaje C ++ en lugar de resolver el problema real que tienes.
  • Las bibliotecas estándar a veces tienen un costo enorme. Una vez, utilicé std :: priority_queue para mi proyecto, pero obtuve más dependencias estándar de 10 KB. Terminé de implementarlo yo mismo.

Entonces, si se limita a una pequeña dosis de C ++ (sin RTTI, sin excepción, un uso de montón muy limitado y controlado, sin metaprogramación de plantillas sofisticadas), creo que aún puede beneficiarse de C ++. Si quieres hacer más que eso, solo estás buscando problemas por ti mismo.

Entonces, aunque creo que algunas características nuevas de C ++ moderno (C ++ 11 a C ++ 17) podrían hacer de C ++ una gran opción para sistemas integrados, debe mantenerse alejado de él por ahora, a menos que sepa lo que está haciendo. La única plataforma integrada importante que admite C ++ 14 es ARM, y está basada en GCC. Otro proveedor de plataformas no parece interesado en adoptar estas excelentes características.

¿Desea RTTI y manejo de excepciones en su dispositivo integrado?

¿Desea un control total sobre la gestión de la memoria, o está contento de permitir que el compilador asigne y desasigne objetos antes de la escena?

¿Estás escribiendo controladores de kernel para un sistema operativo como Linux? ¿Crees que las excepciones de C ++ en el núcleo serán amigables para la pila?

Si realmente supieras C ++, no harías esta pregunta.

Es necesario definir el sistema. En general, un sistema que sea compacto y cercano al hardware estará en “C”. Algunas prácticas de C ++ tal como se enseñan en la escuela suponen que tiene mucho más hardware que los sistemas integrados.
La respuesta más obvia es si tienes que preguntar que tienes mucho trabajo por delante 😉

Algunos sistemas de desarrollo como Android tienen 99% C en el kernel y Java para aplicaciones. es decir, los sistemas tienen objetivos y reglas de diseño, así que primero discuta los fundamentos de su sistema porque el diseño del sistema puede requerir algo específico.

La consideración principal es si hay un compilador de C ++, y ¿con qué están familiarizados los desarrolladores?

Si los desarrolladores conocen las características de C ++ que conducen a la acumulación de código y saben lo que podría hacer el compilador, realmente no hay mucha diferencia.

Por último, si la mayor parte de la base de código ya está en C, me parece poco probable que valga la pena el tiempo, la mano de obra, las pruebas, etc. para pasar a C ++.