• Aucun résultat trouvé

´Electronique num´erique

N/A
N/A
Protected

Academic year: 2022

Partager "´Electronique num´erique"

Copied!
21
0
0

Texte intégral

(1)

num´erique J.-M Friedt

Electronique num´ ´ erique

J.-M Friedt

FEMTO-ST/d´epartement temps-fr´equence jmfriedt@femto-st.fr

transparents `ajmfriedt.free.fr

24 octobre 2015

1 / 1

(2)

num´erique

J.-M Friedt

Contexte

• Syst`eme embarqu´e = contraintes de ressources qu’il faut exploiter au mieux

• Certaines applications n´ecessitent un contrˆole des lattences tr`es fin tout en gardant la souplesse de la configuration logicielle

(programmation)

• Comprendre le cœur du processeur pour mieux l’utiliser, mˆeme si on exploite un langage de haut niveau (C)

• Exemple concret : g´en´erateur de mire VGA

2 / 1

(3)

num´erique

J.-M Friedt

S´ equen¸cage d’une trame VGA

• VGA=affichage sur un ´ecran

• Raffraˆıchissement `a 60 Hz pour une r´esolution de 640×480 pixels

⇒18,4 Mpixels/seconde ou 54 ns/pixel !

• Un cycle d’horloge d’un processeur cadenc´e `a 20 MHz : 50 ns.

• Nous ne pouvons donc profiter que de1 cycle d’horlogepour charger la couleur du pixel et configurer le GPIO : impossible !

• R´eduction de la r´esolution : seul le taux de raffraˆıchissement horizontal est impos´e, le nombre de pixel est r´eduit.

HSYNCVSYNC

15250

985 349 63.5

t(µs) 25.17

1.89 0.94 3.77

t(µs) total=31.77=lclk

lclk pclk

48 640 16 96

2 11 480

31 zone

visible

retour horizontal

retour vertical HSYNC VSYNC

0<V<0.7 V

0..5V

3 / 1

(4)

num´erique

J.-M Friedt

S´ equen¸cage d’une trame VGA

• VGA=affichage sur un ´ecran

• Raffraˆıchissement `a 60 Hz pour une r´esolution de 640×480 pixels

⇒18,4 Mpixels/seconde ou 54 ns/pixel !

• Un cycle d’horloge d’un processeur cadenc´e `a 20 MHz : 50 ns.

• Nous ne pouvons donc profiter que de1 cycle d’horlogepour charger la couleur du pixel et configurer le GPIO : impossible !

• R´eduction de la r´esolution : seul le taux de raffraˆıchissement horizontal est impos´e, le nombre de pixel est r´eduit.

4 / 1

(5)

num´erique

J.-M Friedt

Le program counter et la pile

O`u en est l’ex´ecution du code.

Le PC en soi est cach´e, mais comprendre son utilisation ´evite bien des d´eboires :

• un saut (jmp) correspond `a stocker une nouvelle valeur absolue dans le PC (PC=xxxx)

• un saut relatif (bra) correspond `a une op´eration sur PC (PC+=xx)

• un appel de proc´edure (call) correspond `aempilerPC, effectuer les op´erations de la proc´edure, et

revenir (ret) en d´epilant le PC.

• PC est initialis´e au Reset

• la pile sert `a conserver tempo- rairement des variables (push, pop) et lors de l’appel d’interruptions.

Manipuler la pile sans la remettre en ´etat dans une proc´edure est une garantie de plantage

data1 SP

data1 addr. retour SP

data1 addr. retour

CALL PUSH

SP reg1 reg2 initialisation

5 / 1

(6)

num´erique

J.-M Friedt

Au cœur du processeur : langage

machine et assembleur

opérande

+/−

additionneur

soustracteur registres

1 Unit´e arithm´etique et logique : architectures du Microchip PIC 16F84 et du MSP430. Une multitude de registres remplace l’unique accumulateur en sortie de l’ALU (m´emorisation des r´esultats interm´ediaires) – p.9 datasheet Atmega32.6 / 1

(7)

num´erique

J.-M Friedt

Au cœur du processeur : langage

machine et assembleur

• ALU est un multiplexeur qui, en fonction de l’opcode, route les arguments vers les portes logiques qui traitent les bits

• fonction arithm´etiques et logiques simples, branchement

(conditionnels ou non), appels de fonctions (manipulation de PC et de la pile)

