17
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 mieux comprendre l’interface entre le logiciel et le matériel. Vous devrez donc faire les diverses manipulations demandé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 long du 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) les manips 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 celle repérée FG4618 : c’est un microcontrôleur, on y reviendra par la suite. Mais d’abord, faisons le tour de la carte. Extrait de la documentation : motherboard.pdf page 6 LCD FG4618 F2013 Wireless CC1100/ 2420/2500 EMK Interface JTAG2 JTAG1 Buzzer Microphone Analog Out Capacitive Touch Pad Buttons RS-232 1

MSP430 TP1 : prise en main et programmation assembleur

  • Upload
    doque

  • View
    245

  • Download
    1

Embed Size (px)

Citation preview

Page 1: MSP430 TP1 : prise en main et programmation assembleur

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

Page 2: MSP430 TP1 : prise en main et programmation assembleur

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

Page 3: MSP430 TP1 : prise en main et programmation assembleur

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

Page 4: MSP430 TP1 : prise en main et programmation assembleur

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

Page 5: MSP430 TP1 : prise en main et programmation assembleur

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

Page 6: MSP430 TP1 : prise en main et programmation assembleur

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

Page 7: MSP430 TP1 : prise en main et programmation assembleur

À 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

Page 8: MSP430 TP1 : prise en main et programmation assembleur

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

Page 9: MSP430 TP1 : prise en main et programmation assembleur

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

Page 10: MSP430 TP1 : prise en main et programmation assembleur

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

Page 11: MSP430 TP1 : prise en main et programmation assembleur

À 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

Page 12: MSP430 TP1 : prise en main et programmation assembleur

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

Page 13: MSP430 TP1 : prise en main et programmation assembleur

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

Page 14: MSP430 TP1 : prise en main et programmation assembleur

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

Page 15: MSP430 TP1 : prise en main et programmation assembleur

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

Page 16: MSP430 TP1 : prise en main et programmation assembleur

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

Page 17: MSP430 TP1 : prise en main et programmation assembleur

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