179 votos

Es C++ adecuado para sistemas embebidos?

Una pregunta común, aquí y en otros lugares. Es C++ adecuado para sistemas embebidos?

Los microcontroladores? RTOSes? Tostadoras? Embedded Pc?

Es la programación orientada a objetos útiles en los microcontroladores?

¿C++ quitar el programador demasiado lejos del hardware para ser eficiente?

Debe Arduino C++ (sin administración de memoria dinámica, plantillas, excepciones) se considera como "real C++"?

(Espero que esta wiki servirá como un lugar para contener este potencial guerra santa)

148voto

intrepion Puntos 3973

Sí, C++ sigue siendo útil en sistemas embebidos. Como todos los demás, ha dicho, todavía depende del propio sistema, como una de 8 bits de la uC probablemente sería un no-no en mi libro, aunque no es un compilador de ahí y algunas personas lo hacen (estremecimiento). Todavía hay una ventaja para el uso de C++, incluso cuando usted reducirlo a algo como "C+" incluso en un 8-bit micro mundo. ¿Qué quiero decir con "C+"? Me refiero a no usar de nuevo/eliminar, evitar excepciones, evitar virtual de clases con herencia, posiblemente evitar la herencia todos juntos, ser muy cuidadoso con las plantillas, utilizar funciones en línea en lugar de macros, y el uso de const variables en lugar de #defines.

He estado trabajando tanto en C y C++ en sistemas integrados por más de una década, y algunos de mi entusiasmo juvenil para C++ definitivamente ha desaparecido debido a algunos problemas del mundo real que sacuden la ingenuidad. He visto lo peor de C++ en sistemas embebidos que me gustaría referir como "CS programadores gone wild en una EE mundo". De hecho, eso es algo que estoy trabajando con mi cliente para mejorar esta una base de código que tiene entre otros.

El peligro de C++ es porque es una herramienta muy poderosa, tanto como una espada de doble filo que puede cortar tanto el brazo y la pierna si no educados y disciplinados, bien del lenguaje y de la programación general en sí. C es más como un solo filo de la espada, pero todavía simplemente como fuerte. Con C++ es demasiado fácil para llegar muy alto nivel de abstracción y crear ofuscado interfaces que se vuelven sin sentido en el largo plazo, y eso se debe en parte a la de C++ flexibilidad en resolver el mismo problema con diferentes características del lenguaje(plantillas, programación orientada a objetos, el procesal, el RTTI, programación orientada a objetos+plantillas, sobrecarga, inline).

Terminé de 4 horas, dos seminarios sobre el Software Embebido en C++ C++ gurú, Scott Meyers. Señaló algunas de las cosas acerca de las plantillas que yo nunca había considerado antes, y cuánto más pueden ayudar a la creación de críticos para la seguridad del código. El jist de la que es, no puede haber muerto el código del software que tiene que cumplen con los estrictos requisitos de seguridad crítico de los requisitos del código. Las plantillas pueden ayudar a lograr esto, ya que el compilador sólo crea el código que necesita para crear instancias de plantillas. Sin embargo, uno debe ser más bien instruidos en su uso para diseñar correctamente para esta función que es más difícil de lograr en C, ya que los conectores no siempre optimizar el código muerto. También demostró una característica de las plantillas que sólo podría lograrse en C++ y se han mantenido a la Mars Climate Observer bloquea la NASA había implementado un sistema similar para proteger las unidades de medición en los cálculos.

Scott Meyers es un gran defensor de las plantillas y el uso racional de alineaciones, y debo decir que todavía soy escéptico en ser gung ho acerca de las plantillas. Me tienden a alejarse de ellos, aunque él dice que sólo debe aplicarse cuando se convierten en la mejor herramienta. Él también hace que el punto de que C++ te da las herramientas para hacer realmente buenas interfaces que son fáciles de usar a la derecha y hacer difícil el uso incorrecto. De nuevo, esa es la parte difícil. Uno debe llegar a un nivel de maestría en C++ antes de que usted puede saber cómo aplicar estas características de una manera más eficiente para ser la mejor solución de diseño.

