stringtranslate.com

Hélice de paralaje

Hélice Parallax en paquete doble en línea
Hélice de paralaje en TQFP

El Parallax P8X32A Propeller es un chip microcontrolador de arquitectura de computadora paralela con procesador multinúcleo con ocho núcleos de unidad central de procesamiento (CPU) de conjunto de instrucciones reducidas (RISC) de 32 bits . [1] [2] Presentado en 2006, está diseñado y vendido por Parallax, Inc.

El microcontrolador Propeller, el lenguaje ensamblador Propeller y el intérprete Spin fueron diseñados por el cofundador y presidente de Parallax, Chip Gracey. El lenguaje de programación Spin y el entorno de desarrollo integrado (IDE) Propeller Tool fueron diseñados por Chip Gracey y el ingeniero de software de Parallax, Jeff Martin.

El 6 de agosto de 2014, Parallax Inc. lanzó todo el hardware y las herramientas del Propeller 1 P8X32A como hardware y software de código abierto bajo la Licencia Pública General GNU (GPL) 3.0. Esto incluía el código Verilog , los archivos de lenguaje de descripción de hardware (HDL) de nivel superior , el intérprete Spin, las herramientas de programación PropellerIDE y SimpleIDE y los compiladores. [3]

En 2020, se lanzó Propeller 2 (P2X8C4M64P).

Arquitectura multi-núcleo

Cada uno de los ocho núcleos de 32 bits (denominados cog ) tiene una unidad central de procesamiento (CPU) que tiene acceso a 512 palabras de 32 bits (2  KB ) de instrucciones y datos. El código automodificable es posible y se utiliza internamente, por ejemplo, cuando el cargador de arranque se sobrescribe a sí mismo con el intérprete de Spin. Las subrutinas en Spin (código de alto nivel basado en objetos) utilizan un mecanismo de retorno de llamada que requiere el uso de una pila de llamadas . El código ensamblador (PASM, de bajo nivel) no necesita una pila de llamadas. El acceso a la memoria compartida ( memoria de acceso aleatorio (RAM) de 32 KB; memoria de solo lectura (ROM) de 32 KB) se controla mediante una programación por turnos mediante un controlador de bus de computadora interno denominado concentrador . Cada cog también tiene acceso a dos contadores de hardware dedicados y un generador de video especial para su uso en la generación de señales de temporización para PAL , NTSC , VGA , control de servomecanismo y otros. [4]

Gestión de velocidad y potencia

El Propeller se puede controlar mediante un oscilador interno en chip (que proporciona un recuento total de piezas menor, pero sacrifica algo de precisión y estabilidad térmica ) o un oscilador de cristal externo o un resonador cerámico (que proporciona una velocidad máxima más alta con mayor precisión a un costo total más alto). Solo el oscilador externo se puede ejecutar a través de un multiplicador de reloj de bucle de enganche de fase (PLL) en chip , que se puede configurar en 1x, 2x, 4x, 8x o 16x.

Tanto la frecuencia del oscilador incorporado (si se utiliza) como el valor del multiplicador PLL se pueden cambiar en tiempo de ejecución. Si se utiliza correctamente, esto puede mejorar la eficiencia energética; por ejemplo, el multiplicador PLL se puede reducir antes de una larga espera sin operación necesaria para fines de sincronización, y luego aumentar después, lo que hace que el procesador use menos energía. Sin embargo, la utilidad de esta técnica se limita a situaciones en las que ningún otro engranaje está ejecutando código dependiente de la sincronización (o está cuidadosamente diseñado para hacer frente al cambio), ya que la frecuencia de reloj efectiva es común a todos los engranajes.

La frecuencia de reloj efectiva varía de 32 kHz a 80 MHz (los valores exactos disponibles para el control dinámico dependen de la configuración utilizada, como se describió anteriormente). Cuando se ejecuta a 80 MHz, el lenguaje de programación interpretado propietario Spin ejecuta aproximadamente 80 000 tokens de instrucciones por segundo en cada núcleo, lo que da 8 veces 80 000 para 640 000 instrucciones de alto nivel por segundo. La mayoría de las instrucciones en lenguaje de máquina tardan 4 ciclos de reloj en ejecutarse, lo que da como resultado 20 millones de instrucciones por segundo (MIPS) por cog, o 160 MIPS en total para un Propeller de 8 cogs.

