département if / architecture matérielle msp430 tp1 ... · département if / architecture...
TRANSCRIPT
Département IF / Architecture Matérielle
MSP430 TP1 : prise en main et programmation assembleur
Introduction
Dans cette série de TP «msp430», on va étudier le fonctionnement d’un (petit) ordinateur pour mieuxcomprendre l’interface entre le logiciel et le matériel. Vous devrez donc faire les diverses manipulationsdemandées, et par moment écrire des bouts de programme.Nous ne ramasserons pas de compte-rendu ; par contre, vous avez intérêt à prendre des notes tout au longdu déroulement du TP pour pouvoir les relire par la suite : dans les TP d’après, mais aussi avant les QCM,et aussi avant l’examen ! Pour chaque exercice, mettez donc par écrit (sur papier ou sur ordinateur) lesmanips que vous faites, les questions que vous vous posez, et les nouvelles notions que vous comprenez.
1 Découverte de la carte
Exercice 1 Pour chaque binôme, allez prendre le matériel nécessaire au TP : une carte d’expérimentation,une sonde JTAG (le boîtier gris avec une nappe d’un côté), et un câble USB.
1.1 La carte mère
La carte que nous allons utiliser en TP est illustrée dans le schéma ci-dessous. La puce principale est cellerepérée FG4618 : c’est un microcontrôleur, on y reviendra par la suite. Mais d’abord, faisons le tour de lacarte.
Extrait de la documentation : motherboard.pdf page 6
2
4. Functional Overview
The MSP430FG4618/F2013 experimenter’s board supports various applications through the use of the on-chip peripherals connecting to a number of on-board components and interfaces as shown in Figure 2.
LCD
FG4618
F2013
WirelessCC1100/
2420/2500 EMK
Interface
JTA
G2
JTA
G1
Buzzer
Microphone
AnalogOut
Capacitive Touch
Pad
Buttons
RS-
232
Figure 2: Experimenter’s board block diagram
Wireless communication is possible through the expansion header which is compatible with all Chipcon Wireless Evaluation Modules from Texas Instruments. Interface to a 4-mux LCD, UART connection, microphone, audio output jack, buzzer, and capacitive touch pad enable the development of a variety of applications. Communication between the two on-board microcontrollers is also possible. In addition, all pins of the MSP430FG4618 are made available either via headers or interfaces for easy debugging. Sample code for this board is available online at www.ti.com/msp430.
1
Sur cette carte mère, en plus du msp430, il y a tout un tas de périphériques :1. un écran à cristaux liquides (pour afficher des chiffres et des icônes)2. un microphone3. un buzzer (pour jouer du son)4. une prise casque (pour jouer du son aussi, mais plus joli)5. un quartz (pour générer le signal d’horloge)6. deux boutons poussoirs7. des voyants lumineux (LED)8. une roue tactile capacitive (touchpad) en forme de chiffre 49. un port série (RS-232)
etc. ...
Exercice 2 Pour chacun de ces éléments, indiquez sur le schéma page précédente son emplacementapproximatif. Certains éléments (LEDs, quartz) ne sont pas sur le schéma, vous devrez les chercherdirectement sur la carte. Le quartz est repéré X2, et les diodes sont repérées LED1, LED2, LED3 et LED4.
Commentaire Vous aurez peut-être remarqué que la carte comporte deux microcontrôleurs. L’un est unMSP430F2013 (c’est le petit), et l’autre un MSP430FG4618 (c’est le gros). C’est avec ce second msp430qu’on va travailler dans ces TP. Les diodes LED1, LED2, et LED4 y sont connectées par des pistes de lacarte mère. La diode LED3, par contre, est connectée au F2013, qu’on ne va pas utiliser du tout. Vouspouvez dès maintenant oublier son existence, ainsi que celle de la LED3.
Exercice 3 L’encadré page suivante montre le schéma électrique de la carte mère. Retrouvez les différentscomposants vus jusqu’ici, et indiquez leur emplacement sur le schéma.
2
Extrait de la documentation : motherboard.pdf page 19
Audio output jack
MSP430FG
4618/F2013 Experimenter's Board
RF Daughter C
ard Connect
Isolated RS232 Com
munication
Breadboard
Sallen-Key 2nd Order O
A1 A
ctive LPF
(For opt. F2013 programm
ing)
0-00
SoftBaugh SBLCD
A4
(A4/O
A1I0)
(A3/O
A1O
)
(A7/D
AC
1)
(A0/O
A0I0)
(A5/O
A2O
)
(A1/O
A0O
)
(A2/O
A0I1)
(Mic Supply)
MSP430FG
4618 Pin Access
Power Supply C
onfiguration
(Output
Attn.)
VC
C_1: FG
4618 Supply Config
Pos 1-2: FET Powered
VC
C_2: F2013 Supply C
onfig
Pos 2-3: Battery Powered
BuzzerM
ute
Mic Input C
ircuitry and1st O
rder OA
0 Active H
PF
MSP-EXP430FG
4618 PCB V
er 0-00
Docum
ent Num
ber:
Date: 26-O
ct-2006Sheet: 1/1
VER:
+
+
+
+
A1
C9
C10
C8
C13
C6
C2
12
H2
34
56
78
12
H3
34
56
78
12
H4
34
56
78
12
H7
34
56
78
12
H6
34
56
78
12
H8
34
56
78
C12
1
BATT
2
P1.0/TAC
LK/AC
LK/A0+
2
P1.1/TA0/A
0-/A4+
3
P1.2/TA1/A
1+/A
4-4
P1.3/VREF/A
1-5
P1.4/SMC
LK/A2+
/TCK
6
P1.5/TA0/A
2-/SCLK/TM
S7
P1.6/TA1/A
3+/SD
O/SC
L/TDI/TC
LK8
P1.7/A3-/SD
I/SDA
/TDO
/TDI
9
VC
C1
VSS
14
TEST/SBWTC
K11
XIN/P2.6/TA
113
XOU
T/P2.712
NM
I/RST/SBWTD
IO10
U4
LED3
LED4 1JP3
2
1 JP22
2 1
SP1
1JP1
2
1 2 3
VC
C_1
C18
12
H5
34
C19
C21
1JP4
2
C1
12
H9
34
56
12
M1
+-B1
7F_7G_7E_D
P7P$1
7A_7B_7C
_7DP$2
6F_6G_6E_D
P6P$3
6A_6B_6C
_6DP$4
5F_5G_5E_C
OL5
P$55A
_5B_5C_5D
P$64F_4G
_4E_DP4
P$74A
_4B_4C_4D
P$83F_3G
_3E_CO
L3P$9
3A_3B_3C
_3DP$10
2F_2G_2E_D
P2P$11
2A_2B_2C
_2DP$12
1F_1G_1E_D
P1P$13
1A_1B_1C
_1DP$14
CO
M3
P$15C
OM
2P$16
CO
M1
P$17C
OM
0P$18
F5_PR_P4_P3P$19
F1_F2_F3_F4P$20
PL_P0_P1_P2P$21
AU
_AR_A
D_A
LP$22
BT_B1_B0_BBP$23
AN
T_A2_A
1_A0
P$24EN
V_TX_RX_8BC
P$25D
OL_ERR_M
INU
S_MEM
P$26
13579
JTAG
2
1113
2461214 810
1 3 5 7 9
JTAG
1
11 13
2 4 6 12 148 10
16
27
38
49
5
RS232G
1
G2
C3
D2
D1
23
7 85 6
U2
23
7 85 6
U1
Q1
1 2
S1
1 2
S2
R33 R31
R26R27R34
R29
R32
R30
R19
R18
R20
R13
R14
R15
R16
R23
R8
R3
R10
R1
R2
R5
R9
R4
R11
R12
R17
1PW
R22
1
PWR1
2
8079787776
757473727170696867666564636261
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
50494847464544434241403938373635343332313029282726
60595857565554535251
81828384858687888990919293949596979899100
LED1
R6LED2
R7
R28
C4
D3
X1
X2
C15
12
BB3
34
56
78
910
1112
1314
1516
1718
C5
C7
12
BB1
34
56
78
910
1112
1314
1516
1718
12
BB2
34
56
78
910
1112
1314
1516
1718
BANDP$4
TIPP$1
RINGP$2
12
H1
34
56
78
1111
1212
1313
1414
11
22
1515
1616
44
55
66
77
88
99
1010
33
INN
ER_GN
DIN
NER_G
ND
C11
C16
C17
R24R25
1 2 3
VC
C_2
R21
R22
C14
C20
135
24679
810111315
1214161719
RF1
1820
135
24679
810111315
1214161719
RF2
1820
GN
D
S0
S0
S1
S1
S2
S2
S3
S3
S5
S5
S6
S6
S7
S7
S8
S8
S9
S9
S10
S10
S11
S11
S12
S12
S13
S13
S14
S14
S4
S4
S15
S15
S16
S16
S17
S17
S18
S18
S19
S19
S20
S20
CO
M3
CO
M3
CO
M2
CO
M2
CO
M1
CO
M1
CO
M0
CO
M0
UC
B0SDA
UC
B0SDA
UC
B0SDA
UC
B0SCL
UC
B0SCL
UC
B0SCL
DV
CC
_4618
DV
CC
_4618
DV
CC
_4618
DV
CC
_4618
DV
CC
_4618
DV
CC
_4618
DV
CC
_4618
SIMO
1
SIMO1
SIMO
1SO
MI1
SOM
I1
SOMI1
UC
LK1
UCLK1
UC
LK1
S21
S21
GD
O2
GD
O2
GDO2
GD
O0
GD
O0
GDO0
P3.0
P3.0
P3.0
UTXD
1
UTXD
1
URXD
1
URXD
1
P7.5
P7.5
2013_P1.22013_P1.32013_P1.42013_P1.5
SCL
SDA
2013_P2.72013_P2.6
SBWTC
K
SBWTC
K
SBWTD
IO
SBWTD
IO
P6.0
P6.0
P6.0
P6.1
P6.1
P6.1
P6.2
P6.2
P6.2
P6.5
P6.5
P6.5
LCD
CA
P
LCD
CA
P
P10.7
P10.7
P5.1
P5.1
VEREF+
VEREF+
RESETCC
RESETCC
RESETCC
VREG
_EN
VREG
_EN
VREG_EN
FIFO
FIFO
FIFO
FIFOP
FIFOP
FIFOP
PC_G
ND
2013_P1.12013_P1.0
P2.0
P2.0
P2.2
P2.2
P2.6
P2.6
UC
B0CLK
UC
B0CLK
UC
B0CLK
P3.4
P3.4
P3.5
P3.5P3.5
P3.7
P3.7
P5.6
P5.6
P7.4
P7.4
P7.6
P7.6
P7.7
P7.7
VREF
VREF
P5.0
P5.0
P10.6
P10.6
P6.4
P6.4
P6.4
P6.6
P6.6
P6.3
P6.3
P6.3
P6.7
P6.7
P6.7
VEREF-
VEREF-
SW1
SW1
SW1
SW2
SW2
SW2
P2.1
P2.1
P2.3
P2.3
P2.3
P2.7
P2.7
UC
A0TXD
UC
A0TXD
UC
A0TXD
UC
A0RXD
UC
A0RXD
UC
A0RXD
P3.6
P3.6
P5.7
P5.7
P5.5
P5.5
P4.2
P4.2
P4.2
P7.0
P7.0
UCA0SIMO
UC
A0SIM
O
UCA0SOMI
UC
A0SO
MI
UCA0CLK
UC
A0C
LK
P4.7
P4.7
P4.6
P4.6
LCL_PW
R1
LCL_PW
R1
FET_PWR1
FET_PWR1
FET_PWR2
FET_PWR2
LCL_PW
R2
LCL_PW
R2
AV
CC
_4618
AV
CC
_4618
0.1uF10uF
0.1uF
0.1uF
0.1uFGN
D
GN
D
VC
C
0.1uF
GN
D GN
D
0.1uF
GN
D
VC
C
GN
D
MSP430F2013PW
GND
GN
D
GN
D
AL60P
470n
GN
D
10uF
15p
GN
D
VC
C
0.1uF
GN
D
GN
D
10uF
1N4148
1N4148
PS8802
PS8802
MM
BT5088GN
D
GN
D
VC
C
GN
DG
ND
10k 470k
4701k3k3
1k0
150k
10
47k
470
5M1
5M1
5M1
5M1
470
10
47k
10
1k
2k2
100
2k2
2k2
100k
100k
470
GN
D
VCC_2013
GN
D
470
GN
D
470
22k
10uF
1N4148
10uF
10uF10uF
VC
C
VC
C
1uF
22nF3.3nF
1.4k15.4k
0-DN
P
0-DN
P
DNP
470n
GND
GN
D
GN
D
3
1.2 Documentations techniques
Comme tout objet technologique, notre plate-forme de TP s’accompagne d’une documentation techniqueabondante. Pour ne pas vous noyer sous la doc, nous vous en avons copié les extraits essentiels directementdans le sujet, sous forme d’encadrés. Pour les plus curieux, nous vous avons aussi mis à disposition lesdocuments sur Moodle :Motherboard.pdf décrit notre carte d’expérimentation et les différents composants présents sur la carte.MSP430.pdf est le manuel générique de la puce MSP430. Le processeur est documenté au chapitre 3.datasheet.pdf donne les détails techniques de notre modèle précis de msp430.LCD.pdf décrit l’écran à crystaux liquides (qu’on utilisera à partir du TP2).
1.3 Vous avez dit microcontrôleur ?
Le MSP430FG4618 est un microcontrôleur, c’est à dire un System-on-Chip : une même puce qui contient àla fois un processeur, de la mémoire, et des blocs périphériques. Si on zoome sur l’intérieur de la puce, ona donc affaire à l’architecture illustrée ci-dessous.
Extrait de la documentation : msp430x4xx.pdf page 21
ACLK
BusConv.
Peripheral
MAB 16-Bit
MDB 16-Bit
MCLK
SMCLK
ClockSystem
Peripheral PeripheralPeripheral
Peripheral Peripheral PeripheralRAMFlash/
RISC CPU16-Bit
JTA
G in
terf
ace
ACLK
SMCLK
ROM
JTAG
SMCLK
ACLK
Quartz
MAB 16-Bit
Peripheral
MDB 8-Bit
Commentaires Les flèches repérées MAB et MDB sont respectivement le Memory Address Bus etle Memory Data Bus (les mêmes que dans la micro-machine). Ce sont eux qui relient le processeurau reste-du-monde, comme dans toute machine de von Neumann qui se respecte. Le bloc repéréJTAG interface permet justement de venir intercepter tout ce qui passe sur le bus, et donc decontrôler finement le comportement de la machine. C’est ce qu’on va faire dans ces TP.
Exercice 4 Branchez maintenant la sonde JTAG sur la carte. Vous devriez pouvoir choisir sans difficultéentre les deux connecteurs JTAG.
1.4 Zoom sur le processeur
Si on se rapproche encore, on tombe sur l’architecture suivante :
4
Extrait de la documentation : msp430x4xx.pdf page 43
015
MDB MAB
16Zero, ZCarry, COverflow, VNegative, N
16−bit ALU
dst src
R8 General Purpose
R9 General Purpose
R10 General Purpose
R11 General Purpose
R12 General Purpose
R13 General Purpose
R14 General Purpose
R15 General Purpose
R4 General Purpose
R5 General Purpose
R6 General Purpose
R7 General Purpose
R3/CG2 Constant Generator
R2/SR/CG1 Status
R1/SP Stack Pointer
R0/PC Program Counter 0
0
16
Commentaire Attention, ce schéma ne montre que la vue «externe», c’est à dire du point de vuede l’utilisateur. Une «vue interne» a comporterait d’autres éléments nécessaires à l’implémentation(automate de contrôle, registre d’instruction, etc).Les seuls éléments représentés sur le schéma sont ceux qui sont accessibles au programmeur : les16 registres architecturaux, ainsi que l’unité arithmétique et logique. Remarquez au passage queles 4 premiers registres sont spécialisés pour un usage particulier (R0 est le compteur ordinal, etc).À l’inverse les 12 autres registres sont généraux, on peut y mettre ce qu’on veut.
Nous vous avons reproduit en annexe (page 13 et suivantes) les passages correspondants de ladocumentation. Vous n’en avez pas besoin pour l’instant, mais pensez à y revenir lorsque vousvoudrez des détails sur l’usage des registres.
a. voir par exemple les figures 9.2 et 9.3 du poly de cours (page 80)
Exercice 5 Allez lire la page https://fr.wikipedia.org/wiki/Registre_de_processeur et résumez, enune phrase, la différence entre un registre spécialisé et un registre général.
5
Exercice 6 Sur le schéma de la page 4, indiquez où se trouvent nos 16 registres, ainsi que l’automate decontrôle.
2 Prise en main des outils : mspdebug
Pour communiquer avec la carte au travers de la sonde JTAG, on va utiliser un programme appelémspdebug. Cet outil va nous permettre de charger des programmes dans la mémoire, d’observer et decontrôler l’exécution du programme, d’inspecter le contenu du CPU et de la mémoire, etc.
Exercice 7 Démarrez mspdebug en tapant la ligne commande suivante :
mspdebug -j -d /dev/ttyUSB0 uif
Vous devez obtenir une série d’informations techniques compliquées, puis une liste des commandesdisponibles, et enfin un prompt de la forme (mspdebug) en début de ligne. Commencez par effacercomplètement la puce en tapant dans mspdebug la commande erase .
On va maintenant se servir de mspdebug pour allumer et éteindre la diode LED4 sans passer par le CPU.Pour initialiser la diode, il faut écrire la valeur 2 à l’adresse 49. Ensuite, on l’allumera en écrivant la valeur 2à l’adresse 50, et on l’éteindra en écrivant 0 à l’adresse 50. 1
Exercice 8 Toujours dans mspdebug, tapez help mw et lisez l’aide de la commande memory write.
Remarquez au passage que vous pouvez aussi taper help tout court pour obtenir la liste des commandes
disponibles, et help bidule pour obtenir de l’aide sur la commande bidule.
Exercice 9 Faites s’allumer et s’éteindre la diode quelques fois.
3 Exécution d’un programme en mode pas-à-pas
Exercice 10 Créez un nouveau répertoire TP1, et retapez 2 dans un fichier tp1.s le programme suivant :
.section .init9
main:/* initialisation de la diode rouge */mov.b #2, &49
/* eteindre */mov.b #0, &50
/* allumer */mov.b #2, &50
loop:jmp loop
Exercice 11 Traduisez ce programme en langage machine avec la commande suivante :msp430-as -mmcu=msp430fg4618 -o tp1.o tp1.s
1. En effet, dans la vie, pour communiquer avec les périphériques depuis le processeur, on s’y prend de la même façon quepour communiquer avec la RAM. Ce sera d’ailleurs le sujet du TP2.
2. Vous pouvez aussi essayer de copier-coller depuis le PDF, mais il faudra pas venir vous plaindre que ça marche pas (ce quisera le cas). Et puis c’est réellement formateur de retaper les exemples (si, si).
6
À savoir : assemblage VS éditions de liens
Pour passer d’un programme en langage assembleur à un programme exécutable, il faut réaliserdeux opérations :
1) l’assemblage consiste à convertir un fichier texte contenant des instructions vers un fichierbinaire contenant les même instructions, mais en langage machine. L’outil qui fait ça, l’assem-bleur, est typiquement nommé as , et permet de passer d’un fichier bidule.s à un fichierbidule.o. C’est ce qu’on vient de faire dans l’exercice précédent. Mais ce n’est pas fini : leprogramme consiste peut-être en plusieurs morceaux, qu’il faut maintenant coller ensemble.
2) l’édition de liens consiste à coller ensemble plusieurs fichiers machin.o, et à placer chacund’entre eux aux bonnes adresses, par exemple pour s’assurer qu’ils ne se marchent pas lesuns sur les autres. L’outil qui fait ça, l’éditeur de liens, est typiquement nommé ld , et produitun fichier truc.elf
Invoquer ces différents outils comme il faut avec les bonnes options est compliqué et souvent sourced’erreur. Heureusement, il existe aussi une commande générique gcc qui est beaucoup plus simpled’usage, et qui se charge d’appeler as et ld dans le bon ordre et avec les bons arguments. Ainsi,vous pouvez obtenir directement un exécutable avec la commande suivante :
msp430-gcc -mmcu=msp430fg4618 -mdisable-watchdog -o truc.elf truc.s
Exercice 12 Depuis mspdebug, transférez votre programme sur la carte en utilisant la commandeprog tp1.elf , puis lancez-le avec la commande run . Constatez que la diode reste toujours allumée
(c’est normal, on ne l’éteint jamais). Interrompez l’exécution en appuyant sur Ctrl+C.
Exercice 13 Dans tp1.s, déplacez les instructions d’allumage et d’extinction à l’intérieur de la boucleinfinie, et exécutez de nouveau votre programme. Constatez que la diode reste encore toujours allumée.En réalité, elle clignote bien, mais trop rapidement pour notre œil. C’est parce que la boucle tourne tropvite ! La fréquence du CPU est de 1MHz, et chaque instruction prend une poignée de cycles d’horloge,donc notre boucle tout entière tourne à plus de 100kHz. Interrompez de nouveau l’exécution, et au lieu dela relancer avec run , utilisez cette fois la commande step qui exécute une seule instruction machine.(faites donc help run et help step au passage). Constatez qu’en exécutant ainsi le programme en modepas-à-pas, on arrive maintenant à voir ce qui se passe.
4 Programmation en assembleur
Vous allez maintenant devoir modifier votre programme. Pour la syntaxe ASM, aidez-vous des explicationsqui sont données dans les deux encadrés page suivante et page 9. Pour la mise au point, utilisez mspdebug.En plus des commande qu’on a vues jusqu’ici, vous aurez peut-être besoin de la commande md pourlire la mémoire, et de setbreak pour mettre des points d’arrêt. Commencez donc par taper help md ethelp setbreak.
Exercice 14 Modifiez votre programme afin de ralentir suffisamment la boucle infinie pour pouvoir obser-ver le clignotement à l’oeil nu. Pour cela, vous allez rajouter une boucle (ou plusieurs) qui incrémente unevariable jusqu’à atteindre une certaine valeur, par exemple 20000. Faites valider par un enseignant.
7
Utile pour le TP : La syntaxe ASM du msp430
Vous avez déjà rencontré ce jeu d’instructions en TD, mais avec une syntaxe un peu simplifiée. Onvous présente ici la syntaxe que vous allez devoir utiliser en TP.
Opérations La plupart des instructions est de la forme OPCODE SRC, DST . OPCODE est l’opéra-tion souhaitée, par exemple ADD, XOR, MOV, etc. La liste complète est donnée page suivante. SRCet DST indiquent les opérandes sur lesquels travailler. Chaque opérande est de l’une des formessuivantes :
— un nom de registre : R7, R15... (utilisez les numéros, pas de «SP» ni «PC» etc.)— une constante immédiate : #42, #0xB600...— une case mémoire désignée par son addresse : &1234, &0x3100...
Par exemple, l’instruction ADD &1000, R5 calcule la somme de R5 et de la valeur contenue dansla case d’adresse 1000, et range le résultat dans R5. Attention, certaines combinaisons n’ont pasde sens, et seront rejetées par l’assembleur avec un message d’erreur. Par exemple l’instructionMOV R8, #36 ne veut rien dire.Certaines instructions travaillent sur un seul opérande, et ont donc une syntaxe légèrement différente.Par exemple INV DST inverse chacun des bits de DST, ou CLR DST met DST à zéro. Reportez-vous à la liste page suivante pour plus de détails, et/ou à la doc : msp430x4xx.pdf page 61 etsuivantes.
Drapeaux Certaines instructions, notamment les opérations arithmétiques et logiques, modifientle registre d’état (R2, cf encadré page 15), en particulier les drapeaux Z, N, C, V :
— Z est le Zero bit. Il passe à 1 lorsque le résultat d’une opération est nul, et il passe à 0 lorsqu’unrésultat est non-nul.
— N est le Negative bit. Il passe à 1 lorsque le résultat d’une opération est négatif (en complémentà deux) et il passe à 0 lorsqu’un résultat est non-négatif.
— C est le Carry bit. Il passe à 1 lorsqu’un calcul produit une retenue sortante, et il passe à 0lorsqu’un calcul ne produit pas de retenue sortante.
— V est le Overflow bit. Il est mis à 1 lorsque le résultat d’une opération arithmétique déborde dela fourchette des valeurs signées (en complément à deux), et à 0 sinon.
La liste page suivante détaille l’effet de chaque instruction sur les quatre drapeaux : un tiret lorsquele drapeau n’est pas affecté, un 1 ou un 0 lorsque le drapeau passe toujours à une certaine valeur,et une étoile lorsque l’effet sur le drapeau dépend du résultat.
Sauts conditionnels Les instructions de branchement sont de la forme JUMP label . Regardezpar exemple le programme page 6. Le saut peut être soit inconditionnel (instruction JMP), soit soumisà une condition sur les drapeaux. Par exemple, l’instruction JNZ label est un Jump if Non-Zero :elle sautera vers label si et seulement si le bit Z est faux.
Opérandes «word» ou «byte» Chaque instruction peut travailler sur des mots de 16 bits, ou surdes octets. Il faut pour cela on préciser OPCODE.B. Par exemple, l’instruction MOV.B R10, &42copie les 8 bits de poids faible de R10 vers l’octet situé à l’adresse 42, alors que l’instructionMOV R10, &42 copie tout le contenu de R10 vers les deux octets situés aux adresses 42 et 43 a.Reportez-vous à l’encadré page 17 pour plus de détails.
a. Précision : les 8 bits de poids faible vont en 42, et les 8 bits de poids fort vont en 43. On dit que le msp430 est detype little-endian. Allez lire https://fr.wikipedia.org/wiki/Endianness si c’est la première fois que vous voyez cemot.
8
Extrait de la documentation : msp430x4xx.pdf page 115
Mnemonic Description V N Z C
ADC(.B) dst Add C to destination dst + C → dst * * * *
ADD(.B) src,dst Add source to destination src + dst → dst * * * *
ADDC(.B) src,dst Add source and C to destination src + dst + C → dst * * * *
AND(.B) src,dst AND source and destination src .and. dst → dst 0 * * *
BIC(.B) src,dst Clear bits in destination .not.src .and. dst → dst − − − −
BIS(.B) src,dst Set bits in destination src .or. dst → dst − − − −
BIT(.B) src,dst Test bits in destination src .and. dst 0 * * *
BR dst Branch to destination dst → PC − − − −
CALL dst Call destination PC+2 → stack, dst → PC − − − −
CLR(.B) dst Clear destination 0 → dst − − − −
CLRC Clear C 0 → C − − − 0
CLRN Clear N 0 → N − 0 − −
CLRZ Clear Z 0 → Z − − 0 −
CMP(.B) src,dst Compare source and destination dst − src * * * *
DADC(.B) dst Add C decimally to destination dst + C → dst (decimally) * * * *
DADD(.B) src,dst Add source and C decimally to dst. src + dst + C → dst (decimally) * * * *
DEC(.B) dst Decrement destination dst − 1 → dst * * * *
DECD(.B) dst Double-decrement destination dst − 2 → dst * * * *
DINT Disable interrupts 0 → GIE − − − −
EINT Enable interrupts 1 → GIE − − − −
INC(.B) dst Increment destination dst +1 → dst * * * *
INCD(.B) dst Double-increment destination dst+2 → dst * * * *
INV(.B) dst Invert destination .not.dst → dst * * * *
JC/JHS label Jump if C set/Jump if higher or same − − − −
JEQ/JZ label Jump if equal/Jump if Z set − − − −
JGE label Jump if greater or equal − − − −
JL label Jump if less − − − −
JMP label Jump PC + 2 x offset → PC − − − −
JN label Jump if N set − − − −
JNC/JLO label Jump if C not set/Jump if lower − − − −
JNE/JNZ label Jump if not equal/Jump if Z not set − − − −
MOV(.B) src,dst Move source to destination src → dst − − − −
NOP No operation − − − −
POP(.B) dst Pop item from stack to destination @SP → dst, SP+2 → SP − − − −
PUSH(.B) src Push source onto stack SP − 2 → SP, src → @SP − − − −
RET Return from subroutine @SP → PC, SP + 2 → SP − − − −
RETI Return from interrupt * * * *
RLA(.B) dst Rotate left arithmetically * * * *
RLC(.B) dst Rotate left through C * * * *
RRA(.B) dst Rotate right arithmetically 0 * * *
RRC(.B) dst Rotate right through C * * * *
SBC(.B) dst Subtract not(C) from destination dst + 0FFFFh + C → dst * * * *
SETC Set C 1 → C − − − 1
SETN Set N 1 → N − 1 − −
SETZ Set Z 1 → C − − 1 −
SUB(.B) src,dst Subtract source from destination dst + .not.src + 1 → dst * * * *
SUBC(.B) src,dst Subtract source and not(C) from dst. dst + .not.src + C → dst * * * *
SWPB dst Swap bytes − − − −
SXT dst Extend sign 0 * * *
TST(.B) dst Test destination dst + 0FFFFh + 1 0 * * 1
XOR(.B) src,dst Exclusive OR source and destination src .xor. dst → dst * * * *
Operation
Remarque chacune de ces instructions est documentée en détail dans la doc (msp430x4xx.pdfpage 61 et suivantes). N’hésitez pas à vous y reporter si vous avex besoin de précisions.
9
5 Programmation en C
Contrairement au langage d’assemblage qui est différent pour chaque jeu d’instructions, le langage Cpermet de programmer en s’abstrayant largement des détails de l’architecture cible. Les opérations decalcul et les structures de contrôle (boucles, fonctions, etc) ont une syntaxe unique, qui sera traduite par lecompilateur vers un programme ASM avec les bonnes instructions. Cependant, même s’il est découplé del’architecture concrète de la machine, le langage C offre au programmeur une vue abstraite calquée surl’architecture de von Neumann : un processeur d’un côté, et une mémoire de l’autre côté. La syntaxe despointeurs fait le lien entre les deux, permettant de désigner une case mémoire par son adresse, d’obtenirl’adresse d’une variable, etc.
Dans cette partie du TP, on va s’intéresser à la manière dont un programme C est traduit en assembleur.
5.1 Compilation et exécution
Exercice 15 Retapez dans un fichier blink.c le programme suivant :
unsigned char* p5dir;unsigned char* p5out;unsigned int i;
int main(void){
// initialisation de la diodep5dir = (unsigned char*) 50;*p5dir = 2;
p5out = (unsigned char*) 49;
while(1){
// software delayfor(i=0;i<20000;i++)
{}//do nothing
// allumer*p5out=2;
// software delayfor(i=0;i<20000;i++)
{}//do nothing
// eteindre*p5out=0;
}}
Exercice 16 En vous aidant des explications de l’encadré page suivante, compilez ce programme ettransférez-le sur le msp430. Constatez que la diode rouge clignote.
10
À savoir : la chaîne de compilation
La chaîne de compilation complète est illustrée ci-dessous :
C files(.c)
Assemblyfiles(.s)
cc (compiler)
as (assembler)
Objectfiles(.o)
Libraryobjectfiles(.o, .a)
Linkerscript(.ld)
ld (linker)Executableprogram(.elf)
DisassembledCode (.lst)
loader
objdump(disassembler)
execution
Vous connaissez déjà certains outils : as, ld. Le chargement du programme, sous Linux, seraiteffectué par le noyau. Dans ce TP, on utilise mspdebug pour transférer notre exécutable sur lemsp430.Les nouveaux éléments sont cc le compilateur C, et objdump le désassembleur.
Compilation Plutôt que d’invoquer cc individuellement, on va encore une fois passer par lacommande gcc qui est plus confortable :
— pour faire seulement la compilation C vers assembleur, utilisez cette commande :msp430-gcc -mmcu=msp430fg4618 -Wall -Werror -O1 -S -o truc.s truc.c
— pour faire la compilation et l’assemblage (C vers code machine), utilisez cette commande :msp430-gcc -mmcu=msp430fg4618 -Wall -Werror -O1 -c -o truc.o truc.c
— pour faire aussi l’édition de liens dans la foulée, utilisez cette commande :msp430-gcc -mmcu=msp430fg4618 -mdisable-watchdog -o truc.elf truc.c
Désassemblage Pour comprendre précisément ce qui se passe lors de l’exécution, il est souventutile d’examiner précisément le code machine. L’outil qui permet de faire ça s’appelle un désas-sembleur. Il prend en entrée un programme en langage machine (.o ou .elf) et produit en sortieun fichier texte lisible à l’oeil nu (c’est presque de l’ASM). La ligne de commande à utiliser est lasuivante :msp430-objdump -d truc.elf > truc.lst
Exercice 17 Désassemblez l’exécutable, et ouvrez le listing. Repérez les différents morceaux : en plusde votre fonction main(), le linker a aussi inclus du code avant et après le programme. On ne va paschercher à comprendre ce code ajouté, mais par contre dans la suite on va étudier d’un peu plus prèsle code assembleur de la fonction main(). Repérez respectivement l’initialisation des diodes, les deuxboucles de temporisation, la boucle infinie, et les instructions qui allument et éteignent la diode.
5.2 Compilation optimisante
Jusqu’ici, la traduction C vers assembleur restait assez directe. Mais dans le cas général, le compilateur n’aaucune obligation de traduire ligne-par-ligne, ni de respecter l’ordre des instructions, etc. Sa seule garantieest de respecter la sémantique de notre programme, c’est à dire intuitivement de ne pas changer «ce quecalcule» le programme. 3 Cette distinction est importante, car il existe évidemment plusieurs programmes
3. Pour avoir des idées plus précises sur les «règles du jeu» quand on utilise un compilateur, suivez un cours de compilation !
11
ASM qui «calculent la même chose» qu’un unique programme C. Le compilateur va donc essayer deconstruire la meilleure traduction possible, c’est à dire celle qui calcule la même chose mais le plus vitepossible. On appelle cela l’optimisation.Par exemple, dans notre cas, la boucle sur i n’a pas d’intérêt apparent pour la logique du programme, etdonc le compilateur peut être tenté de la supprimer complètement.
Exercice 18 Refaites l’exercice précédent en essayant les différents niveaux d’optimisation offerts pargcc : -O0, -O1, -O2, et -O3. (Attention : la syntaxe correcte est «tiret», suivi de la lettre O majuscule, puisd’un chiffre). Quelles sont les principales différences entre les programmes assembleur que vous obtenez ?
Exercice 19 Ajoutez à la déclaration de la variable i le mot-clé volatile, dont l’effet est d’interdire aucompilateur d’optimiser les accès à i. Une fois de plus, compilez votre programme avec les différentsniveaux d’optimisation et observez le code assembleur obtenu.
5.3 Représentation en machine des variables du programme
Pour faire cette partie, gardez le mot-clé volatile sur i et revenez au niveau d’optimisation -O1.
Exercice 20 Dans notre programme, la variable i est déclarée avec le type unsigned int. En observantle code assembleur, indiquez quelle est la taille (en octets) de cette variable.
Exercice 21 Modifiez votre programme en donnant à i les types int, unsigned long et égalementunsigned long long. Quelle est la taille de i dans chacun de ces cas ?
Exercice 22 Exécutez les quatre versions différentes du programme et comparez les fréquences declignotement dans chacun des cas. Comment expliquez-vous ces différences ?
Exercice 23 En observant de près le code des différentes versions, et/ou en les exécutant pas-à-pas,expliquez comment est incrémentée la variable i dans chaque version.
12
Annexe : documentation des registres du CPU
Extrait de la documentation : msp430x4xx.pdf page 44
CPU Registers
3-4 RISC 16-Bit CPU
3.2 CPU Registers
The CPU incorporates sixteen 16-bit registers. R0, R1, R2 and R3 havededicated functions. R4 to R15 are working registers for general use.
3.2.1 Program Counter (PC)
The 16-bit program counter (PC/R0) points to the next instruction to beexecuted. Each instruction uses an even number of bytes (two, four, or six),and the PC is incremented accordingly. Instruction accesses in the 64-KBaddress space are performed on word boundaries, and the PC is aligned toeven addresses. Figure 3−2 shows the program counter.
Figure 3−2.Program Counter
0
15 0
Program Counter Bits 15 to 1
1
The PC can be addressed with all instructions and addressing modes. A fewexamples:
MOV #LABEL,PC ; Branch to address LABEL
MOV LABEL,PC ; Branch to address contained in LABEL
MOV @R14,PC ; Branch indirect to address in R14
13
Extrait de la documentation : msp430x4xx.pdf page 45
CPU Registers
3-5RISC 16-Bit CPU
3.2.2 Stack Pointer (SP)
The stack pointer (SP/R1) is used by the CPU to store the return addressesof subroutine calls and interrupts. It uses a predecrement, postincrementscheme. In addition, the SP can be used by software with all instructions andaddressing modes. Figure 3−3 shows the SP. The SP is initialized into RAMby the user, and is aligned to even addresses.
Figure 3−4 shows stack usage.
Figure 3−3.Stack Pointer
0
15 0
Stack Pointer Bits 15 to 1
1
MOV 2(SP),R6 ; Item I2 −> R6
MOV R7,0(SP) ; Overwrite TOS with R7
PUSH #0123h ; Put 0123h onto TOS
POP R8 ; R8 = 0123h
Figure 3−4.Stack Usage
I3
I1
I2
I3
0xxxh
0xxxh − 2
0xxxh − 4
0xxxh − 6
0xxxh − 8
I1
I2
SP
0123h SP
I1
I2
I3 SP
PUSH #0123h POP R8Address
0123h
The special cases of using the SP as an argument to the PUSH and POPinstructions are described and shown in Figure 3−5.
Figure 3−5.PUSH SP - POP SP Sequence
SP1
SPold
SP1
PUSH SP
The stack pointer is changed aftera PUSH SP instruction.
SP1SP2
POP SP
The stack pointer is not changed after a POP SPinstruction. The POP SP instruction places SP1 into thestack pointer SP (SP2=SP1)
14
Extrait de la documentation : msp430x4xx.pdf page 46
CPU Registers
3-6 RISC 16-Bit CPU
3.2.3 Status Register (SR)
The status register (SR/R2), used as a source or destination register, can beused in the register mode only addressed with word instructions. Theremaining combinations of addressing modes are used to support theconstant generator. Figure 3−6 shows the SR bits.
Figure 3−6.Status Register Bits
SCG0 GIE Z C
rw-0
15 0
Reserved NCPUOFF
OSCOFFSCG1V
8 79
Table 3−1 describes the status register bits.
Table 3−1.Description of Status Register Bits
Bit Description
V Overflow bit. This bit is set when the result of an arithmetic operationoverflows the signed-variable range.
ADD(.B),ADDC(.B) Set when:Positive + Positive = NegativeNegative + Negative = Positive,otherwise reset
SUB(.B),SUBC(.B),CMP(.B) Set when:Positive − Negative = NegativeNegative − Positive = Positive,otherwise reset
SCG1 System clock generator 1. This bit, when set, turns off the DCO dcgenerator, if DCOCLK is not used for MCLK or SMCLK.
SCG0 System clock generator 0. This bit, when set, turns off the FLL+ loopcontrol
OSCOFF Oscillator Off. This bit, when set, turns off the LFXT1 crystal oscillator,when LFXT1CLK is not use for MCLK or SMCLK
CPUOFF CPU off. This bit, when set, turns off the CPU.
GIE General interrupt enable. This bit, when set, enables maskableinterrupts. When reset, all maskable interrupts are disabled.
N Negative bit. This bit is set when the result of a byte or word operationis negative and cleared when the result is not negative.Word operation: N is set to the value of bit 15 of the
resultByte operation: N is set to the value of bit 7 of the
result
Z Zero bit. This bit is set when the result of a byte or word operation is 0and cleared when the result is not 0.
C Carry bit. This bit is set when the result of a byte or word operationproduced a carry and cleared when no carry occurred.
15
Extrait de la documentation : msp430x4xx.pdf page 47
CPU Registers
3-7RISC 16-Bit CPU
3.2.4 Constant Generator Registers CG1 and CG2
Six commonly-used constants are generated with the constant generatorregisters R2 and R3, without requiring an additional 16-bit word of programcode. The constants are selected with the source-register addressing modes(As), as described in Table 3−2.
Table 3−2.Values of Constant Generators CG1, CG2
Register As Constant Remarks
R2 00 − − − − − Register mode
R2 01 (0) Absolute address mode
R2 10 00004h +4, bit processing
R2 11 00008h +8, bit processing
R3 00 00000h 0, word processing
R3 01 00001h +1
R3 10 00002h +2, bit processing
R3 11 0FFFFh −1, word processing
The constant generator advantages are:
! No special instructions required
! No additional code word for the six constants
! No code memory access required to retrieve the constant
The assembler uses the constant generator automatically if one of the sixconstants is used as an immediate source operand. Registers R2 and R3,used in the constant mode, cannot be addressed explicitly; they act assource-only registers.
Constant Generator − Expanded Instruction Set
The RISC instruction set of the MSP430 has only 27 instructions. However, theconstant generator allows the MSP430 assembler to support 24 additional,emulated instructions. For example, the single-operand instruction:
CLR dst
is emulated by the double-operand instruction with the same length:
MOV R3,dst
where the #0 is replaced by the assembler, and R3 is used with As = 00.
INC dst
is replaced by:
ADD 0(R3),dst
16
Extrait de la documentation : msp430x4xx.pdf page 48
CPU Registers
3-8 RISC 16-Bit CPU
3.2.5 General-Purpose Registers R4 to R15
Twelve registers, R4 to R15, are general-purpose registers. All of theseregisters can be used as data registers, address pointers, or index values, andthey can be accessed with byte or word instructions as shown in Figure 3−7.
Figure 3−7.Register-Byte/Byte-Register Operations
Unused
High Byte Low Byte
Byte
Register-Byte Operation
0h
High Byte Low Byte
Byte
Byte-Register Operation
Register
Memory Register
Memory
Example Register-Byte Operation Example Byte-Register OperationR5 = 0A28Fh R5 = 01202h
R6 = 0203h R6 = 0223h
Mem(0203h) = 012h Mem(0223h) = 05Fh
ADD.B R5,0(R6) ADD.B @R6,R5
08Fh 05Fh
+ 012h + 002h
0A1h 00061h
Mem (0203h) = 0A1h R5 = 00061h
C = 0, Z = 0, N = 1 C = 0, Z = 0, N = 0
(Low byte of register) (Addressed byte)
+ (Addressed byte) + (Low byte of register)
−>(Addressed byte) −>(Low byte of register, zero to High byte)
17