Pregunta

Relacionado con:

Si está escribiendo código para un microcontrolador está allí ¿Una diferencia real si escribe en ensamblador o en C o en algún otro lenguaje de alto nivel? Si escribieras el código C, ¿cómo lo compilarías?

Gracias

¿Fue útil?

Solución

Varios comentarios:

1) Absolutamente no ensamblaje a menos que las restricciones de rendimiento u optimización lo justifiquen. Las siguientes métricas pasan por el techo con el ensamblaje:

  • hora de codificarlo
  • hora de depurarlo
  • hora de probarlo
  • hora de documentarlo
  • hora de averiguar (1 año después) qué estaba haciendo cuando lo codificó
  • posibilidades de cometer un error

2) Mi preferencia sería C ++ en lugar de C para su encapsulación de espacio de nombres & amp; su facilitación de tiempo de compilación prácticas orientadas a objetos. C tiene demasiadas oportunidades para variables globales y colisiones de espacios de nombres. (Java en tiempo real sería bueno, pero por lo que entiendo, sus requisitos siguen siendo bastante altos)

O, más bien, un subconjunto de C ++: excluye excepciones, funciones virtuales, identificación de tipo en tiempo de ejecución, también asignación de memoria dinámica en la mayoría de los casos, básicamente cualquier cosa que no se haya especificado en tiempo de compilación, ya que generalmente requerirá muchos recursos adicionales durante el tiempo de ejecución. Esa es la hinchazón de C ++.

He utilizado los compiladores de TI e IAR para C ++, para los microcontroladores TMS320 y MSP430 (respectivamente) y con la configuración de optimización adecuada, hacen un trabajo fantástico al reducir la sobrecarga que podría esperar de C ++. (Especialmente si lo ayuda mediante el uso juicioso de la palabra clave inline )

Incluso he usado plantillas para algunos de sus beneficios en tiempo de compilación que promueven la buena reutilización del código: p. escribir un único archivo de código fuente para manejar CRC de 8 bits, 16 bits y 32 bits; y polimorfismo en tiempo de compilación para permitirle especificar el comportamiento habitual de una clase, y luego reutilizar eso pero anula algunas de sus funciones. Nuevamente, el compilador de TI tenía una sobrecarga extremadamente baja con la configuración de optimización adecuada.

He estado buscando un compilador de C ++ para los PIC de Microchip; La única compañía que he encontrado que produce uno es IAR. ($$$ ha sido un obstáculo pero espero comprar una copia en algún momento) Los compiladores Microchip C18 / C30 son bastante buenos, pero son C, no C ++.