Arithm´etique Transfers Bits Sauts Appels

ADD Rd, Rr MOVW Rd+1 :Rd, Rr+1 :Rr BSET s RJMP P12 RCALL P12

ADC Rd, Rr MOV Rd, Rr BCLR s IJMP ICALL

SUB Rd, Rr IN Rd, IO6 SBI IO5, b JMP P22 EICALL

SBC Rd, Rr OUT IO6, Rr CBI IO5, b CALL P22

INC Rd PUSH Rr BST Rd, b CPSE Rd, Rr RET

DEC Rd POP Rr BLD Rd, b SBRC Rr, b RETI

AND Rd, Rr LD Rd, X SBRS Rr, b

OR Rd, Rr ST X, Rr SBIC IO5, b

EOR Rd, Rr SBIS IO5, b

COM Rd BRBC s, P7

NEG Rd BRBS s, P7

CP Rd, Rr SWAP Rd

LSR Rd NOP

ROR Rd BREAK

ASR Rd SLEEP

MUL Rd, Rr WDR

Cas particulier de l’AVR : la pile n’est pas un registre g´en´eral mais est localis´e aux adresses 0x3D et 0x3E (SPL et SPH)

7 / 1

(8)

num´erique

J.-M Friedt

Instructions du processeur AVR

• Le registre d’´etat indique le r´esultat de l’instruction pr´ec´edente

• La pile peut ˆetre affect´ee par une instruction (call, push/pop)

• Taille de l’instruction (opcode + argument)1

• Nombre de cycles d’horloge

• AVR8 : une instruction/cycle `a la fr´equence du quartz (16 MHz)

1. Atmel AVR 8-bit Instruction Set, Rev. 0856J–AVR–07/2014

8 / 1

(9)

num´erique

J.-M Friedt

Cas des branchements

• Nombre variable de cycles en fonction du r´esultat du test

• Le processeur avait pr´evu la prochaine instruction et doit changer d’avis

• Cas potentiellement catastrophique sur despipelinesplus longs (x86, SPARC)

9 / 1

(10)

num´erique

J.-M Friedt

Lattence des interruptions

• Les interruptions sont souvent utilis´ees pour des phases critiques du programme

• Le gestionnaire d’interruption (ISR)doit ˆetre le plus court possible car aucune autre interruption ne peut survenir pendant ISR

• Bien penser `a laisser le microprocesseur en bon ´etat (pile)

Cas de l’AVR8 :

10 / 1

(11)

num´erique

J.-M Friedt

Lattence des interruptions

• Les interruptions sont souvent utilis´ees pour des phases critiques du programme

• Le gestionnaire d’interruption (ISR)doit ˆetre le plus court possible car aucune autre interruption ne peut survenir pendant ISR