Lo mismo va para la programación orientada a objetos. En el embedded world, usted debe familiarizarse con qué tipo de código que el compilador va a escupir para saber si usted puede manejar el tiempo de ejecución de costos de tiempo de ejecución de polimorfismo. Usted necesita estar dispuesto a hacer las mediciones así como para demostrar su diseño va a cumplir con el plazo de los requisitos. Es que las nuevas InterruptManager clase va a hacer que mi latencia de interrupción demasiado tiempo? Hay otras formas de polimorfismo que puede adaptarse a su problema mejor como enlace polimorfismo de tiempo que C puede hacer así, pero C++ puede hacer a través de la Pimpl patrón de diseño (puntero Opaco).

Yo digo que todo decir, que C++ tiene su lugar en el embedded world. Puede odio todo lo que quieras, pero no va a desaparecer. Puede ser escrito de una manera muy eficiente, pero es más difícil de aprender cómo hacerlo correctamente que con C. a veces puede funcionar mejor que la C en la solución de un problema y a veces expresan una mejor interfaz, pero de nuevo, tienes que educar a ti mismo y no tener miedo a aprender.

63voto

fearphage Puntos 250

C++ es absolutamente adecuado para sistemas embebidos. Yo ahora uso la presencia/ausencia de buenas herramientas de desarrollo (o falta de ella) como mi principal criterio para determinar si el uso o no de un determinado microprocesador.

Áreas de C++ que son buenas para su uso en sistemas embebidos porque tienen bajos costos de recursos:

  • la modularidad llevado por el buen uso de clases/estructuras
  • plantillas si el compilador hace un buen trabajo de compilar de manera eficiente. Las plantillas son una buena herramienta para que la reutilización de algoritmos para diferentes tipos de datos.

OK áreas:

  • las funciones virtuales-que solía estar en contra de eso, pero el costo de recursos es muy pequeña (una vtable por clase, no por el objeto; un puntero a la vtable por objeto; una de eliminar de la operación por cada llamada de función virtual) y la gran ventaja de esto es que le permite tener una matriz que contiene varios tipos diferentes de objetos w/o tener que saber de qué tipo son. He utilizado este recientemente para tener un array de objetos, cada uno representando un dispositivo I2C, cada uno con diferentes métodos.

Áreas de no uso, principalmente debido a la sobrecarga de tiempo de ejecución que es inaceptable en sistemas pequeños:

  • asignación dinámica de memoria -- otros han mencionado antes, pero otra razón importante no utilizar la asignación dinámica de memoria es que representa la incertidumbre en el tiempo; muchas razones para el uso de sistemas embebidos son para aplicaciones en tiempo real.
  • RTTI (tiempo de ejecución tipo de información) -- los costes de memoria es bastante grande
  • excepciones: un definitivo no-no, porque de la velocidad de ejecución de golpe

44voto

Armandas Puntos 552

Sí, C++ sin duda es adecuado para sistemas embebidos. Primero vamos a aclarar un par de conceptos erróneos acerca de la diferencia entre C y C++:

En un micro incorporado, siempre vas a necesitar el uso de lenguajes de alto nivel con cuidado si usted está preocupado por el tiempo o las limitaciones de espacio. Por ejemplo, muchos Mcu no manejar punteros bien, por lo que son muy ineficientes cuando el uso de la pila. Esto significa que usted tiene que tener cuidado acerca de cómo pasar variables a funciones, utilizando matrices y punteros, y la recursividad. Una simple línea de C como:

a[i] = b[j] * c[k];

puede generar alrededor de 4 páginas de instrucciones, dependiendo de la naturaleza de las variables.