El consumo de energía se puede reducir bajando la frecuencia de reloj a lo necesario, apagando los engranajes innecesarios (que entonces consumen poca energía) y reconfigurando los pines de E/S que no son necesarios o que se pueden colocar de forma segura en un estado de alta impedancia ( tristated ) como entradas. Los pines se pueden reconfigurar dinámicamente, pero nuevamente, el cambio se aplica a todos los engranajes, por lo que la sincronización es importante para ciertos diseños. Hay cierta protección disponible para situaciones en las que un núcleo intenta usar un pin como salida mientras que otro intenta usarlo como entrada; esto se explica en el manual de referencia técnica de Parallax.

Periféricos integrados

Cada cog tiene acceso a un hardware contador-temporizador dedicado y a un generador de señales de temporización especial destinado a simplificar el diseño de las etapas de salida de vídeo, como pantallas compuestas PAL o NTSC (incluida la modulación para transmisión) y monitores de matriz de gráficos de vídeo (VGA). De este modo, Parallax pone a disposición un código de muestra que puede generar señales de vídeo (texto y gráficos de baja resolución) utilizando un número mínimo de piezas que consiste en el Propeller, un oscilador de cristal y algunas resistencias para formar un convertidor digital a analógico (DAC) rudimentario. La frecuencia del oscilador es importante, ya que la capacidad de corrección del hardware de temporización de vídeo está limitada a la frecuencia del reloj. Es posible utilizar varios cogs en paralelo para generar una única señal de vídeo. De forma más general, el hardware de temporización se puede utilizar para implementar varias señales de temporización de modulación por ancho de pulso (PWM).

Extensiones de ROM

Además del intérprete Spin y un cargador de arranque , la ROM incorporada proporciona algunos datos que pueden ser útiles para ciertas aplicaciones de sonido, vídeo o matemáticas :

Las extensiones matemáticas tienen como objetivo compensar la falta de una unidad de punto flotante y operaciones más primitivas, como la multiplicación y la división (esto está enmascarado en Spin, pero es un límite para las rutinas de lenguaje ensamblador ). Sin embargo, Propeller es un procesador de 32 bits y estas tablas pueden tener una precisión insuficiente para usos de mayor precisión.

Intérprete de bytecode de Spin incorporado

Spin es un lenguaje de programación informática multitarea de alto nivel creado por Chip Gracey de Parallax , quien también diseñó el microcontrolador Propeller en el que se ejecuta, para su línea de microcontroladores Propeller. [5]

El código Spin se escribe en la herramienta Propeller, una plataforma de desarrollo de software orientada a GUI escrita para Windows XP. [6] Este compilador convierte el código Spin en códigos de bytes que se pueden cargar (con la misma herramienta) en la RAM principal de 32 KB y, opcionalmente, en la memoria de solo lectura programable y borrable eléctricamente ( EEPROM ) de arranque I²C del chip Propeller. Después de arrancar el Propeller, se copia un intérprete de código de bytes de la ROM integrada en la RAM de 2 KB del COG primario. Este COG comenzará entonces a interpretar los códigos de bytes en la RAM principal de 32 KB. Se puede ejecutar más de una copia del intérprete de código de bytes en otros COG, por lo que varios subprocesos de código Spin pueden ejecutarse simultáneamente. Dentro de un programa de código Spin, se pueden insertar en línea programas de código ensamblador . Estos programas ensambladores se ejecutarán entonces en sus propios COG.

Al igual que Python , Spin utiliza espacios en blanco de sangría, en lugar de llaves o palabras clave , para delimitar bloques .

