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 Arduino's C, llama a una función pinMode (pin #, Output / Input) para designar un pin digital para enviar señales o recibir señales. En Teensy's C, configura el registro "DDR" asociado con uno de los cuatro puertos (cada uno de los cuales representa una colección de pines) que colectivamente designa como entrada o salida ( sintaxis Teensy IO ).
Me gustaría saber si es el caso de que cuando usa un microcontrolador que es nuevo para usted, necesita aprender efectivamente un nuevo "idioma". Pongo la palabra "idioma" entre comillas porque, a pesar de los matices en la sintaxis, los componentes y cómo están configurados en el software son fundamentalmente equivalentes, por ejemplo, la noción de puertos y pines todavía se refieren a un terminal desde el cual puede emitir / ingresar digital señales
En el mismo vano 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 esto último, ¿quién escribe / proporciona documentación para ellos?
fuente
Respuestas:
Los microprocesadores y los microcontroladores suelen utilizar una arquitectura compartida entre diferentes líneas de productos y fabricantes. Estas arquitecturas suelen definir un conjunto de comandos de bajo nivel ( conjunto de instrucciones ) común a todas las implementaciones. El compilador AC o C ++ podrá generar bytecode ejecutable en todos los procesadores ARM, por ejemplo.
Sin embargo, la arquitectura es solo la mitad de la imagen. Dado 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
Un fabricante o un tercero generalmente proporcionarán una colección de archivos de origen (un HDK ) que proporcionará definiciones, asignaciones de puertos y código de ejemplo. Normalmente, el HDK es para C y C ++ . Por lo general, el HDK tendrá una placa de demostración asociada (piense en $ 500 arduino). A menudo se necesita mucho trabajo de configuración detallado para ajustar la plataforma de desarrollo / muestra al dispositivo que está diseñando
El Arduino se basa en la arquitectura AVR y es compatible principalmente con Atmel. Arduino ha creado un gestor de arranque de plataforma y una biblioteca de funciones y objetos 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 un equipo mínimo. Antes del arduino, el PIC cumplía una función similar con un entorno BASIC fácil de usar y barato.
En un entorno profesional, el proveedor / fabricante proporciona este soporte o lo contrata 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 internamente. Existe una tendencia reciente para que los fabricantes creen un ecosistema abierto de API / Software alrededor de su plataforma que los haga tan fáciles de usar como Arduino. Todavía hay innumerables chips con muy poco soporte de programación, y la mayoría del conocimiento de la plataforma está encerrado en el mundo corporativo.
fuente
El lenguaje en este caso es exactamente el mismo. El entorno 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 ligeramente 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 retarget para un chip diferente (por ejemplo, un mega arduino) y la biblioteca manejará el mapeo apropiado internamente.
Realmente no hay ninguna API 'estándar' para un acceso realmente de 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. Quizás uno solo proporcionará archivos de encabezado con grandes listas de direcciones de registro #defines emitidas a 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 periféricos que son complejos y difíciles de configurar. GPIO es muy simple, pero algo así como un controlador USB con soporte DMA podría tener cientos de registros.
Entonces, la conclusión es sí, necesitará aprender algunos nombres de registro nuevos, pero el lenguaje sigue siendo C ++ (o C, ensamblaje, o quizás algo más esotérico).
fuente
main()
predefinidos para ti. En cambio, obtienes dos puntos de entrada:init()
yloop()
(corrígeme si me equivoco pero solo he tocado a Arduino con un poste de 20 pies)Estás confundiendo microcontroladores y compiladores. Los lenguajes de alto nivel en los que puede programar cualquier micro en particular dependen de los compiladores disponibles para ese micro.
En el nivel bajo, el micro ejecuta instrucciones de la máquina, que un compilador deriva para el archivo de texto que le da que considera el "programa". Realmente está especificando algo de lógica para realizar, y el compilador descubre cómo usar las instrucciones disponibles de la máquina para implementar esa lógica. En este caso, lo que usted programa es una función del compilador, no el conjunto de instrucciones nativas del micro.
Puede 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 esas instrucciones de máquina directamente. Cada instrucción recibe un nombre, y usted escribe estos nombres en lugar de los códigos de operación binarios, pero aún está especificando las instrucciones directamente. El ensamblador solo hace el trabajo de descifrar 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 en micros muy diferentes, las instrucciones de la máquina generalmente solo son similares dentro de una familia de micros relacionados. Por ejemplo, todos los Microchip PIC 18 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 dsPIC 30 y 33.
fuente
El lenguaje de programación sigue siendo C. Pero la biblioteca del fabricante para acceder al hardware difiere. Hasta donde sé, no hay un estándar, por lo que cada fabricante tiene su propia API. Si desea ser portátil entre diferentes fabricantes, puede presentar su propia API abstracta para acceder al hardware con implementaciones específicas que asignen su API a los métodos específicos del fabricante.
fuente
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 de las implementaciones de lenguaje no son lo suficientemente grandes como para ser clasificadas como idiomas diferentes, aunque no dudaría en diferenciarlas en 'dialectos'. Aquí pueden existir dos capas de cambio.
Tomemos estos puntos mientras observamos la plataforma Arduino.
Sabiendo esto, ¿cómo decides cómo programar cualquier microcontrolador arbitrario? Tienes varias opciones:
Como referencia, aquí hay una lista de backends compatibles con GCC. Notarás que hay soporte para ARM, AVR, MIPS y algunos otros.
Sobre chips que no están programados con 'software' ...
¡Es posible que desee examinar las matrices de puertas programables en campo (FPGA)! Los FPGA se controlan cambiando los valores de las tablas de búsqueda para emular las 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.
fuente
Miro un tablero 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 placas con resistencias y condensadores y múltiples capas y trazas son todas tarjetas de video? No
Aquí hay otro ejemplo, esta página web utiliza el alfabeto inglés y las palabras inglesas. Entonces, ¿el sitio web del New York Times hace que este sitio web sea el New York Times? No, simplemente comparten el mismo alfabeto e idioma, pero por lo demás son completamente diferentes.
C es un lenguaje de programación de propósito general que resume la instrucción que se encuentra debajo. Se puede usar para metal desnudo, se puede usar para crear sistemas operativos diferentes e incompatibles entre sí, se puede usar para crear videojuegos, etc. Todos los cuales usan el mismo lenguaje C básico, algunas funciones y construcciones C comunes, así como llamadas a funciones que han creado que 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 eligió crear. Al igual que un puñado de personas hasta ahora, incluyéndome a mí, le he dado la misma respuesta pero la escribí de una manera diferente. Tome 100 programadores y aíslelos unos de otros y dele una tarea de programación para resolver un problema en particular, sin limitar completamente su libertad de programación, y obtendrá de 1 a 100 soluciones diferentes, incompatibles entre sí, probablemente no 1 sino varios temas comunes dependiendo de su capacitación y experiencia, y luego 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 de arduino) para ejecutarse en ellos, como con muchos otros, así como incompatible con otras plataformas. Esa es la belleza de la programación incrustada de metal desnudo, no está limitado de ninguna manera, no tiene que vivir dentro de las llamadas a la biblioteca estándar de los sistemas operativos o el conjunto limitado de reglas de la GUIS, etc. total libertad. probablemente no 1 sino varios temas comunes dependiendo de su capacitación y experiencia, y luego 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 de arduino) para ejecutarse en ellos, como con muchos otros, así como incompatible con otras plataformas. Esa es la belleza de la programación incrustada de metal desnudo, no está limitado de ninguna manera, no tiene que vivir dentro de las llamadas a la biblioteca estándar de los sistemas operativos o el conjunto limitado de reglas de la GUIS, etc. total libertad. probablemente no 1 sino varios temas comunes dependiendo de su capacitación y experiencia, y luego 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 de arduino) para ejecutarse en ellos, como con muchos otros, así como incompatible con otras plataformas. Esa es la belleza de la programación incrustada de metal desnudo, no está limitado de ninguna manera, no tiene que vivir dentro de las llamadas a la biblioteca estándar de los sistemas operativos o el conjunto limitado de reglas de la GUIS, etc. total libertad. 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 de arduino) para ejecutarse en ellos, como con muchos otros, así como incompatible con otras plataformas. Esa es la belleza de la programación incrustada de metal desnudo, no está limitado de ninguna manera, no tiene que vivir dentro de las llamadas a la biblioteca estándar de los sistemas operativos o el conjunto limitado de reglas de la GUIS, etc. total libertad. 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 de arduino) para ejecutarse en ellos, como con muchos otros, así como incompatible con otras plataformas. Esa es la belleza de la programación incrustada de metal desnudo, no está limitado de ninguna manera, no tiene que vivir dentro de las llamadas a la biblioteca estándar de los sistemas operativos o el conjunto limitado de reglas de la GUIS, etc. total libertad.
Puedes elegir, y un alto porcentaje de personas lo hacen, jugar en el entorno limitado de alguien más en lugar de construir el tuyo propio, lo que significa usar la interfaz gráfica de usuario arduino y sus bibliotecas C.
Puede tomar la misma PC y ejecutar diferentes versiones de Windows it, linux, bsd y una lista completa de otros sistemas operativos que en algún nivel usan C pero cuyas llamadas de función son incompatibles entre sí. El mismo hardware y C incompatible, que se extiende a hardware diferente, el mismo lenguaje, pueden tener 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 por esto. El primer paso para un nuevo procesador es el ensamblaje, por supuesto, luego casi siempre es el siguiente C, luego tal vez otros si es lo suficientemente potente como para ejecutar un sistema operativo (linux, bsd, etc.). C fue inventado y esperaba resolver el problema en ese momento de portar código a través de plataformas, y siempre que tenga un sistema operativo que sea el caso, un compilador compatible con C que crea código que CORRE EN UN SISTEMA OPERATIVO, hará el archivo C estándar operaciones y printf y esas cosas. Pero el bare metal es una historia diferente: no hay un sistema operativo, a menudo no existe una noción de un sistema de archivos ni una pantalla, pero por práctica común es probable que haya un compilador de C que, en su raíz, convierta C en un lenguaje ensamblador específico de destino.
fuente
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 izquierda / derecha, pero no operadores de rotación izquierda / derecha. El sistema de puntero de C no admite naturalmente espacios de direcciones de datos y programas separados (como en algunas arquitecturas de Harvard). C no tiene soporte SIMD directo.
Los compiladores tienen algunas opciones para manejar estas características:
Extienda el idioma base, generalmente con nuevas palabras clave (p. Ej., Cerca y lejos para recuerdos paginados).
Proporcione funciones intrínsecas (por ejemplo, __ror () y __rol () para la rotación).
Utilícelos en el optimizador para que las secuencias de operaciones en C se compilen en una instrucción eficiente (por ejemplo, multiplicar / acumular).
Ignórelos y haga que el usuario escriba el código de ensamblaje si desea funciones que no sean estándar C.
El siguiente nivel es los archivos de encabezado proporcionados por el fabricante que definen principalmente todos los registros para usted. Podrías hacerlos tú mismo, pero es un gran dolor a menos que seas un experto en ese MCU.
Finalmente, hay funciones de biblioteca proporcionadas por el fabricante, que manejan las cosas bajas como las escrituras de 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 (se me olvida cuál). pinMode () es una función que escribe en el registro DDR por usted.
Cuando pases de una línea de MCU a otra, tendrás que aprender nuevos registros y nuevas peculiaridades del compilador. Si permanece dentro de la misma compañía, puede obtener una API similar. Diferentes empresas no comparten API; ¿Por qué lo ayudaríamos a cambiar a nuestros competidores? :-)
fuente
Los microcontroladores a menudo tienen diferentes microcódigos a nivel de hardware. Para evitar que ingresemos código de máquina (es decir, instrucciones en forma de números, cada una representando 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 utilizan idiomas portátiles de alto nivel.
C y Forth están diseñados deliberadamente para ser fácilmente transportables en diferentes conjuntos de códigos de máquina.
Entonces, si usa C en el Arduino y C en el Teensy, está usando C en ambos casos.
Si usaste Forth en el Arduino y Forth en el Teensy, estarías usando Forth en ambos casos.
A veces, las instalaciones de hardware adicionales le pedirán a la persona (o grupo) que transfiera el idioma al nuevo hardware que escriba un código prefabricado para permitirle acceder a las nuevas instalaciones de la plataforma de hardware, sin tener que escribir mucho código de bajo nivel. tú mismo.
Estas bibliotecas (en C) o diccionarios (en Forth) pueden tener algunas funciones o palabras específicas de hardware.
fuente