Cuando usted está utilizando cualquier lenguaje de alto nivel, y usted está preocupado por el tiempo y las limitaciones de espacio, entonces usted necesita para saber cómo cada característica de que el lenguaje se traduce en las instrucciones de la máquina en el MCU (al menos, cada función que se utiliza). Esto es cierto para C, C++, Ada, lo que sea. Probablemente todos los idiomas contendrá características que no se traducen de manera eficiente en pequeña Mcu. Compruebe siempre el desmontaje de los listados para asegurarse de que el compilador no la generación de páginas y páginas de instrucciones para algo trivial.

Es C adecuado para incrustado Mcu? Sí, siempre y cuando mantenga un ojo en el código generado.
Es C++ adecuado para incrustado Mcu? Sí, siempre y cuando mantenga un ojo en el código generado.

He aquí por qué creo que el C++ es mejor que C, incluso en 8-bit Mcu: C++ proporciona un soporte mejorado para:

  • Ocultar datos
  • Más fuerte de escribir / comprobación de
  • Multi-periféricos de la transparencia en el uso de clases
  • Plantillas (como siempre, si se utiliza con cuidado)
  • La inicialización de las listas de
  • const

Ninguna de estas características se ha de pesar más que las típicas características de C.

Como usted se mueve hasta 16 o 32 bit Mcu, luego comienza a tener sentido usar mayores características de C (pila, montón, punteros, arrays, printf, etc.) De la misma manera, en una más potente MCU se convierte en apropiado para el uso pesado de las características de C++ (pila, montón, referencias, STL, new/delete).

Así, no hay necesidad de estremecerse ante la idea de C++ en un PIC16. Si usted sabe que su lenguaje y de su MCU correctamente, entonces usted sabrá cómo usar los dos juntos de manera eficaz.

25voto

Matt Dunnam Puntos 721

Yo siempre encontrar estos debates entretenido para leer. No tanto por el intelectual, el debate acerca de los pros y los contras de los distintos idiomas disponibles, pero debido a que generalmente, usted puede peg someones postura sobre el tema basado en su trabajo/experiencia/área de interés. Su derecho hasta allí con la "optimización prematura" argumentos fueron la CS de mayores y mantenimiento de los programadores de comilla Knuth a la izquierda y a la derecha y a aquellos que trabajan en el mundo real, donde el rendimiento de los asuntos pensar que estamos todos locos (yo soy un miembro de la tarde de grupo para ser justos).

Al final del día, usted puede desarrollar un excelente software en C o C++ o insertar lenguaje aquí. Se trata de las capacidades de los desarrolladores no el idioma. Ser un experto en un lenguaje que sólo es necesaria si se ha seleccionado el idioma equivocado, para empezar y ahora necesita de la urdimbre en la solución de su problema, en la mayoría de los casos estas son las únicas situaciones en las que debe sumergirse en ocultar características o compilador de trucos para lograr el objetivo.

A menudo escucho a la gente a iniciar estas argumentos como "yo soy un experto en el lenguaje X y bla bla" honestamente, inmediatamente desacreditar a estas personas porque, en mi opinión, que ya han abordado el problema desde el ángulo equivocado y todo después de que está manchada por su deseo de utilizar su herramienta para resolver el problema y mostrar cómo 'cool' es.

Que tan a menudo el reloj desarrolladores un conjunto de herramientas de primer y el intento de doblar a su problema de segundo, que es completamente equivocado, y los resultados en la mierda de soluciones.

Como mencioné en un comentario en otra respuesta, estas lenguaje a menudo las guerras recaer en argumentando que el lenguaje X permite al programador hacer más tonterías. Y a la vez entretenido para leer, todas estas afirmaciones que realmente significa es que usted tiene un problema de la contratación de los buenos desarrolladores y la necesidad de resolver ese problema directamente, en lugar de tratar de banda de ayuda a la situación por la continua coches mal a los desarrolladores y la elección de herramientas que pueden hacer el menor daño posible.

