
El Parallax P8X32A Propeller es un microcontrolador con arquitectura de computadora paralela de procesador multinúcleo que cuenta con ocho núcleos de unidad central de procesamiento (CPU) de 32 bits con conjunto reducido de instrucciones (RISC) . [ 1 ] [ 2 ] Presentado en 2006, es diseñado y comercializado por Parallax, Inc.
El microcontrolador Propeller, el lenguaje ensamblador Propeller y el intérprete Spin fueron diseñados por Chip Gracey, cofundador y presidente de Parallax. El lenguaje de programación Spin y el entorno de desarrollo integrado (IDE) Propeller Tool fueron diseñados por Chip Gracey y Jeff Martin, ingeniero de software de Parallax.
El 6 de agosto de 2014, Parallax Inc. publicó 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 y compiladores PropellerIDE y SimpleIDE. [ 3 ]
En 2020 se lanzó el Parallax Propeller 2 (P2X8C4M64P).
Arquitectura multinú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 largas de 32 bits (2 KB ) de instrucciones y datos. Es posible el código automodificable , que se utiliza internamente, por ejemplo, cuando el cargador de arranque se sobrescribe a sí mismo con el intérprete Spin. Las subrutinas en Spin (código de alto nivel basado en objetos) utilizan un mecanismo de llamada-retorno que requiere el uso de una pila de llamadas . El código ensamblador (PASM, de bajo nivel) no necesita pila de llamadas. El acceso a la memoria compartida (32 KB de memoria de acceso aleatorio (RAM); 32 KB de memoria de solo lectura (ROM)) se controla mediante planificación round-robin por un controlador de bus interno de la computadora denominado hub . Cada cog también tiene acceso a dos contadores de hardware dedicados y un generador de vídeo especial para generar señales de temporización para PAL , NTSC , VGA , control de servomecanismos y otros. [ 4 ]
Gestión de velocidad y potencia
El Propeller puede funcionar mediante un oscilador interno integrado en el chip (lo que reduce el número total de componentes, pero sacrifica algo de precisión y estabilidad térmica ) o mediante un oscilador de cristal externo o un resonador cerámico (que ofrece una mayor velocidad máxima con mayor precisión, pero a un coste total más elevado). Solo el oscilador externo puede conectarse a un multiplicador de reloj de bucle de enganche de fase (PLL) integrado en el chip , que puede configurarse a 1x, 2x, 4x, 8x o 16x.
Tanto la frecuencia del oscilador integrado (si se utiliza) como el valor del multiplicador del PLL pueden modificarse durante la ejecución. Si se utiliza correctamente, esto puede mejorar la eficiencia energética; por ejemplo, el multiplicador del PLL puede disminuirse antes de un período prolongado de inactividad necesario para la sincronización, y luego aumentarse, lo que reduce el consumo de energía del procesador. Sin embargo, la utilidad de esta técnica se limita a situaciones en las que ningún otro núcleo ejecuta código dependiente de la sincronización (o está diseñado específicamente para gestionar el cambio), ya que la frecuencia de reloj efectiva es común a todos los núcleos.
La frecuencia de reloj efectiva oscila entre 32 kHz y 80 MHz (los valores exactos disponibles para el control dinámico dependen de la configuración utilizada, como se describió anteriormente). Al funcionar a 80 MHz, el lenguaje de programación Spin, de propiedad exclusiva , ejecuta aproximadamente 80 000 tokens de instrucción por segundo en cada núcleo, lo que da como resultado 8 veces 80 000, es decir, 640 000 instrucciones de alto nivel por segundo. La mayoría de las instrucciones en lenguaje máquina tardan 4 ciclos de reloj en ejecutarse, lo que resulta en 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 disminuyendo la frecuencia del reloj a la necesaria, desactivando los núcleos innecesarios (que consumen poca energía) y reconfigurando los pines de E/S que no se utilizan o que pueden colocarse de forma segura en un estado de alta impedancia ( triestado ) como entradas. Los pines se pueden reconfigurar dinámicamente, pero, de nuevo, el cambio afecta a todos los núcleos, por lo que la sincronización es importante para ciertos diseños. Existe cierta protección para situaciones en las que un núcleo intenta usar un pin como salida mientras otro intenta usarlo como entrada; esto se explica en el manual de referencia técnica de Parallax.
Periféricos integrados
Cada módulo tiene acceso a un hardware de contador-temporizador dedicado y a un generador de señal de temporización especial diseñado para simplificar el diseño de las etapas de salida de vídeo, como las pantallas compuestas PAL o NTSC (incluida la modulación para difusión) y los monitores Video Graphics Array (VGA). Parallax proporciona código de ejemplo que puede generar señales de vídeo (texto y gráficos de resolución relativamente baja) con un mínimo de componentes: el Propeller, un oscilador de cristal y algunas resistencias que forman un convertidor digital-analógico (DAC) básico. La frecuencia del oscilador es importante, ya que la capacidad de corrección del hardware de temporización de vídeo está limitada por la frecuencia del reloj. Es posible utilizar varios módulos en paralelo para generar una única señal de vídeo. En general, el hardware de temporización puede utilizarse para implementar diversas señales de temporización de modulación por ancho de pulso (PWM).
extensiones de ROM
Además del intérprete Spin y un gestor de arranque , la ROM integrada proporciona algunos datos que pueden ser útiles para ciertas aplicaciones de sonido, vídeo o matemáticas :
- Se proporciona una fuente de mapa de bits , adecuada para aplicaciones típicas de generación de caracteres (pero no personalizable);
- una tabla de logaritmos (base 2, 2048 entradas);
- una tabla antilogaritmo (base 2, 2048 entradas); y
- una tabla de senos (16 bits, 2049 entradas que representan el primer cuadrante, ángulos de 0 a π/2; los otros tres cuadrantes se crean a partir de la misma tabla).
Las extensiones matemáticas están diseñadas para compensar la falta de una unidad de coma flotante y otras operaciones básicas que faltan, como la multiplicación y la división (esto se oculta en Spin, pero es una limitación para las rutinas en lenguaje ensamblador ). Sin embargo, el procesador Propeller es de 32 bits, y estas tablas podrían no tener la precisión suficiente para usos de alta precisión.
Intérprete de código de bytes Spin integrado
Spin es un lenguaje de programación de alto nivel multitarea 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 Propeller Tool, una plataforma de desarrollo de software con interfaz gráfica de usuario (GUI) escrita para Windows XP. [ 6 ] Este compilador convierte el código Spin en bytecodes que se pueden cargar (con la misma herramienta) en la RAM principal de 32 KB y, opcionalmente, en la memoria EEPROM ( memoria de solo lectura programable y borrable eléctricamente ) de arranque I²C del chip Propeller. Después de arrancar el Propeller, se copia un intérprete de bytecode desde la ROM integrada a la RAM de 2 KB del COG principal. Este COG comenzará entonces a interpretar los bytecodes en la RAM principal de 32 KB. Se puede ejecutar más de una copia del intérprete de bytecode en otros COG, por lo que varios hilos de código Spin pueden ejecutarse simultáneamente. Dentro de un programa de código Spin, se pueden insertar 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 indentación, en lugar de llaves o palabras clave , para delimitar bloques .
El intérprete de Propeller para su lenguaje de programación multihilo propietario 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 ha sido editado, compilado y cargado en Propeller desde un entorno de desarrollo integrado (IDE) específico . Este IDE, que Parallax denomina herramienta Propeller , está diseñado para usarse bajo el sistema operativo Microsoft Windows .
El lenguaje Spin es un lenguaje de programación de alto nivel . Debido a que se interpreta mediante software, su ejecución es más lenta que la del lenguaje ensamblador Propeller puro, pero puede ser más eficiente en cuanto al uso de espacio: los códigos de operación del ensamblador Propeller tienen una longitud de 32 bits; las directivas de Spin tienen una longitud de 8 bits, a las que pueden seguir varios bytes de 8 bits para especificar cómo funciona dicha directiva.
Al iniciar, una copia del intérprete de bytecode (de menos de 2 KB) se copia en la RAM dedicada de un cog y comienza a interpretar el bytecode en la RAM principal de 32 KB. A partir de ese momento, se pueden iniciar cogs adicionales, cargando una copia independiente del intérprete en la RAM dedicada del nuevo cog (de esta forma, se pueden ejecutar simultáneamente hasta ocho hilos de intérprete). Cabe destacar que esto implica que, para todas las aplicaciones Propeller, al menos una cantidad mínima de código de inicio debe ser código Spin.
Sintaxis
La sintaxis de Spin se puede dividir en bloques, que contienen:
- VAR – variables globales
- CON – constantes del programa
- PUB – código para una subrutina pública
- PRI – código para una subrutina privada
- OBJ – código para objetos
- DAT : datos predefinidos, reservas de memoria y código ensamblador
Palabras clave de ejemplo
- reiniciar: provoca que el microcontrolador se reinicie.
- waitcnt: espera a que el contador del sistema sea igual o superior a un valor especificado.
- waitvid: espera un evento de temporización (de vídeo) antes de enviar datos (de vídeo) a los pines de E/S.
- coginit: inicia un procesador en una nueva tarea
Programa de ejemplo
Un programa de ejemplo (tal como aparecería en el editor de Propeller Tool ) 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:

