Programación de microcontroladores en ASM o C y cómo se hace

0

Solo para aclarar estos temas:

Si tuviera que programar un microcontrolador en ASM, usaría un ensamblador, por supuesto. El ensamblador compilaría el código en códigos de operación (¿código de máquina?) (Proporción generalmente 1: 1) que luego se convertiría en un archivo HEX. ¿Es este archivo el que realmente se lee en la memoria y se usa para programar el controlador? Leí que el archivo HEX contiene la ubicación real en la que se almacenarán los datos (parte de ese marco de datos) en la memoria, así como los datos que se escribirán allí.

Si programara un microcontrolador en C (o en algún otro idioma), ¿cuáles son las restricciones? Sería necesario que utilices un compilador de C, por supuesto. Pero, ¿es que debemos usar un compilador de C diseñado específicamente para trabajar con microcontroladores o una arquitectura específica?

Sé que diferentes arquitecturas tienen diferentes conjuntos de instrucciones que son incompatibles con otros, pero ¿cómo se trata esto y cómo se relaciona todo esto con una CPU que existe en una computadora?

Seguramente he confundido los temas aquí y posiblemente me he avergonzado, pero he estado leyendo sobre estos temas por un tiempo hoy y quería aclarar todo al mismo tiempo para mitigar una mayor confusión.

Gracias,

    
pregunta sherrellbc

2 respuestas

5

Un compilador puede (a los fines de su pregunta) dividirse en dos partes:

  • La primera parte lee su código, lo analiza y lo revisa para detectar errores, y hace todo tipo de cosas inteligentes con él que no tienen relación con la computadora de destino

  • La segunda parte toma la salida de la primera parte y la traduce en una secuencia de instrucciones de máquina (ya sea en forma de texto, en forma binaria o en ambas).

La segunda parte es específica para la CPU en la que debe ejecutarse su programa. Si desea ejecutar un PIC 16F, debe tener un compilador que genere instrucciones de la máquina para ese chip específico y, a menudo, el compilador necesitará saber el chip exacto para el que está compilando.

Para una CPU AVR, ARM, Cortex, MIPs, etc. necesitará un compilador diferente. Hay compiladores que contienen la segunda parte (el back-end) para más de un objetivo. En ese caso, debe especificar de alguna manera cuál de los servicios de fondo debe usarse.

    
respondido por el Wouter van Ooijen
2
  

Si tuviera que programar un microcontrolador en ASM, usaría un ensamblador, por supuesto. El ensamblador compilaría el código en códigos de operación (¿código de máquina?) (Proporción generalmente 1: 1) que luego se convertiría en un archivo HEX.

Depende del ensamblador específico. Usando gas como ejemplo, no. Crea un archivo ELF de la fuente, y luego se utiliza objcopy para extraer las secciones ELF relevantes en archivos HEX.

  

¿Es este archivo el que realmente se lee en la memoria y se usa para programar el controlador?

Y este depende del programador. El formato de archivo exacto requerido o posible varía de un programador a otro.

  

Leí que el archivo HEX contiene la ubicación real en la que se almacenarán los datos (parte de ese marco de datos) en la memoria, así como los datos que se escribirán allí.

Correcto.

  

Si programara un microcontrolador en C (o en algún otro idioma), ¿cuáles son las restricciones?

C requiere la disponibilidad de una pila que requiere SRAM en el dispositivo de destino, pero si el dispositivo tiene suficientes registros y es lo suficientemente capaz, entonces es posible crear el compilador de C de tal manera que utilice los registros como un reemplazo para el SRAM utilizado. en la pila.

  

Por supuesto, sería necesario que utilices un compilador de C. Pero, ¿es que debemos usar un compilador de C diseñado específicamente para trabajar con microcontroladores o una arquitectura específica?

El compilador debe poder generar un código de máquina (o un código de ensamblaje, si se permite / requiere el procesamiento posterior por parte de un ensamblador) que es específico de la arquitectura de destino. Además, los dispositivos dentro de la misma arquitectura pueden tener diferencias entre sí, y posiblemente se le puede dar instrucciones al compilador para que aproveche o ignore estas diferencias. P.ej. algunos dispositivos AVR tienen multiplicadores de hardware, pero no es necesario que el compilador C los use, lo que aumenta la portabilidad binaria entre dispositivos AVR.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas