¿Cada línea de microcontrolador tiene su propio lenguaje de programación / sintaxis?

10

He programado el Arduino y he comenzado a programar el Teensy. Son similares a C, pero hay ligeros matices en el lenguaje de programación.

Por ejemplo, en la C de Arduino, se llama a una función pinMode (pin #, Output / Input) para designar un pin digital para señales de salida o señales de recepción. En Teensy's C, establece el registro "DDR" asociado con uno de los cuatro puertos (cada uno de los cuales representa una colección de pines) que designa colectivamente como entrada o salida ( ingrese la descripción del enlace aquí .

Me gustaría saber si es el caso de que cuando utiliza un microcontrolador que es nuevo para usted, necesita aprender un nuevo "idioma" de manera efectiva. Puse la palabra "lenguaje" entre comillas porque a pesar de los matices en la sintaxis, los componentes y la forma en que están configurados en el software son fundamentalmente equivalentes, por ejemplo, la noción de puertos y pines aún se refiere a un terminal desde el cual puede emitir / ingresar digital señales

En el mismo vano de discurso: ¿hay microcontroladores que no estén programados en el software o siempre habrá una capa de software utilizada para programar el uController? Si es el último, ¿quién escribe / proporciona la documentación para ellos?

    
pregunta Minh Tran

8 respuestas

2

Los microprocesadores y microcontroladores suelen utilizar una arquitectura compartida entre diferentes líneas de productos y fabricantes. Estas arquitecturas generalmente definen un conjunto de comandos de bajo nivel ( conjunto de instrucciones ) común a todas las implementaciones. Un compilador de C o C ++ podrá generar un código de bytes ejecutable en todos, por ejemplo. Procesadores ARM.

Sin embargo, la arquitectura es solo la mitad de la imagen. Ya que hay muchas direcciones de memoria específicas, periféricos integrados, administración de memoria y otros detalles de implementación que la arquitectura no aborda

Normalmente, un fabricante o un tercero proporcionará una colección de archivos de origen (un HDK ) que proporcionará definiciones, asignaciones de puertos y códigos de ejemplo. Normalmente, el HDK es para C y C ++ . Normalmente, el HDK tendrá una placa de demostración asociada (piense en $ 500 arduino). A menudo es necesario realizar una gran cantidad de trabajo de configuración para ajustar la plataforma de desarrollo / muestra al dispositivo que está diseñando

El Arduino se basa en la arquitectura AVR y es soportado principalmente por Atmel. Arduino ha creado un cargador de arranque de plataforma y una biblioteca de funciones y objetos de C ++ simplificados para que pueda utilizar la plataforma con el mínimo esfuerzo. La plataforma Arduino y el IDE están diseñados para aficionados con equipo mínimo. Antes del arduino, el PIC cumplía una función similar con un entorno BÁSICO fácil de usar y barato.

En un entorno profesional, por lo general, este soporte es proporcionado por el proveedor / fabricante o se contrata a un tercero. Proporcionan el código y los encabezados de bajo nivel y usted escribe su aplicación con ese HDK, en organizaciones más grandes, esto podría hacerse de manera interna. Hay una tendencia reciente para que los fabricantes construyan un ecosistema de software / API abierto alrededor de su plataforma que los haga tan fáciles de usar como el arduino. Todavía hay innumerables chips con muy poco soporte de programación, y la mayoría de los conocimientos sobre plataformas están ocultos en el mundo corporativo.

    
respondido por el crasic
14

El lenguaje en este caso es exactamente el mismo. El entorno de Arduino tiene algunas bibliotecas adicionales (solo más código C) que "envuelven" el acceso a los registros de hardware reales (DDRx, PORTx, INx, etc.) con funciones un poco más fáciles de usar. Esto aumenta la sobrecarga (se deben ejecutar más instrucciones para la misma operación) pero aumenta la flexibilidad, ya que es "simple" escribir un programa que use solo estas llamadas, luego reorientarlo para un chip diferente (por ejemplo, un mega arduino) y La biblioteca manejará el mapeo apropiado internamente.

Realmente no hay API 'estándar' para el acceso de muy bajo nivel a través de chips de diferentes proveedores. Sin embargo, todo el acceso de bajo nivel se realiza de la misma manera (lee y escribe en direcciones de memoria fijas), por lo que el método de acceso general será similar entre las diferentes partes, solo los detalles y los nombres serán diferentes. Tal vez uno solo proporcionará archivos de encabezado con listas enormes de #defines que registren las direcciones enviadas a los punteros. O tal vez los archivos de encabezado usarán estructuras para mantener las cosas organizadas con un poco de jerarquía. Algunos fabricantes también pueden proporcionar API de nivel superior. Esto puede ser muy útil para los periféricos que son complejos y difíciles de configurar. GPIO es muy simple, pero algo como un controlador USB con soporte DMA podría tener cientos de registros. Generalmente, la documentación de la API se proporcionará con la cadena de herramientas suministrada por el proveedor.

Entonces, la conclusión es que sí, tendrá que aprender algunos nuevos nombres de registro, pero el lenguaje sigue siendo C ++ (o C, ensamblaje o quizás algo más esotérico).

    
respondido por el alex.forencich
5

Estás confundiendo microcontroladores y compiladores. Los lenguajes de alto nivel en los que puede programar cualquier micro en particular es una función de los compiladores disponibles para ese micro.

En el nivel bajo, el micro ejecuta las instrucciones de la máquina, que un compilador deriva para el archivo de texto que le da y que considera el "programa". Realmente está especificando alguna lógica a realizar, y el compilador se da cuenta de cómo usar las instrucciones de la máquina disponibles para implementar esa lógica. En este caso, lo que programas es una función del compilador, no el conjunto de instrucciones nativas del micro.

Puedes programar un micro especificando instrucciones nativas directamente. Esto se hace usando lenguaje ensamblador. Como un compilador, el ensamblador es un traductor que toma un archivo de texto que usted escribe y produce instrucciones de la máquina como resultado. La diferencia es que en este caso está especificando directamente las instrucciones de la máquina. Cada instrucción recibe un nombre y usted escribe estos nombres en lugar de los códigos de operación binarios, pero todavía está especificando las instrucciones directamente. El ensamblador solo realiza el trabajo duro de averiguar la codificación binaria exacta de cada instrucción a partir del nombre y las opciones que escribe en el archivo de texto.

Si bien un lenguaje de alto nivel puede ser el mismo para micros muy diferentes, las instrucciones de la máquina generalmente son similares dentro de una familia de micros relacionados. Por ejemplo, todos los PIC 18 de Microchip tienen el mismo conjunto de instrucciones (en su mayoría), que es diferente del PIC 16 básico, y nuevamente diferente de las partes de 16 bits como el PIC 24 y el dsPIC 30 y 33.

    
respondido por el Olin Lathrop
2

El lenguaje de programación sigue siendo C. Pero la biblioteca del fabricante para acceder al hardware es diferente. Por lo que sé, no existe un estándar, por lo que cada fabricante tiene su propia API. Si desea ser portátil entre diferentes fabricantes, es posible que desee introducir su propia API abstracta para acceder al hardware con implementaciones específicas que asignan su API a los métodos específicos del fabricante.

    
respondido por el MrSmith42
2

Otras respuestas han hecho la distinción entre lenguajes de alto nivel (como C ++) y código de máquina, aunque no creo que eso invalide su afirmación de que cada microcontrolador tiene un "lenguaje" asociado.

Las diferencias en las implementaciones de lenguaje no son lo suficientemente grandes para ser clasificadas como idiomas diferentes, aunque no dudaría en diferenciarlas en "dialectos". Aquí pueden existir dos capas de cambio.

  1. Las bibliotecas de envoltorios de alto nivel pueden estar disponibles del fabricante o de un tercero
  2. Es posible que algunos compiladores no emitan códigos que cumplan con los estándares

Tomemos estos puntos mientras observamos la plataforma Arduino.

  • La comunidad Arduino proporciona bibliotecas de C ++ muy abstractas para los chips de arquitectura AVR. Estas bibliotecas sugieren un flujo de control diferente al que se podría esperar de un programa típico de C ++ (por ejemplo, la ocultación de main ()).
  • Bajo el capó, Arduino compila su código usando avr-gcc, que emite el código C / C ++. Sin embargo, las excepciones no están bien soportadas en los chips AVR y casi siempre están deshabilitadas. Si falta una función tan grande, el programa resultante podría no actuar como lo haría un programa 'normal' de C ++.

Sabiendo esto, ¿cómo decides cómo programar cualquier microcontrolador arbitrario? Tienes varias opciones:

  1. Busque bibliotecas e IDE creados por la comunidad para su chip específico. Los chips AVR a veces se desarrollan solo con C, pero el proyecto Arduino proporciona una experiencia más fácil de usar para los aficionados.
  2. Encuentre compiladores que puedan compilar para su chip específico. Con el compilador adecuado, las hojas de datos de tu chip y un poco de paciencia, podrás escribir código muy cerca del metal.

Para referencia, aquí hay una lista de backends soportados para GCC. Notará que hay soporte para ARM, AVR, MIPS y algunos otros.

Sobre chips que no están programados con 'software' ...

¡Es posible que desee ver en arreglos de puertas programables en campo (FPGA)! Los FPGA se controlan cambiando los valores de las tablas de consulta para emular puertas lógicas. Esto no tiene un formulario de software correspondiente, per se, pero aún se desarrolla utilizando lenguajes de descripción de hardware como VHDL y Verilog.

    
respondido por el Strangework
1

Miro una pcboard y veo algunos dispositivos de montaje en superficie, algunas resistencias y condensadores y leds. ¿Eso significa que debido a que una de esas placas es una tarjeta de video, todas las tarjetas con resistencias y capacitores y múltiples capas y trazados son todas tarjetas de video? No

Aquí hay otro ejemplo, esta página web utiliza el alfabeto inglés y las palabras en inglés. Entonces, ¿el sitio web del New York Times hace que este sitio web sea el New York Times? No, solo comparten el mismo alfabeto e idioma, pero son completamente diferentes.

C es un lenguaje de programación de propósito general que resume el conjunto de instrucciones debajo de él. Se puede usar para aplicaciones simples, se puede usar para crear sistemas operativos diferentes e incompatibles entre sí, se puede usar para crear videojuegos, etc. Todos los cuales utilizan el mismo lenguaje C básico, algunas funciones y construcciones comunes en C, así como Las llamadas a funciones que han creado son específicas de la aplicación de destino. Para cada una de esas plataformas que mencionas u otras, puede haber un conjunto de funciones que alguien elija crear. Al igual que un puñado de personas hasta ahora, incluso yo, le he dado la misma respuesta, pero la han escrito de otra manera. Tome 100 programadores, aíslelos entre sí y asigne una tarea de programación para resolver un problema particular, sin limitar por completo su libertad de programación, y obtendrá de 1 a 100 soluciones diferentes, incompatibles entre sí, probablemente no 1, sino varias. temas comunes dependiendo de su entrenamiento y experiencia, y luego los nombres de variables y nombres de funciones que como conjunto probablemente sean únicos para cada individuo. Tome los mismos tableros de los que ya está hablando y encontrará que ciertamente tengo mi propio código C que es incompatible (con las funciones arduino) para ejecutar en ellos, como con muchos otros, así como incompatible con otras plataformas. Esa es la belleza de la programación incrustada completa, no está limitado de ninguna manera, no tiene que vivir dentro de las bibliotecas estándar de los sistemas operativos o el conjunto limitado de reglas de guis, etc. libertad total.

Puedes elegir, y un alto porcentaje de personas lo hacen, jugar en el arenero de otra persona en lugar de crear el tuyo propio, lo que significa que debes usar el arduino gui y sus bibliotecas de C.

Puede tomar la misma PC y ejecutar diferentes versiones de windows it, linux, bsd y una lista de otros sistemas operativos que, en algún nivel, usan C pero cuyas funciones son incompatibles entre sí. El mismo hardware y C incompatible, que se extiende a un hardware diferente, en el mismo idioma, puede tener un código compatible o incompatible. El lenguaje de ninguna manera los hace compatibles.

C se usa en estas plataformas integradas porque esa es la práctica común, no hay otro lenguaje que pueda reemplazar a C para esto. El primer paso para un nuevo procesador es el ensamblaje, por supuesto, casi siempre es C el siguiente, y quizás otros si es lo suficientemente potente como para ejecutar un sistema operativo (Linux, BDS, etc.). C se inventó y esperaba resolver el problema en el momento de portar el código a través de plataformas, y siempre que tenga un sistema operativo que sea el caso, un compilador compatible con C que cree un código que FUNCIONA EN UN SISTEMA OPERATIVO hará el archivo C estándar. Operaciones y printf y cosas así. Pero el tema del metal es una historia diferente: no hay un sistema operativo. A menudo no existe la noción de un sistema de archivos ni una pantalla, pero por la práctica común es probable que haya un compilador de C que, en sus raíces, convierta a C en un lenguaje ensamblador específico. Por lo tanto, engañamos la idea original de que C es un puente entre las diferentes computadoras para ayudar a la portabilidad del código, y tomamos decisiones personales de diferentes bibliotecas incompatibles para un objetivo específico.

    
respondido por el old_timer
1

Para responder a su segunda pregunta, el término "microcontrolador" implica que el chip tiene una CPU y RAM (y probablemente ROM) a bordo. Todos los microcontroladores ejecutan software, por eso nos gustan.

Profundizando en la primera pregunta, tenga en cuenta que si bien (casi?) todas las MCU tienen un compilador de C, el lenguaje C básico no admite todas las instrucciones en cada procesador. Por ejemplo, C tiene operadores de desplazamiento hacia la izquierda / derecha, pero no los operadores de rotación hacia la izquierda / derecha. El sistema de punteros de C no admite naturalmente espacios separados de direcciones de datos y programas (como en algunas Arquitecturas de Harvard). C no tiene soporte SIMD directo.

Los compiladores tienen algunas opciones para lidiar con estas características:

  1. Amplíe el idioma base, generalmente con nuevas palabras clave (por ejemplo, cerca y lejos para memorias paginadas).

  2. Proporciona funciones intrínsecas (por ejemplo, __ror () y __rol () para la rotación).

  3. Utilícelos en el optimizador para que las secuencias de operaciones de C se compilen en una instrucción eficiente (por ejemplo, una multiplicación / acumulación).

  4. Ignóralos y haz que el usuario escriba el código de ensamblaje si quiere funciones que no sean de la norma C.

El siguiente nivel es el de los archivos de encabezado proporcionados por el fabricante que definen principalmente todos los registros para usted. Puede hacer esto usted mismo, pero es un gran dolor a menos que sea un experto en ese MCU.

Finalmente, hay funciones de biblioteca proporcionadas por el fabricante, que manejan las escrituras de bajo nivel como el registro para usted.

Tu ejemplo mezcla dos niveles. DDR es una macro que se refiere a un registro. Se implementa como un acceso de puntero o una función intrínseca del compilador (no recuerdo cuál). pinMode () es una función que escribe para usted en el registro DDR.

Cuando pases de una línea MCU a otra, tendrás que aprender nuevos registros y nuevas peculiaridades del compilador. Si permanece dentro de la misma compañía, podría obtener una API similar. Diferentes empresas no comparten APIs; ¿Por qué te ayudamos a cambiar a nuestros competidores? :-)

    
respondido por el Adam Haun
1

Los microcontroladores a menudo tienen microcódigos diferentes en el nivel de hardware. Para evitar que ingresemos el código de máquina (es decir, instrucciones en forma de números, cada uno que representa el microcódigo sin procesar del microcontrolador) o en un ensamblador simbólico (que proporciona una etiqueta mnemónica para cada instrucción de código de máquina), se usan lenguajes portátiles de alto nivel. / p>

C y Forth están diseñados para ser fácilmente transportables a través de diferentes conjuntos de códigos de máquinas.

Entonces, si usas C en el Arduino y C en el Teensy, estás usando C en ambos casos.

Si usas Forth en el Arduino, y Forth en el Teensy, estarías usando Forth en ambos casos.

A veces, las instalaciones de hardware adicionales solicitarán a la persona (o grupo) que traslade el idioma al nuevo hardware para que escriba un código prefabricado que le permita acceder a las nuevas instalaciones de la plataforma de hardware, sin tener que escribir mucho. -nivel de código usted mismo.

Estas bibliotecas (en C) o diccionarios (en Forth) pueden tener algunas funciones o palabras específicas del hardware.

    
respondido por el Euan M

Lea otras preguntas en las etiquetas