Paquete y E/S
La versión inicial del chip (denominada P8X32A) proporciona un puerto de 32 bits en un encapsulado DIP ( Dual In-line Package ) de 40 pines y 0,6 pulgadas, un LQFP (Lyth-Quad Flat No-leads Package) de 44 pines o un QFN ( Quad Flat No-leads Package ) de montaje superficial . De los 40 pines disponibles, 32 se utilizan para E/S, cuatro para 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 tensión, y uno para el reinicio.
Los ocho núcleos pueden acceder simultáneamente al puerto de 32 bits (denominado "A"; actualmente no existe el puerto "B"). Se utiliza un mecanismo de control especial para evitar conflictos de E/S si un núcleo intenta usar un pin de E/S como salida mientras otro intenta usarlo como entrada. Cualquiera de estos pines puede utilizarse para las técnicas de salida de temporización o modulación por ancho de pulso descritas anteriormente.
Parallax ha declarado que espera que las versiones posteriores del Propeller ofrezcan más pines de E/S y/o más memoria. [ 7 ]
Dispositivos de E/S virtuales

Los diseñadores de Propeller lo concibieron 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, para 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 gráfico virtual (GPU) que produce imágenes en color VGA, imágenes en color compatibles con PAL/NTSC o vídeo y audio RF de difusión mediante 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 serie a un PC. [ 9 ]
Existen bibliotecas de software para implementar diversos dispositivos de E/S, desde simples UART e interfaces de E/S serie como SPI, I²C e interfaces de ratón y teclado serie 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 del Propeller se basa en que una arquitectura multinúcleo de tiempo real estricto elimina la necesidad de hardware de interrupción dedicado y su soporte en lenguaje ensamblador. En la arquitectura de CPU tradicional, las líneas de interrupción externas se envían a un controlador de interrupciones integrado y son atendidas por una o más rutinas de servicio de interrupción . Cuando se produce una interrupción, el controlador de interrupciones suspende el procesamiento normal de la CPU y guarda el estado interno (normalmente en la pila), para luego redirigir la interrupción a la rutina de servicio designada. Tras gestionar 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 gestionar rápidamente una señal externa en el Propeller, cualquiera de las 32 líneas de E/S se configura como entrada. Un cog se configura entonces para esperar una transición (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 opera en modo de bajo consumo, esencialmente en reposo. Ampliando esta técnica, un Propeller puede configurarse para responder a ocho líneas de interrupción independientes con un retardo de gestión prácticamente nulo. Alternativamente, se puede usar una línea para señalizar 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 gestión de interrupciones. A diferencia de una arquitectura de interrupción de un solo procesador multitarea tradicional, el tiempo de respuesta de la señal permanece predecible , [ 11 ] y de hecho, usar el término interrupción en este contexto puede causar confusión, ya que esta función puede entenderse mejor como un sondeo con un tiempo de bucle cero.
Mecanismo de arranque
Al encenderse, detectar una caída de tensión , reiniciarse por software o reiniciarse por hardware externo, el Propeller cargará una rutina de arranque en código máquina desde la ROM interna a la RAM de su primer (principal) cog 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 seriales 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 permiten cargar software directamente en la RAM (y opcionalmente en la EEPROM externa). Si el Propeller no recibe comandos del 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. A continuación, carga el intérprete de Spin desde su ROM integrada a la RAM dedicada de su primer núcleo, 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 Spin ejecutándose en el núcleo principal. Una vez ejecutado este código inicial de Spin, la aplicación puede activar cualquier núcleo no utilizado para iniciar un nuevo hilo o ejecutar rutinas en lenguaje ensamblador .
memoria persistente externa
El Propeller arranca desde una EEPROM serial externa ; una vez completada 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 adaptado a él otros lenguajes de programación.
Compilador de C
Parallax es compatible con Propeller-GCC, una adaptación 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 cumplen con el estándar ANSI C. El compilador C++ cumple con el estándar 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 makefiles . En 2013, Parallax incorporó Propeller-GCC y Simple Libraries a 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 de fin de vida útil. [ 16 ]
Existe 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 el desarrollo 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!
Existen al menos seis versiones diferentes de Forth , tanto software comercial como de código abierto , disponibles para el Propeller.
PropForth
Una versión gratuita que cuenta con un amplio desarrollo y apoyo de la comunidad es PropForth. [ 19 ] Está adaptado a la arquitectura de utilería y, necesariamente, se desvía de cualquier estándar general con respecto a la singularidad arquitectónica, de acuerdo con el concepto de Forth.
Más allá del intérprete Forth, PropForth ofrece numerosas funciones que aprovechan las capacidades del chip. La E/S enlazada se refiere al método de asociar un flujo con un proceso, permitiendo que un proceso se enlace 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 serie síncrona multicanal (MCS) se refiere a la comunicación serie síncrona entre chips PropForth. Se envían paquetes de 96 bits de forma continua entre dos núcleos, lo que permite que las aplicaciones vean recursos adicionales (+6 núcleos por cada chip PropForth añadido) con poco o ningún impacto en el rendimiento para una aplicación bien diseñada.
LogicAnalyzer se refiere a un paquete de extensión que implementa un analizador lógico por software. EEPROMfilesystem y SDfilesystem son extensiones que implementan almacenamiento rudimentario mediante memorias EEPROM y SD flash.
PagedAssembler se refiere al conjunto de optimizaciones que permiten intercambiar rutinas de ensamblador (sobrescribiéndolas) sobre la marcha, lo que posibilita 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 ocupe hasta el tamaño del medio de almacenamiento.
Hélice y Java
Se están realizando esfuerzos para ejecutar la máquina virtual de 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 subconjunto importante de Pascal está implementado por un compilador e intérprete basado en el sistema de máquina de código P4. [ 21 ]
Programación gráfica

El controlador lógico programable (PLC, PICoPLC) de PICo 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 crear-simular-ejecutar. No hay restricciones en el hardware de destino, ya que la frecuencia del oscilador y los pines de E/S son libremente configurables en el editor de lógica de escalera. Sitio web del desarrollador de PICoPLC (Archivado el 18 de agosto de 2019 en Wayback Machine ).
Versiones futuras
A partir de 2014Parallax está construyendo un nuevo Propeller [ 22 ] con núcleos que funcionarán a unos 200 MIPS cada uno, mientras que los núcleos del Propeller actual funcionan a unos 20 MIPS cada uno. El rendimiento mejorado resultaría de un aumento de la velocidad de reloj máxima a 200 MHz (desde 80 MHz) y una arquitectura que segmenta las instrucciones, ejecutando un promedio de casi una instrucción por ciclo de reloj (aproximadamente un aumento de diez veces). [ 7 ]
Referencias
- ↑ Torrone, Phillip (18 de febrero de 2006). "Primer vistazo al chip Propeller de Parallax" . Blog de Make . Archivado del original el 25 de junio de 2008.
- ↑ Torrone, Phillip (21 de agosto de 2006). "Parallax Propeller (reseña)" . Make .
- ↑ Gracey, Ken (2014). "Propeller 1 Open Source" . Parallax Inc. Recuperado el 23 de enero de 2021.
El Propeller 1 (P8X32A) es ahora un microcontrolador multinúcleo 100% abierto, incluyendo todo el hardware y las herramientas... El Propeller 1 puede ser el chip más abierto de su clase.
- ↑ Wong, William G. (15 de diciembre de 2022). "EiED Online>> Parallax Propeller" .
- ↑ Scanlan, David A.; Hebel, Martin A. (octubre de 2007). "Programación del chip Propeller de ocho núcleos" . Journal of Computing Sciences in Colleges . 23 (1): 162– 168.
- ↑ "Prop Tool" . Wiki de Propeller en Wikispaces . Archivado del original el 1 de octubre de 2008.
- 1 2 "Mensaje de Parallax Forums" . Parallax Forums . Archivado del original el 24/09/2010 . Consultado el 08/08/2010 .
- ↑ "Placa de circuito impreso para aplicación de vídeo Propeller" . SelmaWare Solutions . Archivado del original el 21/12/2008.; una placa generadora de vídeo dedicada con una hélice
- ↑ "Publicación en los foros de Parallax sobre software de captura de pantalla" . Foros de Parallax .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ p1 en GitHub ; Biblioteca de software de intercambio de objetos Propeller
- ↑ "Interrupciones" . Wiki de Propeller en Wikispaces . Archivado del original el 21/09/2010.
- ↑ Cantrell, Tom (agosto de 2006). "Turning the Core-ner" . Circuit Cellar . N.° 193. pág. 80.
{{cite magazine}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ "PropGCC en Google Code" .
- ↑ "Propeller C - Configurar SimpleIDE" . learn.parallax.com . Archivado del original el 30/12/2013 . Consultado el 30/12/2013 .
- ↑ "Hélice C" . learn.parllax.com .
- ↑ "ICCV7 para hélice (no comercial) - Fin de vida útil" . Parallax Inc. Archivado del original el 18 de septiembre de 2011.
- ↑ "Catalina - un compilador C GRATUITO para Propeller - ¡La última frontera!" . Foros de Parallax .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ "Descarga PropBASIC aquí... 00.01.14 ÚLTIMA VERSIÓN PARA BST" . Foros de Parallax . 23/12/2009.
- ↑ "propforth" . code.google.com .
- ↑ "Programación en Java" . Wiki de Propeller en Wikispaces . Archivado del original el 4 de octubre de 2008.
- ↑ "Programación en Pascal" . Wiki de Propeller en Wikispaces . Archivado del original el 4 de octubre de 2008.
- ↑ "Propeller 2" . Parallax Inc. 23 de julio de 2020.
Enlaces externos
- Sitio web oficial de Parallax Inc.:
- Wiki con información detallada sobre la hélice
- Foro de hélices en Parallax Inc.:
- Sitio beta de Propeller GCC
- Artículo en EiED online
- un segundo artículo en EiED online
- Artículo publicado en ferret.com.au y archivado el 23 de febrero de 2010 en Wayback Machine.
- Lista de lenguajes de programación que se ejecutan en Propeller
- Descarga PICoPLC de APStech
- FirstSpin, un programa de audio educativo semanal sobre el lenguaje de programación Spin y el Propeller, patrocinado por Parallax. Archivado el 11 de febrero de 2012 en Wayback Machine.
- Microcontroladores
- Productos de Parallax, Inc.
- Hardware de código abierto
- Microprocesadores abiertos