3) Una advertencia específica sobre la optimización del compilador: puede / dificultará la depuración; a menudo es imposible pasar un código C / C ++ optimizado y las ventanas de vigilancia pueden mostrar variables que no tienen correlación con lo que crees que deberían contener con código no optimizado. (Un buen depurador le advertirá que una variable en particular ha sido optimizada fuera de existencia o en un registro en lugar de una ubicación de memoria. Muchos depuradores no lo hacen. & Gt; :(

También un buen compilador le permitiría elegir / elegir la optimización a nivel de función a través de #pragmas. Los que he usado solo le permiten especificar la optimización a nivel de archivo.

4) Interfaz del código C al ensamblaje: esto suele ser difícil. La forma más fácil es crear una función de código auxiliar que tenga la firma que desea, p. uint16_t foo (uint16_t a, uint32_t b) {return 0; } , donde uint16_t = unsigned short, generalmente hacemos explícito el número de bits. Luego compílelo y edite el ensamblaje que produce (solo asegúrese de dejar las partes de inicio / salida del código) y tenga cuidado de no bloquear ningún registro sin restaurarlo una vez que haya terminado.

El ensamblaje en línea generalmente puede tener problemas a menos que esté haciendo algo muy simple como habilitar / deshabilitar interrupciones.

El enfoque que más me gusta es el compilador intrínseco / "ASM extendido" sintaxis. El compilador C de Microchip se basa en el compilador C de GNU y tiene " ASM extendido " lo que le permite codificar bits de ensamblaje en línea, pero puede darle muchos consejos para decirle a qué registros / variables hace referencia y manejará todos

Otros consejos

La mayoría de los fabricantes de microcontroladores proporcionan algún tipo de compilador cruzado donde puede compilar el código en su PC y luego transferirlo al microcontrolador.

¿Por qué C?
Una ventaja de C es que su código será más fácil de transferir a otros microcontroladores en el futuro. La historia de la informática ha demostrado que el código generalmente dura más que las implementaciones de hardware.
Una segunda ventaja son las estructuras de control (if, for, while) que hacen que el código sea más legible y mantenible.

¿Por qué lenguaje ensamblador?
Puede realizar optimizaciones manuales.

Veredicto
Como suele ser el caso con este tipo de preguntas, las compensaciones dependen mucho del uso específico.
Tenga en cuenta que a menudo es posible mezclar los dos haciendo llamadas de ensamblaje dentro del código C, para que pueda encontrar un equilibrio adecuado para su proyecto.

Específico para el hardware PIC
¿ parece que no tiene la opción de GCC con la mayoría del hardware PIC. Por otro lado, como señaló un comentarista, el compilador Microchip C30 para PIC24 de 16 bits y dsPIC33 es gcc.
PIC todavía no es compatible con SDCC .
Nueva información: según un comentario, SDCC tiene soporte viable para PIC.
Hay otras opciones de código abierto, pero no tengo experiencia con ellas.

La mejor opción es probablemente codificar en C, y luego, en los pocos casos en que necesite optimizar a mano y pueda hacer un mejor trabajo que el compilador, debe codificar el ensamblaje en sus archivos c.

La codificación de ensamblaje es cosa del pasado para las PC, pero es muy relevante en embebido.

Escribir ensamblado en incrustado es diferente de escribir ensamblado en PC. Los compiladores de PC son "mejores que los humanos" al generar instrucciones optimizadas. Los sistemas integrados a menudo tienen arquitecturas extrañas, y sus compiladores de optimización no son tan maduros como un compilador de optimización de PC.

Un problema que encontré con el ensamblaje de escritura para un microcontrolador es la necesidad de tener mucho cuidado con la distribución del código. Tener una mesa de salto cruza los límites de la memoria, y hacer que tu código salte a lugares realmente extraños es bastante inquietante. Codificando en C, el compilador cubre esa base para usted.

Definitivamente iría con C. Es más rápido y crea un software más confiable. El montaje tiene muy poco que ofrecer y en escasas ocasiones. Tenga en cuenta que en C:

  • Podrías portar fácilmente el código de plataformas existentes, incluso desde PC.
  • Puede desarrollar en un lenguaje de alto nivel sin comprometer la velocidad de ejecución o el tamaño del código. Siempre que haya un compilador de calidad disponible (hay muchas opciones para PIC18), probablemente sería mejor con C que con el ensamblaje hecho a mano.
  • Es mucho más fácil depurar, probar y mantener el código. C produce un código más confiable.

Otra cosa que específicamente tiene que ver con PIC18. No tendrá que lidiar con la arquitectura PIC no intuitiva y cosas como los BANCOS de memoria.

He tenido una buena experiencia con IAR compiladores C para 8051 en el pasado.

Mi enfoque reciente siempre ha sido este:

Escríbelo en C con un buen compilador optimizador, y SOLO ENTONCES si hay un problema con el tamaño o la velocidad, considera reescribir ciertas partes en el ensamblador.

Sin embargo, desde que tomé este enfoque, nunca necesité escribir una sola línea de ensamblador ...

¡Ve por c!

He trabajado para un gran fabricante de CE. La última vez que vi el ensamblaje fue alrededor de 1996 en algunas pequeñas rutinas de servicios de interrupción para los algoritmos de decodificación y sintonización de TV RC5 y RC6. Después de eso siempre usó c y C ++ (solo clases usadas, sin stl, excepciones o rtti). Tengo buenas experiencias con el antiguo compilador KEIL para 8051 y con el compilador greenhills (MIPS) y el conjunto de herramientas VxWorks (basado en PowerPC).

Como dice Roddy, primero escriba en C y optimice en el ensamblaje más tarde (si es necesario).

El ensamblaje puede en muchos casos ser más rápido; cuando está en una computadora de escritorio, los compiladores tienden a optimizarse hasta el punto de que el ensamblaje manual rara vez es una necesidad, pero en el mundo de los EE. UU., a menudo lo es. Además, si necesita escribir rutinas de manejo de interrupciones y cosas así, a menudo no puede hacerlo en C.

En cuanto a la compilación, busque en Google un compilador de C para su objetivo.

Definitivamente C, excepto cuando

  • la memoria del programa es extremadamente limitada. Digamos que después de la minuciosa optimización manual del código de ensamblador que logras ajustar tu programa en estos 1024 bytes de Flash, con 0 bytes restantes. En este caso, ningún compilador de C será bueno.

  • desea tener un control de tiempo absoluto. Si cualquier cantidad de latencia de interrupción es demasiado larga, tendrá que confiar en el ensamblador.

El problema en estos días es que incrustado puede ser cualquier cosa, desde un ATTiny con 6 pines y unos pocos bytes de RAM hasta un SBC multinúcleo que ejecuta un sistema operativo incrustado que avergonzaría a las computadoras de escritorio de algunas personas.

Como tal, la elección del entorno de lenguaje / desarrollo debe tener en cuenta cuán eficiente necesita ser frente a lo complejo que es el sistema.

Primero apagado: C funciona en todas partes y escala bastante bien, cuanto más alto vayas, más terminarás llamando a bibliotecas externas, etc. para manejar la complejidad.

Para micros muy pequeños (medición de flash / ram en bytes) es mejor usar ASM, cuando alcanza el rango de kb, se puede usar C o cualquiera de los otros lenguajes tradicionales ya que no necesita contar cada byte Una vez que tiene megabytes para jugar, tiene la capacidad y la probabilidad cada vez mayor de usar un RTOS para encargarse de todo y reducir el tiempo de desarrollo. En el momento en que tenga hardware, podría ejecutar un sistema operativo completo en el que probablemente pueda abstraerse del hardware y simplemente escribir todo en una celda acolchada como Java o algo así sin preocuparse demasiado por lo terriblemente derrochador que es todo y cómo está ya no soy un programador real ...;)

La excepción a lo anterior es cuando necesita todo el rendimiento que puede extraer del hardware, momento en el que puede necesitar bajar un nivel o dos para mantener las cosas eficientes.

Esa es la conclusión: si usa C, puede optimizar a mano más tarde, no usaría otra cosa que no sea C o ensamblador (sin C ++, etc.).

La clave es el conjunto de instrucciones del microcontrolador si está utilizando un PIC o incluso un 8051, usaría solo el ensamblador. Si es un compilador compatible con isa como arm o avr o msp430, use C para guardar algunos tipos de escritura, pero probablemente tendrá algunas rutinas en ensamblador por varias razones. Del mismo modo, es probable que desee evitar una biblioteca de C, incluso newlib puede ser demasiado voluminoso, pedir prestado código o ideas de ellos, pero no solo vincular uno. Oh, volviendo a la pregunta, mire qué compiladores de C están disponibles para el objetivo, nuevamente arm and avr no tendrás ningún problema. Probable msp también está bien. El hecho de que Keil o Iar le VENDAN un compilador no significa que deba comprarlo o usarlo, la producción de pago y los compiladores gratuitos pueden ser terribles. De todos modos, debe estar bien versado en el asm y examinar la salida (probablemente tenga que escribir un desensamblador para hacer esto).

En pocas palabras (otra línea de fondo), no hay una respuesta global (bueno, evite que algo más alto que C sea una respuesta global) siempre depende de cuál sea la plataforma, cuáles son sus recursos, cuál es su tarea, cuáles son los requisitos de rendimiento. los requisitos de portabilidad son (si está realmente integrado en un microcontrolador, gran parte de ellos, por definición, no son portátiles) qué compiladores, depuradores, jtag, etc. están disponibles, incluso si el sistema operativo host que está desarrollando puede ser un factor importante .

Hay otro momento en que puede ser necesario escribir en ensamblado: si necesita hacer una prueba de RAM de bajo nivel o similar, lo que requiere un control absoluto sobre dónde se almacenan los datos.

Por ejemplo, software que confirma SIL -2 (Nivel de integridad de seguridad) y superior puede requerir controles continuos en la RAM, para detectar cualquier posible corrupción de datos. El área de RAM que está verificando no puede cambiar mientras se está verificando, por lo que escribir la prueba en ensamblador le permite asegurarse de que esto sea cierto, por ejemplo, almacenando cualquier variable local en registros específicos o en otra área de RAM . Esto sería difícil, si no imposible, en C.

El código de inicio que pone a cero la RAM e inicializa variables estáticas distintas de cero también puede escribirse en ensamblador para el mismo escrito, aunque este tipo de código normalmente se proporciona.

Si está escribiendo código que depende en gran medida de periféricos específicos del dispositivo, y la cadena de herramientas que está utilizando no proporciona los elementos intrínsecos necesarios para utilizarlos de manera eficiente (como el horrible compilador Freescale DSP563CC), entonces use el ensamblaje .

Además de eso, creo que las reglas no escritas del uso de ensamblado en comparación con un lenguaje de alto nivel son más o menos las mismas que para el desarrollo de software de escritorio: mantenga el código limpio, mantenible y optimice el código dinámico con lenguaje de máquina.

El código en lenguaje ensamblador es realmente rápido con un tamaño reducido, pero el código escrito en lenguaje ensamblador no es código reutilizable. Esta característica de reutilización para el código es la característica más importante para el diseño de software. Por ejemplo, si tiene un código de proyecto de ensamblador para el procesador x86, se puede usar solo para el procesador x86, no para el procesador ARM. Pero si tiene el código C / C ++ del proyecto para el procesador x86, puede usar este código para el procesador ARM. Por lo tanto, es mejor evitar el ensamblador para el desarrollo de software.

Es una pena que nadie haya mencionado Forth o Scheme hasta ahora. Ambos pueden ser apropiados para entornos pequeños y pueden proporcionar impresionantes ganancias de productividad.

Plain C o Pascal, Modula2. Pero debido a la disponibilidad del compilador, eso significa C.

Los extras de C ++ y similares solo son interesantes por motivos de estilo, ya que la asignación dinámica y el tamaño del programa suelen ser muy limitados.

También un tiempo de ejecución más complicado puede ser un problema si sus aplicaciones se vuelven difíciles.

Assembler también puede ser útil, pero solo si vende cantidades realmente gigantescas, y un firmware más pequeño significa un chip más pequeño y más barato (menos flash) y el tamaño del programa es supervisable (lea: hay alguna posibilidad de que lo obtenga libre de errores a tiempo)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top