Download procesamiento paralelo
Document related concepts
no text concepts found
Transcript
aNÁLisis dE disEÑOs aNÁLisis dE disEÑOs acceso al procesamiento paralelo con Parallax Propeller La función común es un único procesador que cuenta con el soporte de especialistas, una lógica dedicada con funciones que proporciona funciones como la salida PWM y entrada continua de impulsos. El Propeller de Parallax representa un gran cambio en la filosofía del diseño. Este dispositivo contiene ocho procesadores de 32 bits o "COG" con una lógica de soporte mínima y únicamente el hardware E/S más básico (Fig.1). Una primera reacción a este diseño podría ser: "genial, puedo implementar ese proyecto de red neural con cada COG ejecutando esencialmente el mismo programa". ™ Por el dr. William Marshall, Rs components de vez en cuando surge algo verdaderamente novedoso. El desarrollo de los chips de microcontroladores ha seguido las mismas rutas durante años: o bien el mismo procesador "central" básico se ha ido rodeando de cada vez más periféricos o bien el procesador ha ido ganando más y más potencia. Cog 0 Cog 1 Cog 2 Cog 3 Cog 4 Cog 5 Cog 6 Cog 7 Dirección de los contactos Salida de contactos Reg. de salida E/S Reg. de dirección E/S Generador de vídeo Contador A + PPL Contador B + PPL Reg. de salida E/S Reg. de dirección E/S Generador de vídeo Contador A + PPL Contador B + PPL Reg. de salida E/S Reg. de dirección E/S Generador de vídeo Contador A + PPL Contador B + PPL Reg. de salida E/S Reg. de dirección E/S Generador de vídeo Contador A + PPL Contador B + PPL Reg. de salida E/S Reg. de dirección E/S Generador de vídeo Contador A + PPL Contador B + PPL Reg. de salida E/S Reg. de dirección E/S Generador de vídeo Contador A + PPL Contador B + PPL Reg. de salida E/S Reg. de dirección E/S Generador de vídeo Contador A + PPL Contador B + PPL Reg. de salida E/S Reg. de dirección E/S Generador de vídeo Contador A + PPL Contador B + PPL 32 32 P31 P15 P30 P14 P29 P13 P28 P12 P27 P11 P26 P10 P25 P9 P24 P8 Contactos E/S P23 P7 P22 P6 P21 P20 P5 P4 512 x 32 RAM 512 x 32 RAM 512 x 32 RAM 512 x 32 RAM 512 x 32 RAM 512 x 32 RAM 512 x 32 RAM 512 x 32 RAM P19 P3 P18 P2 Procesador Procesador Procesador Procesador Procesador Procesador Procesador Procesador P17 P16 P1 P0 32 32 Entradas de contactos 32 Contador del sistema 32 Bus de datos 16 Bus de dirección P3 P2 P1 P0 VDO VSS P31 P30 P29 P28 P27 VSS 44 43 42 41 40 39 38 37 36 35 34 BOEn P4 1 33 P26 P5 2 32 P25 P6 3 31 P24 P7 4 30 VDD XO VSS 5 29 BOEn 6 28 XI RESn 7 27 VSS 22 P20 21 P21 23 20 24 11 19 10 18 P9 P10 17 P22 16 25 15 9 14 26 P8 12 8 P23 12 VDD P19 P18 P17 P16 VSS VDD P15 P14 P13 P12 Restablecer retardo (~50 ms) Detector de caídas de tensión RESTABLECER Secuenciador de bus Cog 0 8192 x 32 RAM CLKSEL RESn 3 Oscilador RC 12 MHz/20 MHz SOFTRES 5 PLLENA XI OSCENA OSCMODE 2 Oscilador de cristal DC 0 80 MHz (4 - 8 MHz con reloj PLL) Reloj PLL 1x, 2x, 4x, 8x, 16x,(16x debe ser 64 - 128 MHz) Selector de reloj(MUX) Hub El cog habilita Cog 6 Bits de bloqueo (8) SOFTRES PLLENA OSCENA OSCMODE CLKSEL 2 3 Registrar configuración Cog 1 Cog 7 8192 x 32 ROM RELOJ Contador del sistema RELOJ 3 XO P11 Hub Detector de potencia (~10 ms) VDD Contador del sistema Cog 2 RAM, ROM, Configuración, Control Cog 5 Cog 3 Contactos E/S Cog 4 Interacción de concentrador y cog Fig. 1 20 eTech - NÚMERO 3 Mientras que el procesamiento paralelo puro puede ser apropiado para el Propeller, no creo que sea el principal objetivo del diseño. La idea es ofrecer al ingeniero el máximo control sobre el sistema periférico en una aplicación concreta. Todavía se tendrá un único COG ejecutando el programa principal, recopilando las tareas de bajo nivel, como la E/S serie a otro COG, cuando sea necesario. Esta es la función más fascinante de este dispositivo: la capacidad de volver a configurarse bajo el control del programa para adaptarse a los requisitos en un momento determinado y, a continuación, apagar los procesos cuando no se necesiten, tal vez volviendo a asignar los recursos del procesador a una tarea completamente distinta. El reloj del procesador también está bajo el control del programa, de modo que el consumo de energía se puede reducir si no se necesita la alta velocidad al implementar una E/S lenta como RS-232. El hardware de inicio El kit contiene una pequeña placa de ejemplo con varios conectores E/S, algunas de ellas bastante sorprendentes: la salida VGA a un monitor, la salida de TV, el teclado PS/2 y los conectores de ratón. Las salidas de vídeo se proporcionan porque el chip contiene, como parte de su ROM de recurso central, la tabla de referencias de un generador de caracteres. El único puerto E/S "convencional" es el USB derivado del chip FTDI en la placa. Por supuesto, la función UART que dirige este dispositivo se implementa completamente en el software y se ejecuta en uno de los COG. Todas las comunicaciones con el software IDE en el PC (Propeller Tool) se realizan a través del puerto USB. Existe una EEPROM serie en la placa que se comunica con el Propeller a través de un bus I2C que, como podrá adivinar, se implementa en el software ejecutado por un COG. Proporciona memoria no volátil para los programas del usuario. Estas rutinas de E/S se cargan desde la ROM del sistema al Restablecer para permitir que los programas se descarguen desde el PC o desde la EEPROM, pero se apagan antes de que el programa del usuario empiece su ejecución. Si el programa requiere estos recursos de E/S, tendrá que cargarlos y asignar COG, según sea necesario. Esto puede parecer complicado al principio pero, ¿para qué tener recursos no deseados que llenen el espacio de la memoria si no se necesitan? herramienta Propeller El IDE que viene con el kit de inicio se denomina Propeller Tool y proporciona la edición de programa, una compilación del lenguaje de alto nivel SPIN y la descarga de la placa de demostración. Se tiene la opción de programar en SPIN, lenguaje de montaje, o una combinación de ambos. Obviamente, el ensamblador produce un funcionamiento más eficaz y rápido, y existe el compromiso normal entre el desarrollo y el funcionamiento más rápido. La pantalla del editor tiene muchos colores y la asignación automática de los diferentes colores a los bloques de códigos ayuda a comprender la estructura del programa. Existen dos opciones para la descarga y la ejecución: recopilar y ejecutar en COG RAM, y recopilar y enviar a la EEPROM externa desde la que el cargador de arranque lo carga automáticamente en la RAM. Esta última es la mejor para el desarrollo, sólo con la transferencia a la memoria no volátil cuando el código funciona. Uso de la placa de demostración Para ilustrar algunas de las funciones principales de la programación Propeller, se ha ideado una tarea que implica el control de velocidad de un pequeño motor dc con PWM. Dos botones proporcionan las entradas Speed Up y Speed Down. La capacidad de transmisión de los puertos de E/S no es suficiente para el motor utilizado por lo que se construyó un circuito de medio puente desde la mitad de un chip conductor cuádruple L293D. Éste se montó en la placa de pruebas junto con dos conmutadores "Tact", resistencias elevadoras y condensadores de desconexión (véase la imagen en la página 23). Tenga en cuenta el uso de la variante D de este chip que contiene diodos de protección integrados para la conducción de cargas inductivas. Sólo los puertos 0 a 7 de los 32 posibles de Propeller están disponibles para el usuario; los otros están dedicados a los buses de EEPROM, etc. en esta placa de demostración. El Propeller es un dispositivo de +3,3 V, aunque están disponibles los suministros regulados de +3,3 V y +5 V. Por lo tanto, la lógica del L293D funciona con el suministro de +3,3 V, mientras el contacto de alimentación del motor independiente está conectado a +5 V. Una pequeña función pero muy útil es el contacto de tierra o de 0 V, que toma la pinza de cocodrilo de una sonda de osciloscopio. Programación en spin Una posible solución para que el programa accione el motor se ofrece en la Lista 1 (véase la página 22). No se presenta como una solución óptima pero ilustra alguna de las funciones clave de la programación Propeller. El objetivo es usar dos COG: uno que dirija la salida PWM con una tasa de marca/ espacio establecida por una tasa variable global, y el segundo que controle dos entradas de botones y que establezca el valor de Ratio. La frecuencia PWM es de 1 kHz. Las declaraciones CON configuran dos constantes del sistema y fijan la velocidad del reloj. El reloj es de 20 MHz, de modo que el multiplicador PLL interno está establecido en 4, dado el cristal de 5 MHz suministrado con la placa. A continuación, las declaraciones VAR configuran variables globales: Ratio, tal y como se ha mencionado, y Period y Stack que asignan el espacio de pila para el segundo COG. El primer método público, PUB Main, realiza las tareas de inicialización normales, incluida la configuración de un valor inicial de tasa equivalente al 50% PWM. Cada COG tiene una sencilla "Unidad de recuento/captura" realizada desde algunos registros y unos cuantos bits de lógica. Existen dos contadores idénticos, A y B, y cada uno de ellos contiene tres registros: CTR, FRQ y PHS. CTR configura el modo operativo, PHS es el acumulador que contiene el valor actual y FRQ se agrega al PHS, cuando es necesario. El contador A se utiliza aquí. Primero, el registro CTRA se configura para seleccionar el modo PWM y el bit 31 del PHSA conectado al Puerto 0 de salida. FRQA se configura en 1 de modo que el PHSA se incrementa por uno en cada ciclo del Reloj del sistema. Continúa en la página 22 > eTech - NÚMERO 3 21 ANÁLISIS DE DISEÑOS ANÁLISIS DE DISEÑOS ‘’******************************************************************************** ‘’*Controlador de velocidad dc para motores simple con contadores para la sincronización* ‘’* relación de marca/espacio PWM de 0 a 100% * ‘’******************************************************************************** ‘’Port 0 = PWM output ‘’Port 1 = Speed Up button input ‘’Port 2 = Speed Down button input CON _clkmode = xtal1 + PLL4X _clkfreq = 20_000_000 VAR word Ratio word Period long Stack[9] ‘Ratio = PWM pulse width ‘Period = PWM period ‘Make stack space for COG 1 PUB Main ‘’Initialisation of ports, counters and program start Ratio := 10000 ‘Initial PWM 50% Period := 20000 ‘Set PWM period ctra[30..26] := %00100 ‘Configure Counter A to NCO/PWM mode ctra[5..0] := %00000 ‘Direct Counter APIN to Port 0 frqa := 1 ‘Set counter increment to 1 dira[0..2] := %100 ‘Set Ports 0 = output, 1 & 2 = input cognew(Buttons, @Stack) ‘Start COG 1 running Buttons routine Toggle ‘COG 0 runs PWM generator routine PUB Toggle | Time ‘’COG 0 produces PWM signal with pulse width set by variable Ratio Time := cnt ‘Set base time from System Counter repeat ‘Repeat next 3 lines forever phsa := -Ratio ‘Load negated Pulse width into PHS Time += Period ‘Time = Time + Period waitcnt(Time) ‘Wait for interval set by Time PUB Buttons | Width ‘’COG 1 monitors two pushbuttons to derive value for Ratio repeat ‘Repeat next 8 lines forever Width := Ratio waitpne(%110, %110, 0) ‘Wait for button press if ina[1] == 0 ‘If Speed UP button pressed Width := Width + 1 <# Period ‘then increment Width to max Period else ‘Speed DOWN button pressed Width := Width - 1 #> ‘so decrement Width to min 0 Ratio := Width waitcnt(6000 + cnt) ‘Wait before checking buttons again Lista 1. Código de origen SPIN para el programa de demostración PWM 22 eTech - NÚMERO 3 < Continuación de la página 21 Ahora llega la primera instrucción realmente interesante: COGNEW. Esto es lo que inicia el segundo COG. Hasta ahora, el COG 0 lo ha hecho todo, ejecutando el cargador de arranque y, a continuación, la primera parte de nuestro programa. COGNEW le indica que cargue los botones del método público en el siguiente COG libre, en este caso el COG 1, y lo ejecute. Una vez que lo ha hecho, inicia el método Toggle y lo ejecuta desde ese momento en adelante. Una función concreta de Propeller es que comparte las 32 líneas del puerto GPIO entre todos los procesadores. Cada COG tiene su propio registro de dirección de puerto, cada una de cuyas salidas es "OR" con el siguiente registro del COG (véase la Fig. 1 de la página 20). Un COG que requiera un puerto de salida necesita configurar el bit adecuado en el registro de dirección para la lógica 1. Una vez configurado, también habilita la salida correspondiente del registro de E/S del COG para dirigir el contacto de E/S. Se debe tener cuidado y asegurarse de que los dos COG no intentan usar la misma línea de puerto para la salida, ya que el funcionamiento del programa no será el esperado. La entrada del puerto es completamente independiente y cada COG puede leer el estado de cualquier contacto en cualquier momento. Un COG puede comprobar su propia salida o controlar lo que otros COG están haciendo en los contactos que han configurado como salidas. Propeller no tiene un sistema de interrupción, de modo que existen unas instrucciones de espera que provocan que la ejecución del programa se ponga en pausa hasta que tenga lugar algún evento. WAITCNT suspende el funcionamiento del número especificado de ciclos de reloj del sistema mediante la comprobación del valor de una figura de destino con el valor del CNT del contador del sistema. En PUB, se carga Toggle PHSA con el valor negativo (complemento 2) de Ratio. Por supuesto, configura Bit 31 o el "bit de signo" del PHSA para la lógica 1. Puesto que este bit está conectado al Puerto 0, la salida PWM también aumenta. PHSA se incrementa ahora automáticamente a la velocidad del reloj del sistema al agregarle FRQA. Después de los ciclos del reloj de Ratio, PHSA alcanza cero y Bit 31 cambia a la lógica 0. Este es el final del impulso PWM. Mientras todo esto ocurre, el COG está establecido en la declaración WAITCNT durante la duración del Period. PHSA se sigue incrementando, pero el final del Period se alcanzará mucho antes de que PHSA alcance un valor que configura alto el Bit 31 de nuevo. Cuando WAITCNT finaliza el tiempo de espera, el ciclo se repite, cargando PHSA de nuevo con -Ratio. Por lo tanto, se han agregado más funcionamientos paralelos haciendo que el Counter determine el ancho del impulso, mientras que independientemente el programa COG establece el periodo. Así es cómo se genera la forma de onda PWM mediante Toggle. Lista de componentes La instrucción WAITPNE del método Buttons espera a que el Puerto 1 o el Puerto 2 (o ambos) vayan a una lógica 0. En otras palabras, espera a que se pulse un botón. Lo bonito de estas instrucciones de espera es que el funcionamiento del COG se suspende con un consumo de energía reducido más de un 85%. Se puede ver que los botones de ejecución de COG pasan la mayor parte del tiempo "dormidos" y sólo se despiertan cundo es necesario. Las declaraciones máximas (<#) y mínimas (#>) de los botones proporcionan los límites superiores e inferiores para Ratio. Código RS. Kit de inicio Propeller 32330 405-571 Unidad de medio puente cuádruple L293DNE 526-868 Interruptor de botón pulsador táctil 479-1390 Motor dc RS280 238-9709 Acelerándolo Normalmente, se espera que los programas que se ejecutan por un intérprete en placa, en este caso SPIN, sean más lentos que los que se encuentran en un ensamblador nativo. La arquitectura exclusiva de Propeller, hasta cierto punto, amplía el espacio de velocidad. Esto es así porque el código SPIN del usuario se mantiene en la RAM central compartida, mientras que cada COG ejecuta el intérprete en su propia memoria local. El concentrador proporciona acceso a los recursos centrales en una secuencia de tiempo estricta y puede mantener en espera un COG concreto hasta que llegue su turno. El código del equipo del instalador se almacena y ejecuta en la memoria local del COG, lo que da como resultado un aumento considerable del rendimiento. Lectura imprescindible Programming and Customizing the Multicore Propeller Microcontroller Shane Avery et al ISBN 978-0-07-166450-9, McGraw Hill Consiga más online... Está disponible una versión completa de este análisis junto con los archivos del código de origen SPIN en rs-components.com/etech eTech - NÚMERO 3 23