• Bien penser `a laisser le microprocesseur en bon ´etat (pile)

H8/3048 :

http://www.datasheetcatalog.org/datasheets/restul/499485_DS.pdf 11 / 1

(12)

num´erique

J.-M Friedt

Mise en pratique : VGA

// i n s p i r e d f r o m P e t t e r i L i i k k a n e n

#i n c l u d e<a v r / i o . h>

#i n c l u d e<a v r / i n t e r r u p t . h>

#i n c l u d e<a v r / s l e e p . h>

#i n c l u d e<a v r / wdt . h>

#i n c l u d e<a v r / p o w e r . h>

#d e f i n e HSYNC 0 x 4 0 // HSYNC = PORTD6

#d e f i n e VSYNC 0 x 8 0 // VSYNC = PORTD7

v o l a t i l e u i n t 1 6 t l i n e r o u n d = 0 ; // c u r r e n t→

,→ l i n e i n t main (v o i d){

MCUSR &= ˜ ( 1<<WDRF) ; w d t d i s a b l e ( ) ;

c l o c k p r e s c a l e s e t ( c l o c k d i v 1 ) ; // h t t p s : / / g i t h u b . com/ p o l o l u / a−s t a r / i s s u e s /3

USBCON=0;

c l i ( ) ;

DDRC = 0 xFF ; DDRD = 0 xFF ; PORTC = 0 x 0 0 ; PORTD = 0 xFF ; // I n i t a l i z e t i m e r i n t e r r u p t s e r v i c e TCCR1A = 0 ;

TCCR1B|= ( 1<<WGM12) ; // Turn CTC on TIMSK1|= ( 1<<OCIE1A ) ;// Ena . i n t e r r u p t

OCR1A = 5 0 9 ; //T=31.8 u s∗16 MHz

TCCR1B|= ( 1<<CS10 ) ; // t i m e r c l k /1 MCUCR|= (1<<SE ) ; // E n a b l e s l e e p mode s e i ( ) ; // E n a b l e i n t e r r u p t s w h i l e( 1 ) asm (" s l e e p ") ;

}

ISR ( TIMER1 COMPA vect ) { // ISR c a l l e d e v e r y 32 u s

c h a r v a l ; u i n t 8 t i = 0 ; ++l i n e r o u n d ;

f o r( i =0; i<8;++ i ) asm (" nop ") ; // Back p o r c h PORTD &= ˜HSYNC ; // H−s y n c= 0V f o r( i =0; i<14;++ i ) asm (" nop ") ;

PORTD|= HSYNC ; // H−s y n c= 5V

f o r( i =0; i<6;++ i ) { // F r o n t p o r c h

asm (" nop ") ; asm (" nop ") ; }

i f( l i n e r o u n d<= 4 8 0 ) {

i f ( ( l i n e r o u n d &0x 0 8 ) ==0) v a l =0;

e l s e v a l =0 x f f ; f o r ( i =0; i<62;++ i )

{PORTC = v a l ; v a l =0 x f f−v a l ;}

// 80 s i j u s t e une a s s i g n a t i o n PORTC=0; // B l a c k o u t e x t r a s c r e e n s p a c e }e l s e i f ( l i n e r o u n d == 4 9 2 )

PORTD &= ˜VSYNC ; // V−s y n c = 0V e l s e i f ( l i n e r o u n d == 4 9 4 )

PORTD|= VSYNC ;

e l s e i f( l i n e r o u n d == 5 2 4 ) l i n e r o u n d =0;

}

avr-gcc -mmcu=atmega32u4 -g -O2 -Wall -c t.c avr-gcc -mmcu=atmega32u4 -O1 -Wall -S t.c # t.s avr-gcc -mmcu=atmega32u4 -g -Wall -o t.out t.o avr-objdump -dSt t.out > t.lst

avr-objcopy -Oihex t.out t.hex

12 / 1

(13)

num´erique

J.-M Friedt

Mise en pratique : VGA

Analyser les lignes 1DA-1E2 (affichage)

0 0 0 0 0 1 7 4< v e c t o r 1 7>:

ISR ( TIMER1 COMPA vect ){ // ISR c a l l e d e v e r y 32 u s

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ V i d e o ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/

i f( l i n e r o u n d<= 4 8 0 ){

1 b4 : 80 91 80 01 l d s r 2 4 , 0 x 0 1 8 0 ; 1 b8 : 90 91 81 01 l d s r 2 5 , 0 x 0 1 8 1 ;

1 bc : 81 3 e c p i r 2 4 , 0 xE1 ; 225 ;

1 be : 91 40 s b c i r 2 5 , 0 x 0 1 ; 1 ;

1 c 0 : 98 f 4 b r c c .+38 ; 0 x 1 e 8< v e c t o r 1 7 +0x74> ; i f ( ( l i n e r o u n d &0x 0 8 ) ==0) v a l =0; e l s e v a l =0 x f f ;

1 c 2 : 80 91 80 01 l d s r 2 4 , 0 x 0 1 8 0 ; 1 c 6 : 90 91 81 01 l d s r 2 5 , 0 x 0 1 8 1 ;

1 c a : 96 95 l s r r 2 5 ;

1 c c : 87 95 r o r r 2 4 ;

1 c e : 96 95 l s r r 2 5 ;

1 d0 : 87 95 r o r r 2 4

1 d2 : 96 95 l s r r 2 5

1 d4 : 87 95 r o r r 2 4

1 d6 : 81 70 a n d i r 2 4 , 0 x 0 1 ; 1

1 d8 : 81 95 n e g r 2 4

1 da : 9 e e 3 l d i r 2 5 , 0 x3E ; 62

f o r ( i =0; i<62;++ i ){PORTC = v a l ; v a l =0 x f f−v a l ;} // 80 s i j u s t e une a s s i g n a t i o n 1 dc : 88 b9 o u t 0 x08 , r 2 4 ; 8

1 de : 80 95 com r 2 4

1 e 0 : 91 50 s u b i r 2 5 , 0 x 0 1 ; 1

1 e 2 : e 1 f 7 b r n e .−8 ; 0 x 1 d c< v e c t o r 1 7 +0x68>

PORTC=0; // B l a c k o u t e x t r a s c r e e n s p a c e 1 e 4 : 18 b8 o u t 0 x08 , r 1 ; 8

1 e 6 : 1 d c 0 r j m p .+58 ; 0 x 2 2 2< v e c t o r 1 7 +0xae>

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/

} e l s e i f( l i n e r o u n d == 4 9 2 ) PORTD &= ˜VSYNC ; // V−s y n c = 0V 1 e 8 : 80 91 80 01 l d s r 2 4 , 0 x 0 1 8 0

1 e c : 90 91 81 01 l d s r 2 5 , 0 x 0 1 8 1 1 f 0 : 8 c 3 e c p i r 2 4 , 0xEC ; 236 1 f 2 : 91 40 s b c i r 2 5 , 0 x 0 1 ; 1

1 f 4 : 11 f 4 b r n e .+4 ; 0 x 1 f a< v e c t o r 1 7 +0x86>

1 f 6 : 5 f 98 c b i 0 x0b , 7 ; 11

1 f 8 : 14 c 0 r j m p .+40 ; 0 x 2 2 2< v e c t o r 1 7 +0xae>

e l s e i f( l i n e r o u n d == 4 9 4 ) PORTD|= VSYNC ; // One s c r e e n + V−s y n c i s made . . .

13 / 1

(14)

num´erique

J.-M Friedt

Mise en pratique : VGA

0 0 0 0 0 1 7 4< v e c t o r 1 7>:

ISR ( TIMER1 COMPA vect ){ // ISR c a l l e d e v e r y 32 u s

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ V i d e o ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/

i f( l i n e r o u n d<= 4 8 0 ){

1 b4 : 80 91 80 01 l d s r 2 4 , 0 x 0 1 8 0 ; 1 b8 : 90 91 81 01 l d s r 2 5 , 0 x 0 1 8 1 ;

1 bc : 81 3 e c p i r 2 4 , 0 xE1 ; 225 ;

1 be : 91 40 s b c i r 2 5 , 0 x 0 1 ; 1 ;

1 c 0 : 98 f 4 b r c c .+38 ; 0 x 1 e 8< v e c t o r 1 7 +0x74> ; i f ( ( l i n e r o u n d &0x 0 8 ) ==0) v a l =0; e l s e v a l =0 x f f ;

1 c 2 : 80 91 80 01 l d s r 2 4 , 0 x 0 1 8 0 ; 1 c 6 : 90 91 81 01 l d s r 2 5 , 0 x 0 1 8 1 ;

1 c a : 96 95 l s r r 2 5 ;

1 c c : 87 95 r o r r 2 4 ;

1 c e : 96 95 l s r r 2 5 ;

1 d0 : 87 95 r o r r 2 4

1 d2 : 96 95 l s r r 2 5

1 d4 : 87 95 r o r r 2 4

1 d6 : 81 70 a n d i r 2 4 , 0 x 0 1 ; 1

1 d8 : 81 95 n e g r 2 4

1 da : 9 e e 3 l d i r 2 5 , 0 x3E ; 62

f o r ( i =0; i<62;++ i ){PORTC = v a l ; v a l =0 x f f−v a l ;}

1 dc : 88 b9 o u t 0 x08 , r 2 4 ; 1 c y c l e 1 de : 80 95 com r 2 4 ; 1 c y c l e 1 e 0 : 91 50 s u b i r 2 5 , 0 x 0 1 ; 1 c y c l e

1 e 2 : e 1 f 7 b r n e .−8 ; 2 c y c l e s i on s a u t e , 1 c y c l e s i c o n t i n u e PORTC=0; // B l a c k o u t e x t r a s c r e e n s p a c e ; 62∗(1+1+1+2)+1=311 c y c l e s =19.5 u s 1 e 4 : 18 b8 o u t 0 x08 , r 1 ; 8

1 e 6 : 1 d c 0 r j m p .+58 ; 0 x 2 2 2< v e c t o r 1 7 +0xae>

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/

} e l s e i f( l i n e r o u n d == 4 9 2 ) PORTD &= ˜VSYNC ; // V−s y n c = 0V 1 e 8 : 80 91 80 01 l d s r 2 4 , 0 x 0 1 8 0 ;

1 e c : 90 91 81 01 l d s r 2 5 , 0 x 0 1 8 1 ; 1 f 0 : 8 c 3 e c p i r 2 4 , 0xEC ; 1 f 2 : 91 40 s b c i r 2 5 , 0 x 0 1 ;

1 f 4 : 11 f 4 b r n e .+4 ;

1 f 6 : 5 f 98 c b i 0 x0b , 7 ; 11

1 f 8 : 14 c 0 r j m p .+40 ; 0 x 2 2 2< v e c t o r 1 7 +0xae>

e l s e i f( l i n e r o u n d == 4 9 4 ) PORTD|= VSYNC ; // One s c r e e n + V−s y n c i s made

. . . 14 / 1

(15)

num´erique

J.-M Friedt

Mise en pratique : VGA

Vitesse de commuta- tion des pixels ! : 320 ns

⇒75 pixels/ligne.

Ici on ne fait que in- verser l’´etat de la cou- leur : chercher un motif en m´emoire prend plus de temps.

Dur´ee d’affichage d’une ligne ne doit pas d´epasser 24µs.

HSYNC est d´eclench´e par interruption timer, donc ind´ependant des op´erations dans l’ISR mais lattence peut d´ependre dumain().

15 / 1

(16)

num´erique

J.-M Friedt

Comment transf´ erer efficacement

une image ?

• La r´esolution de l’image affich´ee d´epend du nombre d’informations transf´er´ees en 24µs (relecture)

• Le contenu de l’image d´epend de ce qui est stock´e en m´emoire pendant blanking

• Copie depuis une zone m´emoire index´ee par Y={R29 :R28} ou Z={R31 :R30}

142: e2 e0 ldi r30, 0x02 ; adresse de debut

144: f1 e0 ldi r31, 0x01 ; Z=1*16+2=18

146: 8e e0 ldi r24, 0x0E ; adresse de fin

148: 91 e0 ldi r25, 0x01 ; 1*16+E=30

for (k=0;k<12;k++) image[k]=0x55; // 0xff*(k&0x01);

14a: 25 e5 ldi r18, 0x55 ; valeur a stocker

14c: 21 93 st Z+, r18 ; adressage indexe’

14e: e8 17 cp r30, r24 ; cmp @ courante a fin

150: f9 07 cpc r31, r25 ;

152: e1 f7 brne .-8 ; 0x14c <main+0x78>

16 / 1

(17)

num´erique

J.-M Friedt

Comment transf´ erer efficacement

une image ?

Relecture : Y pointe sury×Xmax et affiche Xmax points (Xmax = 50 ici)

" ldi r28,lo8(image)\n"

" ldi r29,hi8(image)\n"

" lds r18,line_round\n"

" lds r19,line_round+1\n"

" ldi r20, 50\n" // X=50

" mul r20, r18\n" // poids faible

" movw r24, r0\n"

" mul r20, r19\n"// poids fort

" add r25, r0\n" // r1 inutile

" add r28, r24\n"

" adc r29, r25\n"

" ldi r25,50\n" // X

".L14: ld r24,Y+\n"

" out 0x8,r24\n"

" subi r25,1\n"

" brne .L14\n"

" out 0x8,__zero_reg__\n"

" rjmp .L115\n"

Attention :LD Rxx,Y+prend de 1 `a 3 cycles (contre 1 pourCOM)