El intérprete de Propeller para su lenguaje informático multiproceso patentado Spin es un intérprete de bytecode . Este intérprete decodifica cadenas de instrucciones, una instrucción por byte , a partir del código de usuario que se ha editado, compilado y cargado en Propeller desde un entorno de desarrollo integrado (IDE) específico para ese propósito. Este IDE, al que Parallax llama la herramienta Propeller , está pensado para su uso en un sistema operativo Microsoft Windows .

El lenguaje Spin es un lenguaje de programación de alto nivel . Debido a que se interpreta en software, se ejecuta más lento que el ensamblaje Propeller puro, pero puede ser más eficiente en términos de espacio: los códigos de operación del ensamblaje Propeller tienen una longitud de 32 bits; las directivas Spin tienen una longitud de 8 bits, que pueden ir seguidas de una cantidad de bytes de 8 bits para especificar cómo opera esa directiva. Spin también permite evitar problemas significativos de segmentación de memoria que deben considerarse para el código ensamblador.

Al iniciar, se copiará una copia del intérprete de bytecode (de menos de 2 KB de tamaño) en la RAM dedicada de un cog y luego comenzará a interpretar el bytecode en la RAM principal de 32 KB. Se pueden iniciar cogs adicionales desde ese punto, cargando una copia separada del intérprete en la RAM dedicada del nuevo cog (un total de ocho subprocesos de intérprete pueden, por lo tanto, ejecutarse simultáneamente). En particular, esto significa que al menos una cantidad mínima de código de inicio debe ser código Spin, para todas las aplicaciones Propeller.

Sintaxis

La sintaxis de Spin se puede dividir en bloques, que contienen:

Palabras clave de ejemplo

Programa de ejemplo

Un programa de ejemplo (tal como aparecería en el editor de la herramienta Propeller ) que emite el contador del sistema actual cada 3.000.000 de ciclos y luego es apagado por otro engranaje después de 40.000.000 de ciclos:

Parallax Propeller está acumulando gradualmente bibliotecas de software que le otorgan capacidades similares a las del antiguo producto BASIC Stamp de Parallax ; sin embargo, no existe una lista uniforme de qué instalaciones PBASIC tienen ahora equivalentes Spin.

Se ha dicho en tono de broma que "si dos lenguajes se encontraran en un bar –Fortran y BASIC– nueve meses después uno de ellos encontraría Spin". Esto se refiere al formato de espacios en blanco de FORTRAN y al funcionamiento basado en palabras clave de BASIC.

Paquete y E/S

La versión inicial del chip (denominada P8X32A) proporciona un puerto de 32 bits en un paquete de tecnología de montaje superficial de 40 pines de 0,6 pulgadas con encapsulado dual en línea (DIP), 44 pines LQFP o encapsulado Quad Flat No-leads (QFN) . De los 40 pines disponibles, 32 se utilizan para E/S, cuatro para pines de alimentación y tierra, dos para un cristal externo (si se utiliza), uno para habilitar la detección de cortes de energía y caídas de voltaje, y uno para reinicio.

Los ocho núcleos pueden acceder al puerto de 32 bits (designado "A"; actualmente no hay "B") simultáneamente. Se utiliza un mecanismo de control especial para evitar conflictos de E/S si un núcleo intenta utilizar un pin de E/S como salida mientras que otro intenta utilizarlo como entrada. Cualquiera de estos pines se puede utilizar para las técnicas de salida de modulación por ancho de pulso o temporización descritas anteriormente.

Parallax ha declarado que espera que las versiones posteriores de Propeller ofrezcan más pines de E/S y/o más memoria. [7]

Dispositivos de E/S virtuales

Captura de pantalla de la demostración de gráficos que Parallax creó para demostrar la biblioteca de videos NTSC

