¿Por qué C domina en el mercado de software integrado? [cerrado]

13

Casi todos ahora dirán la bendición:

rendimiento !

De acuerdo, C sí permite escribir código atlético. ¡Pero hay otros idiomas que pueden hacerlo, después de todo! Y el poder de optimización de los compiladores modernos es impresionante. ¿Tiene C algunas ventajas que ningún otro idioma tiene? ¿O simplemente no hay necesidad de instrumentos más flexibles en el dominio?

    
pregunta vines 16.06.2011 - 17:54

8 respuestas

41
  

Casi todos ahora dirán la bendición:

     

rendimiento!

Eso es parte de ello; Para comenzar, el uso determinista de recursos es importante en dispositivos con recursos limitados, pero hay otras razones.

  1. Acceso directo a las API de hardware de bajo nivel.
  2. Puede encontrar un compilador de C para la gran mayoría de estos dispositivos. Esto no es cierto para ningún lenguaje de alto nivel en mi experiencia.
  3. C (el tiempo de ejecución y su ejecutable generado) es "pequeño". No es necesario cargar un montón de cosas en el sistema para que el código se ejecute.
  4. Es probable que las API / controladores de hardware se escriban en C o C ++.
respondido por el Ed S. 16.06.2011 - 17:58
17

C fue diseñado para modelar una CPU, porque C fue creado para hacer que Unix sea portátil en todas las plataformas en lugar de solo escribir lenguaje ensamblador.

Esto significa que los programas en C funcionan bien como un lenguaje de programación para programas que necesitan tener un nivel de abstracción muy cercano al de la CPU real, como es el caso del hardware integrado.

Nota: C fue diseñado alrededor de 1970 y las CPU eran más simples entonces.

    
respondido por el user1249 16.06.2011 - 18:10
10

C requiere muy poco soporte de tiempo de ejecución en sí mismo, por lo que la sobrecarga es mucho menor. No está gastando memoria o almacenamiento en soporte de tiempo de ejecución, invirtiendo tiempo / esfuerzo para minimizar ese soporte o teniendo que permitirlo en el diseño de su proyecto.     

respondido por el geekosaur 16.06.2011 - 18:00
10

Una de las razones de la dominación es que tiene el tipo correcto de herramientas para la tarea. Después de haber desarrollado en plataformas integradas tanto en Java como en C / C ++, puedo decirles que el enfoque básico de C ++ es simplemente más natural. Salvar al desarrollador de sentir que está saltando a través de aros porque el lenguaje es demasiado alto es una cosa bastante molesta. Un buen ejemplo es la ausencia de variables sin signo en Java.

Y las características prácticas de VM / lenguajes interpretados generalmente no son factibles y se dejan fuera de la implementación, por ejemplo. Recolección de basura.

    
respondido por el celebdor 16.06.2011 - 18:03
8

Como se mencionó en otras respuestas, C se desarrolló a principios de la década de 1970 para reemplazar el lenguaje ensamblador en una arquitectura de minicomputadora. En aquel entonces, estas computadoras suelen costar decenas de miles de dólares, incluidos la memoria y los periféricos.

Hoy en día, puede obtener la misma o mayor potencia de computadora con un microcontrolador integrado de 16 bits que cuesta cuatro dólares o menos en cantidades individuales, incluidos los controladores incorporados de RAM y E / S. Un microcontrolador de 32 bits cuesta tal vez un dólar o dos más.

Cuando estoy programando a estos pequeños, que es lo que hago el 90% del tiempo cuando no estoy diseñando los tableros en los que se sientan, me gusta visualizar lo que va a hacer el procesador. Si pudiera programar lo suficientemente rápido en ensamblador, lo haría.

No quiero todo tipo de capas de abstracción. A menudo depuro al pasar por un listado de disemador en la pantalla. Es mucho más fácil hacerlo cuando has escrito el programa en C para empezar.

    
respondido por el tcrosley 16.06.2011 - 22:03
7