En mi opinión, los buenos desarrolladores, sea software o hardware de desarrollo, el problema de investigación, el arquitecto de la solución y encontrar las herramientas que les permitan expresar la solución en la "mejor manera". No importa si la herramienta es algo que usted nunca ha usado antes, después de que haya usado 3-4 lenguajes/herramientas de desarrollo para proyectos de levantar un nuevo debería tener un impacto mínimo en el tiempo de desarrollo.

Por supuesto, la "mejor manera" es un término subjetivo y también debe ser definido en la fase de investigación. Uno debe considerar una multitud de temas: el rendimiento, la facilidad de expresión, código de densidad, etc basado en el problema en cuestión. Yo no incluyen el mantenimiento de la lista por una razón, no me importa lo que el idioma que elija, si has elegido la herramienta adecuada y tomarse el tiempo para entender el problema, este debe venir 'gratis'. Difícil mantener el código es a menudo el resultado de la elección de la herramienta incorrecta o una mala estructura del sistema, esto se traduce en un feo hacky lío para hacer que funcione.

Para reclamar el lenguaje es "mejor" que el de cualquier otro es tonto sin la definición de un problema particular de interés. Una orientación hacia el objeto no es siempre mejor que un enfoque funcional. Hay algunos problemas que se prestan muy bien a un diseño orientado a objetos paradigma. Hay muchos que no. La misma declaración puede ser hecha sobre muchas características del lenguaje que la gente parece disfrutar de arpa.

Si su gasto en más de un 20% de su tiempo en un problema de escribir código, su, probablemente, produciendo un muy deficiente del sistema, o tienen muy buenos programadores(o de su aprendizaje). Usted debe estar pasando la mayoría de su tiempo al frente de diagramas el problema y la determinación de cómo las distintas partes de la aplicación interactuar. Pegando un grupo de talentosos desarrolladores en un cuarto con un marcador de la junta y un problema a resolver y decirles que ellos no están autorizados a escribir ningún código o elegir cualquiera de las herramientas hasta que se sienta cómodo con todo el sistema va a hacer más para mejorar la calidad de la salida y la velocidad de desarrollo de la elección de cualquiera caliente nueva herramienta garantizados para mejorar el tiempo de desarrollo. (scrum desarrollo como una referencia para el polo opuesto a mi argumento)

A menudo, la triste realidad es que muchas empresas sólo se puede medir el valor de un desarrollador por el número de líneas escritas, o por ver a la 'tangible de la salida". Ver las 3 semanas en un cuarto con un marcador de la junta como una pérdida en la productividad. Los desarrolladores a menudo se ven obligados a velocidad a través de la 'pensamiento' de la etapa de desarrollo o son forzados a usar un conjunto de herramientas que por alguna cuestión política dentro de la empresa, "mi jefe hermano trabaja para IBM tan sólo podemos utilizar sus herramientas", ese tipo de basura. O peor, se obtiene un constante cambio del conjunto de requisitos de la compañía, ya que no son capaces de hacer la correcta investigación de mercado o de no comprender el impacto de los cambios en el ciclo de desarrollo.

Lo siento por ser un poco fuera de tema con esta perorata, me tiene bastante fuertes opiniones sobre este tema.

18voto

letronje Puntos 128

En mi experiencia, C++ es generalmente mal adaptado a los pequeños sistemas embebidos. Con lo que quiero decir, microcontroladores y OS-menos dispositivos.

Muchos de C++ programación orientada a objetos técnicas se basan en la asignación dinámica de memoria. Esto es a menudo ausente en sistemas pequeños.

STL y Potenciar realmente demostrar la potencia de C++, ambos son enormes en la huella.

C++ alienta al programador abstraerse de distancia de la máquina, donde en sistemas limitados que tiene que ser aceptada.

El año pasado, he portado un comercial de escritorio remoto de productos para teléfonos móviles. Fue escrito en C++ y funciona en Windows, Linux y OSX. Pero, se basó en gran medida en STL, la memoria dinámica y las excepciones de C++. Para ponerlo en marcha en WinCE, Symbian y OS-menos ambientes C reescribir fue el sanest opción.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X