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
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
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
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
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
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
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
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
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
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
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
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 // H−SYNC = PORTD6
#d e f i n e VSYNC 0 x 8 0 // V−SYNC = 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
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
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
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
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
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
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
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
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
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