pendant la relecture. 17 / 1

(18)

num´erique

J.-M Friedt

Table d’allocation des caract` eres

• 10 LEDs (0x000-0x3FF) encod´ees sur un short

• 10×5 pixels/caract`ere

• caract`eres affichables de la table ASCII : 32-127

• 95 caract`eres×2 octets/colonne×

5 colonnes/caract`ere=950 octets

• travail incr´emental : ajouter les caract`eres si n´ecessaire

short c[475]= // on a 2.5 KB RAM

{0x000,0x000,0x000,0x000,0x000, // space 0x000,0x3fb,0x3fb,0x000,0x000, // ! 0x000,0x000,0x000,0x000,0x000, // "

0x048,0x3ff,0x048,0x3ff,0x048, // # ...

0x3ff,0x203,0x206,0x20e,0x3f9, // 0 0x000,0x100,0x3ff,0x000,0x000, // 1 0x107,0x209,0x211,0x221,0x1c1, // 2 0x202,0x221,0x221,0x252,0x18c, // 3 0x3e0,0x020,0x020,0x3ff,0x020, // 4 0x3e1,0x221,0x221,0x212,0x20c, // 5 0x0fe,0x121,0x221,0x211,0x00e, // 6 ...

00 1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00 11001100110011

00 1100 1100 1100 11 00 1100 1100 1100 1100 11

00 1100 1100 1100 1100 1100 1100 1100 1100 1100 11

00 11 00 11 00

11 0011 0011001100110011001100110011001100110011001100110011 00 0011 0011 11 00110011001100110011 00 1100 11 00

1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00 11001100110011

00 11 00 11 00 1100110011

00 1100110011 0011001100110011001100110011001100110011

00 11 00 11 00

11 0011 0011001100110011001100110011001100110011 00 1100 00 11 1100 11

00110011001100110011 00 1100110011 00

1100 1100 1100 1100 1100 1100 1100 11

00 1100 1100 11 00 1100 1100 1100 1100 11 00 11 00 11 00 11 00 1100110011

00 0011 00 11

1100 1100 1100 1100 1100 1100 11

00 1100 1100 11 00 1100 1100 1100 11 00 110011 00 11 00 11 00 11 0011 00 11 0011

00 110011 00110011

00 1100 1100 1100 1100 1100 1100 11

00 00 11 1100 1100 1100 1100 1100 1100 11

00 11 0011001100110011001100110011

00 11 00

1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00 110011 00 1100110011

00 11 00 1100 11

00 11 00 11 0011

00 1100 1100 11

00 11

00 11 00 1100 1100 11 00 1100 1100 1100 1100 11 00 11 00 11 00 11 000011 001111

00 1100 1100 1100 1100 1100 1100 1100 1100 11

00 1100 1100 1100 1100 11 00 1100 1100 1100 1100 11

00 1100 1100 1100 1100 1100 1100 1100 1100 1100 11

00 1100 11 00 1100 1100 110011 000011001111000011001111001100110011 00 1100 11 00

0011 0011 11 0011001100110011 00 11 00 11

00 1100110011 0011001100110011

00 1100 1100 1100 1100 11 00 11 00 11 00 110011 00 11 0011 00 1100110011 001100110011000011110011

00 11 00 1100110011 00 11 001100110011001100110011001100110011

00 1100 11 0011 0000110011110011 0011

00 11 00 11 0011

00 11 00 1100 1100 1100 0011 11 00110011

00 1100 1100 1100 1100 1100 11 00 1100 11 00 11 00 1100 1100 1100 1100 1100 11 00 1100 11 00 11 00

1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00 110011 00 1100110011

00 110011 0011001100110011001100110011001100110011

00 1100 1100 1100 1100 1100 1100 1100 11

00 1100 00 11 1100 11

00 1100 1100 1100 00 11 11 00 1100 11 00 1100 1100 1100 11 00 11 00 11 0011 0011 0011 00

1100 1100 1100 1100 1100 1100 11

00 11 00 1100 1100 11 00 110011 00 11 00 11 00 11 0011 00 11

00 110011 00110011 00

1100 1100 1100 1100 1100 1100 1100 1100 11 00 11001100110011

00 1100 11 00 11 00 1100 1100 11 00 11

00 1100 1100 1100 1100 1100 1100 1100 11

00 11 00 11 00

11 0011 00110011001100110011001100110011 00 1100 1100 00 11 1100 11 00

11 0011

00 11 00 11 0011

00 1100110011 00 11 00 0011 11

00 110011 00 11

00 11 00 110011 00 11 00 11

00 1100110011

00 11 00 1100110011

00 11 00 11 00 11 00 11 001100110011

00 1100 1100 1100 1100 1100 1100 1100 11 00 110011

00 11 00 11 00 11 00 11 00 11

00 11 00 11 00 11 00 11

00 11

00 0011 0011 0011 1100 1100110011

00 1100 11

00 1100 11 00 11 001100110011

00 1100 1100 1100 1100 1100 1100 1100 11001100110011

00 11 00 11 0011

00 11

00 11

00 11 00 1100 11 00 11

00 11 00 11 00 11 0011

00 11 00 11

00 11 00 1100 11

00 1100 11 00 11

00 11 00

11 0011 00110011

00

11 0011

00 11 00 11 00 1100 1100 11 00 1100110011 00

110011

00 1100110011

00 11

00 11

00 0011 11 00 1100 1100110011 0011

00 0011 11 00 1100 11 00 1100110011

00 0011 11 00110011

00 1100 1100 11 00 1100 1100 1100 11 00 11 0011 0011

00 11 0011 00 1100110011001100110011 00 11

00 11 00110011 00110011

00 1100 11 00 0011 11 00 0011 11 00 11 00110011001100110011

00 1100 11 00 1100 1100 11 00 1100 1100 1100 1100 11 00 1100 1100 1100 11 000011001111 00 110011 00 110011 0011 00110011

00 110011

00 11 00 0011 0011 1100 1100 11 00110011001100110011

00 11001100110011

00 1100110011 00

11

00 1100 11 00 110011 00

1100110011 001100110011

00 1100 1100 11 00 1100 1100 11

00 11 00 1100 1100 11

00 1100 1100 1100 1100 1100 1100 1100 1100 1100 11 00

11 0011 00110011 0011001100110011 00 1100 1100 1100 1100 11 00 11 00 11 00 11

00 1100 1100 1100 1100 11 00110011 00

11 00 11 0011

00 11 00 11 00 1100110011001100110011

00 11

00 110011001100110011

00 110011

00 1100 11 00 11

00 11

00 11001100110011 00 110011 00 11 0011000011001111

00 1100110011 00 11

00 1100 1100 1100 11 00

11 00110011 001100110011001100110011001100110011 0011 0011 00 11 001100110011 00 1100 11 00 11 0011

00 11 00 11 00 1100 1100 1100 11 00 1100 1100 1100 11

00 11 0011 0011 00 11 0011 0011

0x3ff 0x210 0x220 0x250 0x18f 0x3ff

0x020 0x3ff 0x020 0x020

0x3ff 0x221 0x221 0x221 0x221

0x3ff 0x001 9

0

0x001 0x001 0x001

0x1fe 0x303 0x201 0x303 0x1fe

0x000 0x000 0x000 0x000 0x000

0x3ff 0x201 0x201 0x102 0x0fc 0x3fc 0x003 0x01e 0x003 0x3fc

0x3ff 0x0c0 0x3ff 0x078 0x00c

0x3ff 0x220 0x220 0x240 0x180

0x3ff 0x203 9

0

0x206 0x20e

0x3f9 0x200

0x3fe 0x001 0x001 0x001 0x3fe

0x380 0x040 0x03f 0x040 0x380 0x3fc 0x002 0x001 0x002 0x3fc

0x38f 0x050 0x020 0x050 0x38f 0x0c1

0x321 0x221 0x20c 0x200

0x200 0x3ff 0x300 0x213 (127−32) caracteres * 5 shorts = 950 octets

0x1ff 0x320 0x320

0x3ff 0x221 0x221 0x352 0x08c

0x1fe 0x303 9

0

0x201 0x201 0x201

0x1fe 0x303 0x323 0x13e

0x201 0x004 0x3ff

0x203 0x201 0x203

0x3ff 0x260 0x090 0x108 0x207 0x120

0x1ff

0x3ff 0x220 0x220 0x220 0x200

0x221 0x201 0x201 0x3ff 0x201

0x3fc 0x3ff0x100 0x100 0x0c0

0x203 0x20d 0x381 0x211 0x231

0x3fc 0x202 0x231 0x231 0x1c2

0x000 0x100 9

0

0x3ff 0x000

0x000 0x18c

0x3e0 0x020 0x020

0x200 0x200 0x23f 0x240 0x380 0x3e1 0x221 0x212 0x20c

0x0fe 0x121 0x221 0x211 0x00e 0x107

0x209 0x211 0x1c1 0x252

0x221 0x221 0x202

0x221 0x3ff

0x020

0x2de 0x121 0x2de 0x121 0x121

0x221 0x221 0x221 0x1fe

0x3ff 0x203 9

0

0x206 0x20e

0x3f9 0x000

0x000 0x003 0x003 0x000 0x000

0x000 0x3fb 0x3fb 0x000 0x000 0x007 0x00c 0x030 0x0c0 0x380

0x048 0x3ff 0x048 0x3ff 0x048 0x000

0x06c 0x06c 0x000 0x0000x06e

0x000 0x000

0x06d 0x1c2

0x221

18 / 1

(19)

num´erique

J.-M Friedt

Probl` eme de gestion de m´ emoire

Seulement 2,5 KB de RAM, mais table de caract`eres est statique donc on peut la mettre en flash (32 KB) ... sauf sur une architecture Harvard.

• Sur MSP430 (Von Neumann), sans puis avecconst:

msp430-gcc -mmcu=msp430f1611 -O0 -o 3pov_memoire.msp430 3pov_memoire.c msp430-size 3pov_memoire.msp430sansconst

text data bss dec hex filename

112 966 2 1080 438 3pov_memoire.msp430sansconst msp430-size 3pov_memoire.msp430avecconst

text data bss dec hex filename

1062 16 2 1080 438 3pov_memoire.msp430avecconst

• Sur Atmega32U4 (Harvard), sans puis avecconst:

avr-gcc -mmcu=atmega32u4 -O0 -Wall -o 3pov_memoire.avr 3pov_memoire.c avr-size 3pov_memoire.avrsansconst

text data bss dec hex filename

232 966 0 1198 4ae 3pov_memoire.avrsansconst

avr-size 3pov_memoire.avravecconst

text data bss dec hex filename

232 966 0 1198 4ae 3pov_memoire.avravecconst

(textva en flash, dataetbssen RAM)

19 / 1

(20)

num´erique

J.-M Friedt

Conclusion

• Seul l’assembleur permet une analyse fine du temps d’ex´ecution d’un programme

• Seul l’assembleur permet de connaˆıtre le nombre de cycles n´ecessaires `a une op´eration (bijection avec le langage machine)

• L’assembleur ne permet que des op´erations atomiques⇒fastidieux

` a ´ecrire

• Le compilateur C nous fournit le code assembleur interm´ediaire : utile de savoir lire et analyser.

• Levraitemps r´eel fin n´ecessite le passage au niveau de la porte logique : FPGA/CPLD

Exemple d’affichage de la pile parsimavr

20 / 1

(21)

num´erique

J.-M Friedt

Conclusion

• Seul l’assembleur permet une analyse fine du temps d’ex´ecution d’un programme

• Seul l’assembleur permet de connaˆıtre le nombre de cycles n´ecessaires `a une op´eration (bijection avec le langage machine)

• L’assembleur ne permet que des op´erations atomiques⇒fastidieux

` a ´ecrire

• Le compilateur C nous fournit le code assembleur interm´ediaire : utile de savoir lire et analyser.

• Levraitemps r´eel fin n´ecessite le passage au niveau de la porte logique : FPGA/CPLD

const struct avr_mmcu_vcd_trace_t _mytrace[] _MMCU_ = { {AVR_MCU_VCD_SYMBOL("PORTC"), .what=(void*)(0x28),}, // &PORTC

{AVR_MCU_VCD_SYMBOL("STACK"), .what=(void*)(0x5D),}, // stack=0x3{DE}+0x20 };

Exemple d’affichage de la pile parsimavr

21 / 1

Références

Documents relatifs

Liste des registres dans la datasheet du microcontrˆ oleur (STM32F4) ⇒ utilisation des masques pour d´ efinir un bit individuel. Extraits de datasheets

2 En gardant le mˆ eme programme principal, proposer une architecture de programme qui permette d’ex´ ecuter ce mˆ eme programme sur STM32. 3 Proposer deux Makefile qui automatisent

• Ce programme fait exclusivement appel ` a des fonctions g´ en´ eriques ind´ ependantes du mat´ eriel : stubs. • L’acc` es de ces fonctions au mat´ eriel est impl´ ement´ e

L3 : aspects analogiques, consommation ´ electrique, lecture de datasheet Survol des divers p´ eriph´ eriques qui seront abord´ es (RS232, SPI, timer, ADC) repr´ esentation des

• virgule flottante simple pr´ ecision float et double pr´ ecision double Utiliser le type pr´ esentant le meilleur compromis espace/pr´ ecision des donn´ ees (analyse

6 N´ ecessit´ e de connaˆıtre la fr´ equence d’´ echantillonnage f e pour tout traitement num´ erique du signal (axe des fr´ equences normalis´ e par f e /2). Exercice :

• probl` eme : plusieurs tˆ aches, une ressource : comment garantir l’int´ egrit´ e des acc` es.. • probl` eme : les tˆ aches veulent ´ echanger des donn´ ees : comment

AlejandroGonzal,ez lnarriturisquederaflerlamiseavec 'Babel', filmsurI1ncommunicabilité et lacornpassion, avecBradPittetrate Blanchett.dans lesrôlestitres.Cepen- dantl'actrice