Los diseñadores del Propeller lo diseñaron en torno al concepto de "dispositivos de E/S virtuales". Por ejemplo, el kit de desarrollo de juegos HYDRA (un sistema informático diseñado para aficionados que quieren aprender a desarrollar videojuegos de estilo retro) utiliza el generador de caracteres integrado y la lógica de soporte de vídeo para generar una unidad de procesamiento de gráficos virtual (un generador que genera imágenes en color VGA, imágenes en color compatibles con PAL/NTSC o vídeo y audio RF transmitidos por software. [8]

La captura de pantalla que se muestra aquí se realizó utilizando un controlador de pantalla virtual de software que envía los datos de píxeles a través de un enlace en serie a una PC. [9]

Hay bibliotecas de software disponibles para implementar varios dispositivos de E/S que van desde UART simples e interfaces de E/S seriales como SPI, I²C e interfaces de teclado y mouse seriales compatibles con PS/2, controladores de motor para sistemas robóticos, interfaces MIDI y controladores LCD. [10]

Núcleos dedicados en lugar de interrupciones

La filosofía de diseño de Propeller es que una arquitectura multinúcleo en tiempo real estricta elimina la necesidad de hardware de interrupción dedicado y soporte en ensamblaje. En la arquitectura de CPU tradicional, las líneas de interrupción externas se envían a un controlador de interrupción en chip y son atendidas por una o más rutinas de servicio de interrupción . Cuando se produce una interrupción, el controlador de interrupción suspende el procesamiento normal de la CPU y guarda el estado interno (normalmente en la pila), luego se vectoriza a la rutina de servicio de interrupción designada. Después de manejar la interrupción, la rutina de servicio ejecuta una instrucción de retorno de interrupción que restaura el estado interno y reanuda el procesamiento de la CPU.

Para manejar una señal externa rápidamente en el Propeller, cualquiera de las 32 líneas de E/S se configura como una entrada. Luego, se configura un cog para esperar una transición (ya sea un flanco positivo o negativo) en esa entrada utilizando uno de los dos circuitos contadores disponibles para cada cog. Mientras espera la señal, el cog funciona en modo de bajo consumo, esencialmente durmiendo. Extendiendo esta técnica, se puede configurar un Propeller para que responda a ocho líneas de interrupción independientes con un retraso de manejo esencialmente cero. Alternativamente, se puede utilizar una línea para señalar la interrupción y luego se pueden leer líneas de entrada adicionales para determinar la naturaleza del evento. El código que se ejecuta en los otros núcleos no se ve afectado por el cog de manejo de interrupciones. A diferencia de una arquitectura de interrupción de un solo procesador multitarea tradicional, el tiempo de respuesta de la señal sigue siendo predecible [ 11] y, de hecho, usar el término interrupción en este contexto puede causar confusión, ya que esta función se puede considerar más apropiadamente como un sondeo con un tiempo de bucle cero.

Mecanismo de arranque

Al encenderse, detectar una caída de tensión , reiniciar el software o reiniciar el hardware externo, Propeller cargará una rutina de arranque de código de máquina desde la ROM interna a la RAM de su primer engranaje (principal) y la ejecutará. Este código emula una interfaz I²C en software, utilizando temporalmente dos pines de E/S para las señales de reloj y datos en serie necesarias para cargar el código de usuario desde una EEPROM I²C externa .

Simultáneamente, emula un puerto serie , utilizando otros dos pines de E/S que pueden utilizarse para cargar software directamente a la RAM (y opcionalmente a la EEPROM externa). Si el Propeller no ve comandos desde el puerto serie, carga el programa de usuario (cuyo código de entrada debe estar escrito en Spin, como se describió anteriormente) desde la EEPROM serie a la RAM principal de 32 KB. Después de eso, carga el intérprete Spin desde su ROM incorporada a la RAM dedicada de su primer cog, sobrescribiendo la mayor parte del gestor de arranque.

Independientemente de cómo se cargue el programa de usuario, la ejecución comienza interpretando el código de bytes inicial del usuario con el intérprete de Spin ejecutándose en el engranaje principal. Después de que se ejecuta este código de Spin inicial, la aplicación puede activar cualquier engranaje no utilizado para iniciar un nuevo hilo y/o iniciar rutinas de lenguaje ensamblador .

Memoria persistente externa

El Propeller arranca desde una EEPROM serial externa ; una vez que se completa la secuencia de arranque, se puede acceder a este dispositivo como un periférico externo. [12]

Otras implementaciones de lenguaje

Además de Spin y el ensamblador de bajo nivel de Propeller, se han portado varios otros lenguajes.

Compilador C

Parallax es compatible con Propeller-GCC, que es un puerto del compilador GNU Compiler Collection (GCC) para los lenguajes de programación C y C++ , para Propeller [13] (rama release_1_0). El compilador C y la biblioteca C son compatibles con ANSI C. El compilador C++ es compatible con ANSI-C99. Se admite C++ completo con memoria externa. El programa SimpleIDE [14] proporciona a los usuarios una forma sencilla de escribir programas sin necesidad de archivos make . En 2013, Parallax incorporó Propeller-GCC y Simple Libraries en la serie de tutoriales Propeller-C Learn. [15] Propeller-GCC se mantiene activamente. Propeller-GCC y SimpleIDE son productos de software de Parallax con soporte oficial.

El compilador ImageCraft ICCV7 para Propeller C ha sido marcado como final de vida útil. [16]

Hay disponible un compilador ANSI C gratuito llamado Catalina. [17] Está basado en LCC . Catalina recibe mantenimiento activo.

Compilador BASIC

PropBASIC es un lenguaje de programación BASIC para el microcontrolador Parallax Propeller. [18] PropBASIC requiere Brad's Spin Tool (BST), un conjunto de herramientas multiplataforma para desarrollar con Parallax Propeller. A partir de agosto de 2015, BST se ejecuta en i386-linux-gtk2, PowerPC-darwin ( Mac OS X 10.4 a 10.6), i386-darwin (Mac OS X 10.4 a 10.6) e i386-Win32 ( Windows 95 a Windows 7 ).

Adelante con la hélice

Hay al menos seis versiones diferentes de Forth , tanto comerciales como de código abierto , disponibles para Propeller.

PropForth

Una versión gratuita que disfruta de un amplio desarrollo y apoyo de la comunidad es PropForth. [19] Está adaptada a la arquitectura prop y necesariamente se desvía de cualquier estándar general respecto de la singularidad arquitectónica, en consonancia con el concepto de Forth.

Además del intérprete Forth, PropForth ofrece muchas funciones que aprovechan las capacidades del chip. La E/S vinculada se refiere al método de asociar un flujo con un proceso, lo que permite que un proceso se vincule con el siguiente sobre la marcha, de forma transparente para la aplicación. Esto puede reducir o eliminar la necesidad de una interfaz de depuración de hardware o JTAG en muchos casos. La comunicación serial sincrónica multicanal (MCS) se refiere a la comunicación serial sincrónica entre chips prop. Los paquetes de 96 bits se envían continuamente entre dos cogs, el resultado es que las aplicaciones ven recursos adicionales (+6 cogs por cada chip prop añadido) con poco o ningún impacto en el rendimiento de una aplicación bien construida.

LogicAnalyzer hace referencia a un paquete de extensión que implementa un analizador lógico de software. EEPROMfilesystem y SDfilesystem son extensiones que implementan un almacenamiento rudimentario mediante EEPROM y flash SD.

PagedAssembler hace referencia al paquete de optimizaciones que permite que las rutinas de ensamblador se puedan intercambiar (y sobrescribir) sobre la marcha, lo que permite un tamaño de aplicación prácticamente ilimitado. La ejecución de scripts permite cargar extensiones sobre la marcha, lo que permite que el código fuente del programa tenga un tamaño que puede alcanzar el medio de almacenamiento.

Propeller y Java

Se están realizando esfuerzos para ejecutar la máquina virtual Java (JVM) en Propeller. Se están desarrollando un compilador, un depurador y un emulador. [20]

Compilador y entorno de ejecución de Pascal

Un gran subconjunto de Pascal se implementa mediante un compilador e intérprete basado en el sistema de máquina de código p P4. [21]

Programación gráfica

Captura de pantalla del editor de escalera PICoPLC

El controlador lógico programable PICo (PLC, PICoPLC) admite la salida al procesador Propeller. El programa se crea en un editor de lógica de escalera GUI y el código resultante se emite como fuente Spin. PICoPLC también admite P8X32 con la función de creación-simulación-ejecución. No hay restricciones en el hardware de destino, ya que la frecuencia del oscilador y los pines de E/S se pueden configurar libremente en el editor de escalera. Sitio web para desarrolladores de PICoPLC ([1]).

Versiones futuras

A partir de 2014 , Parallax está construyendo un nuevo Propeller [22] con engranajes que funcionarán cada uno a unos 200 MIPS, mientras que los engranajes del Propeller actual funcionan cada uno a unos 20 MIPS. El rendimiento mejorado resultaría de un aumento máximo de la velocidad de reloj a 200 MHz (desde 80 MHz) y una arquitectura que canaliza las instrucciones, ejecutando un promedio de casi una instrucción por ciclo de reloj (aproximadamente un aumento de diez veces). [7]

Referencias

  1. ^ Torrone, Phillip (18 de febrero de 2006). "Primer vistazo al chip Propeller de Parallax". Blog Make . Archivado desde el original el 25 de junio de 2008.
  2. ^ Torrone, Phillip (21 de agosto de 2006). "Parallax Propeller (revisión)". Make .
  3. ^ Gracey, Ken (2014). "Propeller 1 de código abierto". Parallax Inc. Parallax Inc. Consultado el 23 de enero de 2021. El Propeller 1 (P8X32A) es ahora un microcontrolador multinúcleo 100% abierto, que incluye todo el hardware y las herramientas... El Propeller 1 puede ser el chip más abierto de su clase.
  4. ^ Wong, William G. (15 de diciembre de 2022). "EiED Online>> Hélice de paralaje".
  5. ^ Scanlan, David A.; Hebel, Martin A. (octubre de 2007). "Programación del chip Propeller de ocho núcleos". Revista de Ciencias de la Computación en la Universidad . 23 (1): 162–168.
  6. ^ "Herramienta Propeller". Wiki de Propeller en Wikispaces . Archivado desde el original el 1 de octubre de 2008.
  7. ^ ab "Mensaje de Parallax Forums". Foros de Parallax .[ enlace muerto permanente ]
  8. ^ "Placa de circuito impreso de aplicación de video Propeller". Soluciones SelmaWare . Archivado desde el original el 21 de diciembre de 2008.; una placa generadora de video dedicada con una hélice
  9. ^ "Publicación en los foros de Parallax sobre software de captura de pantalla". Foros de Parallax . Archivado desde el original el 9 de julio de 2012.
  10. ^ p1 en GitHub ; Biblioteca de software de intercambio de objetos Propeller
  11. ^ "Interrupciones". Wiki de Propeller en Wikispaces . Archivado desde el original el 21 de septiembre de 2010.
  12. ^ Cantrell, Tom (agosto de 2006). "Girando el núcleo". Circuit Cellar . N.º 193. pág. 80. Archivado desde el original el 28 de junio de 2007.
  13. ^ "PropGCC en Google Code".
  14. ^ "Propeller C - Configurar SimpleIDE". learn.parallax.com .
  15. ^ "Hélice C". learn.parllax.com .
  16. ^ "ICCV7 para hélices (no comerciales): fin de vida útil". Parallax Inc. Archivado desde el original el 18 de septiembre de 2011.
  17. ^ "Catalina - un compilador C GRATUITO para Propeller - ¡La última frontera!". Foros de Parallax . Archivado desde el original el 31 de julio de 2012.
  18. ^ "Descarga PropBASIC aquí... 00.01.14 ÚLTIMA VERSIÓN PARA BST". Foros Parallax . 23 de diciembre de 2009.
  19. ^ "propforth". code.google.com .
  20. ^ "Programación en Java". Wiki de Propeller en Wikispaces . Archivado desde el original el 4 de octubre de 2008.
  21. ^ "Programación en Pascal". Wiki de Propeller en Wikispaces . Archivado desde el original el 4 de octubre de 2008.
  22. ^ "Propeller 2". Parallax Inc. 23 de julio de 2020.

Enlaces externos