traitement parallèle

publicité
REVUE DE
cONcEPTION
REVUE DE
cONcEPTION
Lancez-vous dans le
traitement parallèle
avec le Parallax Propeller
™
De Dr William Marshall, RS components
De temps en temps une nouveauté fait son apparition. Ça fait maintenant de
nombreuses années que le développement des microcontrôleurs emprunte
les mêmes voies : soit le même processeur « coeur » de base entouré d'autres
périphériques, soit le processeur lui-même rendu de plus en plus puissant.
Cog 0
Cog 1
Cog 2
Cog 3
Cog 4
Cog 5
Cog 6
Cog 7
Sens des broches
Sortie des broches
Reg. de direction E/S
Générateur vidéo
Reg. de sortie E/S
Compteur A + PPL
Compteur B + PPL
Reg. de direction E/S
Générateur vidéo
Reg. de sortie E/S
Compteur A + PPL
Compteur B + PPL
Reg. de direction E/S
Générateur vidéo
Reg. de sortie E/S
Compteur A + PPL
Compteur B + PPL
Reg. de direction E/S
Générateur vidéo
Reg. de sortie E/S
Compteur A + PPL
Compteur B + PPL
Reg. de direction E/S
Générateur vidéo
Reg. de sortie E/S
Compteur A + PPL
Compteur B + PPL
Reg. de direction E/S
Générateur vidéo
Reg. de sortie E/S
Compteur A + PPL
Compteur B + PPL
Reg. de direction E/S
Générateur vidéo
Reg. de sortie E/S
Compteur A + PPL
Compteur B + PPL
Reg. de direction E/S
Générateur vidéo
Reg. de sortie E/S
Compteur A + PPL
Compteur B + PPL
32
32
P31
P15
P30
P14
P29
P13
P28
P12
P27
P11
P26
P10
P25
P9
P24
Broches
E/S
P23
P8
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
Processeur
Processeur
Processeur
Processeur
Processeur
Processeur
Processeur
Processeur
P17
P16
P1
P0
32
32
Entrées des broches
32
Compteur système
32
Bus de données
16
Bus d'adresses
Détecteur
de tension
(~10ms)
P3
P2
P1
P0
VDO
VSS
P31
P30
P29
P28
P27
44
43
42
41
40
39
38
37
36
35
34
VDD
VSS
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
P20
22
P21
23
21
24
11
20
10
19
P9
P10
18
P22
17
25
16
9
15
P8
14
26
12
8
P23
12
VDD
Détecteur
de baisse de
tension
BOEn
P19
P17
P18
P16
P15
VSS
VDD
P14
P13
P12
Séquenceur de bus
Cog
0
RAM 8192 x 32
CLKSEL
RESn
3
Oscillateur RC
12 MHz / 20 MHz
SOFTRES
5
PLLENA
XI
OSCENA
OSCMODE
2
Oscillateur
à quartz
CC 0 80 MHz
(4 - 8 MHz avec
horloge PLL)
Horloge PLL
1x, 2x, 4x, 8x,
16x,(16x doit être
64 - 128 MHz)
Sélecteur
d'horloge
(MUX)
ROM 8192 x 32
HORLOGE
Activation Cog
Plate-forme
Cog
6
Bits de verrouillage (8)
SOFTRES
PLLENA
OSCENA
OSCMODE
CLKSEL
2
3
Configuration
Registre
Cog
1
Cog
7
3
XO
P11
RESET
Compteur
système
HORLOGE
Plate-forme
Retard de
réarmement
(~50 ms)
Compteur
système
Cog
2
RAM, ROM,
Configuration,
Contrôle
Cog
5
Cog
3
Cog
4
Interaction Plate-forme/Cog
Fig. 1
20
eTech - NUMÉRO 3
Broches
E/S
Tous les microcontrôleurs ont en commun un
processeur unique qui s'appuie sur une logique
dédiée et spécialisée assurant des fonctionnalités
telles qu'une sortie de modulation en largeur
d'impulsion (PWM) et une entrée de comptage par
impulsions. Le Propeller de Parallax représente une
évolution majeure dans l'approche de conception.
Ce dispositif comporte huit processeurs 32 bits ou
« COG » avec une logique de support minimale et
un matériel d'E/S des plus élémentaires (Fig.1). À
première vue, cet agencement pourrait susciter
des réactions du genre : « Super, je vais pouvoir
implémenter ce projet de réseau neuronal en utilisant
chaque COG pour exécuter fondamentalement le
même programme. »
Mais bien qu'un traitement purement parallèle puisse
effectivement être un bon usage pour le Propeller,
je ne pense pas que la conception ait été motivée
par ce type d'application. L'idée est de laisser à
l'ingénieur un maximum de contrôle sur le système
périphérique dans une application donnée. Vous
pouvez tout de même faire exécuter le programme
de haut niveau par un COG unique qui sous-traite les
tâches de niveau inférieur, comme les E/S série, à un
autre COG en fonction des besoins. Mais ce qui est
vraiment fascinant sur ce dispositif c'est sa capacité
à se reconfigurer sous contrôle d'un programme
afin de s'adapter aux besoins du moment et
d'arrêter ensuite les processus quand ils ne sont
plus nécessaires, en réaffectant éventuellement les
ressources des processeurs à une tâche totalement
différente. L'horloge du processeur est également
sous contrôle d'un programme, ce qui permet de
diminuer la consommation d'énergie si une haute
vitesse n'est pas nécessaire pour mettre en œuvre
des E/S lentes telles que RS-232.
Le kit de démarrage
Le kit contient une toute petite carte de démo
équipée de nombreux connecteurs d'E/S dont
certains vous surprendront : sortie VGA vers un
moniteur, sortie TV, connecteurs clavier et souris
PS/2. Les sorties vidéo sont disponibles car, dans
sa ROM de ressource centrale, la puce contient la
table de recherche d'un générateur de caractères.
Le seul port d'E/S « traditionnel » est l'USB
provenant de la puce FTDI intégrée. La fonction
UART qui commande ce dispositif est bien-entendu
entièrement mise en œuvre par logiciel et s'exécute
sur l'un des COG. Toutes les communications avec le
logiciel IDE du PC, le Propeller Tool, se font via le port
USB. La carte est équipée d'une mémoire EEPROM
série qui communique avec le Propeller via un bus
I2C ce qui, vous l'avez deviné, est mis en œuvre par
un logiciel exécuté sur un COG. Les programmes
utilisateur disposent ainsi d'une mémoire non
volatile. Ces routines d'E/S sont chargées à partir de
la ROM du système lors du Reset de façon à ce que
les programmes puissent être téléchargés à partir
du PC ou de l'EEPROM, mais sont ensuite arrêtées
avant que le programme utilisateur commence à
s'exécuter. Si votre programme a besoin de ces
ressources d'E/S, il devra les charger et leur affecter
un ou plusieurs COG en fonction des besoins.
Si cette méthode peut sembler peu commode à
première vue, elle évite d'encombrer inutilement
l'espace mémoire avec des ressources superflues.
Propeller Tool
L'IDE fourni avec le kit de démarrage est appelé
Propeller Tool et permet l'édition de programme,
la compilation du langage de haut niveau Spin et
le téléchargement sur la carte de démo. Vous avez
la possibilité de programmer en Spin, en langage
assembleur, ou avec une combinaison des deux. Il va
de soi que l'assembleur permet une exécution plus
efficace et plus rapide et on retrouve le compromis
classique entre un développement rapide et une
exécution rapide.
L'écran de l'éditeur est très coloré et l'attribution
automatique des différentes couleurs pour coder
les blocs aide à mieux comprendre la structure du
programme. Deux options sont disponibles pour
télécharger et exécuter : compiler et exécuter
dans la RAM d'un COG, et compiler et envoyer
dans l'EEPROM externe où le programme est
automatiquement chargé dans la RAM par le
chargeur d'amorçage. La première option convient
mieux au développement, car le programme est
seulement transféré dans la mémoire non volatile
quand le code fonctionne.
Utilisation de la carte de démo
Pour illustrer certaines des principales
caractéristiques de la programmation du Propeller,
une tâche a été mise au point pour commander
la vitesse d'un petit moteur à courant continu
en utilisant la modulation en largeur d'impulsion
(PWM). Deux boutons-poussoirs fournissent les
entrées d'augmentation et de baisse de la vitesse
(Speed Up et Speed Down). La capacité des
ports d'E/S étant insuffisante pour commander le
moteur utilisé, un circuit pont en H a été construit
avec la moitié d'un driver quadruple L293D, monté
ensuite sur la carte de circuit imprimé avec deux
commutateurs « Tact », des résistances « Pull up »
et des condensateurs de découplage (voir la photo
page 23). Notez l'utilisation de la variante D de ce
composant, qui est dotée de diodes de protection
intégrées pour contrôler les charges inductives.
Sur les 32 ports du Propeller, seuls les Ports 0 à 7
sont disponibles pour l'utilisateur, les autres étant
réservés aux bus EEPROM, etc. sur cette carte de
démo. Le Propeller est un composant +3,3V bien
que les deux alimentations stabilisées +3,3V et +5V
soient également disponibles. Ainsi, la logique du
L293D fonctionne avec l'alimentation +3,3V, alors
que sa broche d'alimentation de moteur séparée
est connectée au +5V. La connexion à la terre ou 0V
qui peut être reliée à la pince crocodile d'une sonde
d'oscilloscope est un petit détail mais très utile.
Programmation en Spin
Une solution de programme possible pour
commander le moteur est présentée dans le Listing
1 (voir page 22). Il ne s'agit pas d'une solution
optimale mais elle illustre certaines des particularités
essentielles de la programmation du Propeller.
L'objectif est d'utiliser deux COG ; l'un commande
la sortie PWM avec un rapport marque/espace défini
par la variable globale Ratio, l'autre surveille deux
entrées de bouton-poussoir et définit la valeur de
Ratio. La fréquence du PWM est de 1 kHz.
Les instructions CON configurent deux constantes
système et définissent la vitesse de l'horloge.
Nous avons opté pour une horloge de 20 MHz de
sorte que le multiplicateur interne PLL est défini à
4 étant donné le quartz 5 MHz fourni avec la carte.
Ensuite, les instructions VAR définissent les variables
globales : Ratio comme indiqué plus haut, Period
et Stack qui affecte l'espace de pile pour le
deuxième COG.
La première méthode publique, PUB Main, effectue
les tâches d'initialisation habituelles, dont la définition
d'une valeur initiale de Ratio équivalente à 50 % du
PWM. Chaque COG possède une simple unité «
Compter/Capturer » reposant sur certains registres
et quelques éléments de logique. Il y a deux
compteurs identiques, A et B, chacun composé de
trois registres : CTR, FRQ et PHS. CTR définit le
mode de fonctionnement, PHS est l'accumulateur
contenant la valeur courante et FRQ est ajouté à
PHS en fonction des besoins. Ici, c'est le compteur
A qui est utilisé. Pour commencer, le registre CTRA
est défini pour sélectionner le mode PWM et le Bit
31 de PHSA est relié au Port 0 de sortie. FRQA est
défini à 1 de sorte que PHSA est incrémenté de un à
chaque cycle de l'horloge système.
Suite page 22 >
eTech - NUMÉRO 3
21
REVUE DE
CONCEPTION
REVUE DE
CONCEPTION
‘’ **********************************************************************************
‘’ * Simple régulateur de vitesse de moteur CC utilisant des compteurs pour varier *
‘’ * le rapport marque/espace du PWM de 0 à 100 %
*
‘’ **********************************************************************************
‘’Port 0 = Sortie PWM
‘’Port 1 = Entrée du bouton Speed Up
‘’Port 2 = Entrée du bouton Speed Down
CON
_clkmode
_clkfreq
=
=
xtal1 + PLL4X
20_000_000
VAR
word Ratio
word Period
long Stack[9]
‘Ratio = largeur de l'impulsion du PWM
‘Period = période du PWM
‘Espace pile pour COG 1
PUB Main
‘’Initialisation des ports, des compteurs et démarrage du programme
Ratio := 10000
‘PWM initial 50 %
Period := 20000
‘Définit la période du PWM
ctra[30..26] := %00100
‘Configure le Compteur A au mode NCO/PWM
ctra[5..0] := %00000
‘Associe le Compteur APIN au Port 0
frqa := 1
‘Définit l'incrément de compteur à 1
dira[0..2] := %100
‘Définit les Ports 0 = sortie , 1 & 2 = entrée
cognew(Buttons, @Stack)
‘Démarre l'exécution de la routine Buttons sur COG 1
Toggle
‘COG 0 exécute la routine de génération du PWM
PUB Toggle | Time
‘’COG 0 produit un signal PWM avec une largeur d'impulsion définie par la variable Ratio
Time := cnt
‘Définit le temps de base en utilisant le Compteur système
repeat
‘Répète les 3 lignes suivantes indéfiniment
phsa := -Ratio
‘Charge la largeur d'impulsion inversée dans PHS
Time += Period
‘Time = Time + Period
waitcnt(Time)
‘Attend pendant l'intervalle défini par Time
PUB Buttons | Width
‘’COG 1 surveille les 2 boutons-poussoirs pour déterminer la valeur de Ratio
repeat
‘Répète les 8 lignes suivantes indéfiniment
Width := Ratio
waitpne(%110, %110, 0)
‘Attend qu'un bouton soit appuyé
if ina[1] == 0
‘Si le bouton Speed UP est appuyé
Width := Width + 1 <# Period
‘alors incrémenter Width jusqu'à Period max
else
‘Bouton Speed DOWN appuyé
Width := Width - 1 #> 0
‘alors diminuer Width jusqu'à min 0
Ratio := Width
waitcnt(6000 + cnt)
‘Attend avant de contrôler à nouveau les boutons
Listing 1. Code source SPIN pour le programme de démonstration PWM
22
eTech - NUMÉRO 3
< Suite de la page 21 >
Vient ensuite l'instruction vraiment intéressante :
COGNEW. C'est elle qui lance le deuxième COG.
Jusqu'ici, c'est COG 0 qui a tout fait : l'exécution du
chargeur d'amorçage et ensuite la première partie de
notre programme. COGNEW lui indique de charger la
méthode publique Buttons dans le COG libre suivant,
dans ce cas COG 1, et de lancer l'exécution. Il lance
ensuite la méthode Toggle et l'exécute à partir de
maintenant. L'une des particularités du Propeller est
que les 32 lignes de port GPIO sont partagées par
tous les processeurs. Chaque COG possède son
propre registre de Direction de port, dont chaque
sortie est mise en fonction OU avec le registre de
COG suivant (voir la Fig.1 page 20). Un COG qui a
besoin d'un port de sortie doit définir le bit approprié
dans son registre de direction au 1 logique. Une fois
défini, il permet également à la sortie correspondante
du registre d'E/S du COG de configurer la broche
d'E/S. Il faut veiller à ce que deux COG n'essayent
pas d'utiliser la même ligne de port pour la sortie,
Car le programme aurait alors un comportement
inattendu ! L'entrée d'un port est complètement
indépendante et n'importe quel COG peut lire l'état
de n'importe quelle broche de port à tout moment.
Un COG peut contrôler sa propre sortie ou même
surveiller ce que font les autres COG sur les broches
de port qu'ils ont configurées comme sorties.
Le Propeller n'ayant pas de système d'interruption,
plusieurs instructions sont utilisées pour
interrompre l'exécution du programme jusqu'à
ce qu'un événement se produise. WAITCNT
suspend l'opération pour le nombre spécifié
de cycles d'horloge système en comparant
la valeur d'un nombre cible à la valeur
du compteur système CNT. Dans PUB
Toggle, PHSA est chargé avec la valeur
négative (complément à 2) de Ratio. Ceci
définit le Bit 31 ou le « bit de signe » de
PHSA au 1 logique. Comme ce bit est relié
au Port 0, la sortie PWM passe aussi à l'état
haut. PHSA est maintenant automatiquement
incrémenté à la fréquence de l'horloge système
en lui ajoutant FRQA. Après Ratio cycles d'horloge,
PHSA atteint zéro et le Bit 31 passe au 0 logique,
ce qui correspond à la fin de l'impulsion PWM.
Pendant ce temps, le COG attend à l'instruction
WAITCNT pendant la durée Period. PHSA continue
naturellement à s'incrémenter, mais la fin de
Period est atteinte bien avant que PHSA atteigne à
nouveau une valeur haute du Bit 31. Quand le délai
de WAITCNT expire, le cycle se répète, PHSA étant
rechargé avec –Ratio. Nous avons donc ajouté des
opérations parallèles en déterminant la largeur de
l'impulsion avec le Compteur, alors que de son côté
le programme du COG définit la période. C'est ainsi
que la forme d'onde PWM au Port 0 est générée
par Toggle.
L'instruction WAITPNE dans la méthode Buttons
attend que le Port 1 ou le Port 2 (ou les deux) passe
au 0 logique. Autrement dit, elle attend qu'un bouton
soit appuyé. L'avantage de ces instructions Wait
est que l'opération du COG est suspendue, ce qui
permet une réduction de consommation de plus de
85 %. Vous pouvez constater que le COG exécutant
Buttons passe la plupart de son temps « endormi
», et ne se réveille que quand c'est nécessaire.
Les instructions max (<#) et min (#>) dans Buttons
donnent les limites haute et basse de Ratio.
Liste des composants
Code commande.
Kit de démarrage Propeller 32330
405-571
Driver demi-pont quadruple L293DNE
526-868
Commutateur bouton-poussoir Tact
479-1390
Moteur CC RE280
238-9709
Encore plus vite
On pourrait s'attendre à ce que des programmes
exécutés par un interpréteur intégré, dans ce
cas SPIN, soient plus lents que des programmes
en assembleur natif. Dans une certaine mesure,
l'architecture unique du Propeller creuse la différence
de vitesse. En effet, le code SPIN de l'utilisateur
réside dans une RAM centrale partagée alors que
chaque COG exécute l'interpréteur dans sa propre
mémoire locale. La plate-forme permet d'accéder
aux ressources centrales selon une séquence
temporelle stricte et un COG donné peut être
contraint à attendre son tour. Le code machine
de l'assembleur est stocké et exécuté dans la
mémoire locale du COG ce qui permet d'augmenter
considérablement le débit.
Ouvrages à consulter
Programming and Customizing the
Multicore Propeller Microcontroller
Shane Avery et al ISBN 978-0-07-166450-9
McGraw Hill
Toujours plus en ligne...
Une version plus complète de
cet article et les fichiers du code
source SPIN sont disponibles sur
rs-components.com/etech
eTech - NUMÉRO 3
23
Téléchargement