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