No domina completamente ya que C ++ se usa cada vez más a medida que los compiladores han mejorado y el rendimiento del hardware ha aumentado. Sin embargo, C sigue siendo muy popular por varias razones;

  1. Amplio soporte. Casi todos los proveedores de chips proporcionan un compilador c y cualquier código de ejemplo y controladores probablemente se escribirán en c. Los compiladores de C ++ son cada vez más comunes, pero no un certificado muerto para un chip dado, y con frecuencia tienen más errores. También sabes que cualquier ingeniero integrado podrá trabajar en c. Es la lengua franca de la industria.

  2. Rendimiento. Sí, lo dijiste. El rendimiento sigue siendo el rey y en un entorno en el que las rutinas centrales aún se escriben a menudo en ensamblador, o al menos se optimizan en c con referencia a la salida del ensamblaje, nunca subestime la importancia de esto. A menudo, los objetivos incrustados tendrán un costo muy bajo y tendrán muy pocos recuerdos y pocos mips.

  3. Tamaño. C ++ tiende a ser más grande. Ciertamente, cualquier cosa que use el STL será más grande. Generalmente, tanto en términos de tamaño del programa como en espacio de memoria.

  4. Conservadurismo. Es una industria muy conservadora. En parte porque los costos de fallar son a menudo más altos y la depuración a menudo es menos accesible, en parte porque no ha sido necesario cambiar. Para un pequeño proyecto incrustado, c hace el trabajo bien.

respondido por el Luke Graham 16.06.2011 - 18:05
6

Para los sistemas integrados, lo importante es el rendimiento . Pero como dijiste, ¿por qué C y no otro lenguaje performativo?

Hasta ahora, muchas personas han mencionado disponibilidad de compiladores , pero nadie ha mencionado disponibilidad de desarrolladores . Muchos más desarrolladores ya saben C que, por ejemplo, OCaml.

Esos son los tres grandes.

    
respondido por el BlueRaja - Danny Pflughoeft 16.06.2011 - 23:47
6

El software integrado es muy diferente.

En una aplicación de escritorio, las abstracciones y las bibliotecas le ahorran mucho tiempo de desarrollo. Puede darse el lujo de lanzar otro par de megabytes o gigabytes de RAM o algunos núcleos de CPU de 2 + GHz de 64 bits a un problema, y otra persona (usuarios) está pagando por ese hardware. Es posible que no sepa en qué sistemas se ejecutará la aplicación.

En un proyecto integrado, los recursos son a menudo muy limitados. En un proyecto en el que trabajé (procesadores de la serie PIC 17X), el hardware tenía 2Kwords de memoria de programa, 8 niveles de pila (en hardware) y 192 bytes (< 0.2kB) de RAM. Los diferentes pines de E / S tenían capacidades diferentes y usted configuró el hardware según lo necesario escribiendo en los registros de hardware. La depuración implica un osciloscopio y un analizador lógico.

En las incorporaciones, las abstracciones a menudo se interponen y administrarían (y costarían) los recursos que no tiene. P.ej. La mayoría de los sistemas integrados no tienen sistema de archivos. Los hornos de microondas son sistemas embebidos. Controladores de motor de coche. Algunos cepillos de dientes eléctricos. Algunos auriculares con cancelación de ruido.

Un factor muy importante para mí al desarrollar sistemas integrados es saber y controlar a qué se traduce el código en términos de instrucciones, recursos, memoria y tiempo de ejecución. A menudo, la secuencia exacta de instrucciones controla, por ejemplo, tiempo para las formas de onda de la interfaz de hardware.

Las abstracciones y la "magia" detrás de escena (por ejemplo, un recolector de basura) son excelentes para las aplicaciones de escritorio. Los recolectores de basura le ahorran MUCHO tiempo en la búsqueda de pérdidas de memoria, cuando la memoria se puede asignar dinámicamente.

Sin embargo, en el mundo integrado en tiempo real, necesitamos saber y controlar cuánto tardan las cosas, a veces en nanosegundos, y no podemos lanzar otro par de megas de RAM o una CPU más rápida en un problema. Un ejemplo simple: cuando se realiza la atenuación del software de los LED controlando el ciclo de trabajo (la CPU solo tenía el control de encendido / apagado de los LED), NO está bien que el procesador se apague y haga, por ejemplo. recolección de basura de 100 ms porque la pantalla destellaría visiblemente o se apagaría.

Un ejemplo más hipotético es un controlador de motor que dispara directamente las bujías. Si la CPU se apaga y realiza la recolección de basura durante 50 ms, el motor se apagará por un momento o disparará en la posición incorrecta del cigüeñal, lo que podría detener el motor (¿al pasar?) O dañarlo mecánicamente. Podrías hacer que maten a alguien.

    
respondido por el Technophile 17.07.2014 - 19:36

Lea otras preguntas en las etiquetas