Title: Le langage C suite
1Le langage C (suite)
Cours 6 - GPA787
2Combinaison du langage C avec lassembleur
/ testc01.c / / Programme appelant une routine
assembleur / extern void somme(int,int) /
Fonction externe / / assembleur ne
retournant / / pas de valeur / int
total / Le resultat est stocke dans cette
variable / / globale
/ main() int i7, j9 somme(i,j)
Programme en assembleur
3Combinaison du langage C avec lassembleur
_main ldiu 9,r1 ldiu
7,r0 push r1 push r0
call _somme
Call Occurs subi
2,sp unsigned rets
Le main C assemblé
4Combinaison du langage C avec lassembleur
testa01.asm Programme de la somme
.global _somme routine _somme declaree
globale .global _total variable
_total declaree globale _somme push
R0 push R1 push AR0
ldi SP,AR0 ldi -AR0(4),R0
ldi -AR0(5),R1 addi R1,R0
sti R0,_at__total resultat stocke dans
_total. pop AR0 pop R1
pop R0 rets
Remarquez le _
5Combinaison du langage C avec lassembleur
/ testb01.cmd Fichier de commande de compilation
/ -cr / Linker en utilisant la
convention C / -stack 100 -heap 100 testa01.obj
test01c.obj / Fichiers de code objet
/ -l rts30.lib / Librairie / -O test01.out
/ Fichier compile / -m test01.map /
Fichier listing / MEMORY RAM org
0x809800 len 0x800 SECTIONS .text
gt RAM / Code /
.cinit gt RAM / Tables
d'initialisation / .stack gt RAM
/ Pile systeme / .bss
gt RAM / Section BSS /
.sysmem gt RAM
6Combinaison du langage C avec lassembleur
/ testc02.c / / Programme appelant une routine
assembleur / extern int somme(int,int) /
Fonction externe assembleur / /
retournant une valeur / int main() int i7,
j9, total total somme(i,j) total
10 return(total)
Programme en assembleur qui doit retourner une
valeur
7Combinaison du langage C avec lassembleur
_main ldiu 9,r1 ldiu
7,r0 push r1 push r0
call _somme
Call Occurs subi 2,sp
unsigned addi
10,r0 rets
Le main C assemblé
Résultat retourné dans le registre R0
8Combinaison du langage C avec lassembleur
testa01.asm Programme de la somme
.global _somme routine _somme declaree
globale _somme push R1 push
AR0 ldi SP,AR0 ldi
-AR0(3),R0 ldi -AR0(4),R1
addi R1,R0 le resultat est
retourné au C via R0. pop
AR0 pop R1 rets
9Combinaison du langage C avec lassembleur
/ testb02.cmd Fichier de commande de compilation
/ -cr / Linker en utilisant la
convention C / -stack 100 -heap 100 testa02.obj
test02c.obj / Fichiers de code objet
/ -l rts30.lib / Librairie / -O test02.out
/ Fichier compile / -m test02.map /
Fichier listing / MEMORY RAM org
0x809800 len 0x8000 SECTIONS .text
gt RAM / Code /
.cinit gt RAM / Tables
d'initialisation / .stack gt RAM
/ Pile systeme / .bss
gt RAM / Section BSS /
.sysmem gt RAM
10Les structures
- Certaines données peuvent êtres combinées
ensembles pour former des structures.
11Définition dune structure
Nom de la structure
struct book char title41 char
author31 float price
Éléments de la structure
12Allocation mémoire de la structure
41 mots
struct book char title41 char
author31 float price
31 mots
1 mots
62 mots de 32 bits
13Utilisation dune structure
Déclaration
struct book libry
Initialisation
struct book libry Demain les
chiens,Clifford Simak,8.50
Assignation
libry.price 8.75
Opérateur de membership
14Utilisation dune structure
gets(libry.title) scanf(f,libry.price)
15Que faire si jai plus dun livre
struct book libry21 ... gets(libryi.title) g
ets(libryi.author) scanf(f,libryi.price)
libry2.title -- OK! libry.title2 --
Erreur libry2.title4 -- 5ième caractère du
2ième titre.
16Structure dans une structure
struct names char first20 char
second20 struct guy struct names
handle char favfood20 char job20 float
income
17Structure dans une structureaccès au contenu
struct guy fellow5 ... printf(Emploi s,
fellow1.job) printf(Prénom s,
fellow2.handle.first)
18Structures et pointeurs
struct guy fellow5 struct guy him ... him
fellow0 / Initialisation du pointeur
/ printf(Salaire f, him-gtincome) printf(Pré
nom s, him- gthandle.first)
Opérateur de membership indirect
19Structures et fonctions
struct funds char bank20 float
bankfund char save20 float savefund stan
Caisse pop.,2000.25, REER,123.25
20Structures et fonctions(exemple 1)
float sum(float, float) / déclaration de
fonction / void main(void) float total
total sum(stan.bankfund,stan.savefund)
... float sum(float x, float y)
return(xy)
21Structures et fonctions(exemple 2)
float sum(struct funds ) / déclaration de fnct
/ void main(void) float total total
sum(stan) ... float sum(struct funds
money) return(money-gtbankfund
money-gtsavefund)
22Structures et fonctions(exemple 3)
float sum(struct funds) / déclaration de fnct
/ void main(void) float total total
sum(stan) ... float sum(struct funds
cash) return(cash.bankfund
cash.savefund)
23Exemple de structure
/ testc03.c / / Programme utilisant une
structure / struct complexe / Definition
d'un nombre complexe / int real
int imag struct complexe total / total
est un nombre complexe / void mulcom(struct
complexe,struct complexe) / Multiplication
complexe / int main() struct complexe
valeur3 valeur0.real 3 / valeur0
3 4j / valeur0.imag 4
valeur1.real 3 / valeur1 3 - 4j /
valeur1.imag -4 mulcom(valeur0,valeur1
) / resultat prevu 25 0j stocke dans total
/ void mulcom(struct complexe toto,struct
complexe tata) total.real
toto.realtata.real - toto.imagtata.imag
total.imag toto.realtata.imag
toto.imagtata.real
24Déclaration dune union
union hold int digit double bigfloat char
letter
25Utilisation dune union
union hold fit union hold save10 union hold
pu / pointeur vers union / ... fit.digit
23 / 23 sauvé sous forme int / fit.bigfloat
2.0 / 2.0 remplace 23 (float) / fit.letter
h / h remplace 2.0 (char) /
fit.letter A flnum 3.02fit.bigfloat
/ERREUR /
26Utilisation dune union
pu fit / initialisation du pointeur / x
pu-gtdigit / x fit.digit /
27Le typedef
typedef float REAL REAL x, y10, z
typedef char STRING STRING name, sign / char
name, sign /
typedef struct float real float imag
COMPLEX COMPLEX x, y
28Les bits fields
struct unsigned autfd 1 / bit 0
normals/ unsigned bldfc 1 / bit 1
gras/ unsigned undln 1 / bit 2
souligné/ unsigned itals 1 / bit 3
italique/ prnt prnt.itals 0 prnt.undln
1
29Les bits fields
struct unsigned code1 2 / bits 0 et 1
/ unsigned code2 2 / bits 2 et 3
/ unsigned code3 8 / bits 4 à 11 /
prcode prcode.code1 0 prcode.code2
3 prcode.code3 102
30Les bits fields
struct unsigned field1 1 / bit 0
/ unsigned 2 / bits 1 et 2
/ unsigned field2 1 / bit 3 / unsigned
0 / nouveau mot / unsigned code3
1 / bit 0 / stuff stuff.field2 0
31Les interruptions en C
- Sur le DSP nous recourons très souvent aux
interruptions. - Les sources sont
- Reset
- Broches des interruptions externes
- Périphériques sur CI (AIC)
- DMA
- Traps.
32Les interruptions en C
- Pour utiliser les interruptions en C, nous devons
procéder comme suit - ? Créer les routines dinterruption
- ? Initialiser la table des vecteurs
dinterruption - ? Activer les interruptions au CPU
- ? Activer les sources dinterruption.
33? Créer les routines dinterruption en C
- Une routine dinterruption en C ne se distingue
en rien dune routine ordinaire. - Seul le nom diffère
- le nom d une routine d interruption est c_intnn
- nn est un nombre variant de 00 à 99.
34? Créer les routines dinterruption en C
- Tous les registres utilisés dans la routine
dinterruption sont à sauvegarder. - Exemple dune routine dinterruption en C
35? Créer les routines dinterruption en C
- Comment mettre un nom plus descriptif ?
- intc00 est un nom réservé pour linitialisation
36? Créer les routines dinterruption en C
- Toutes les variables utilisées dans une routine
dinterruption doivent êtres globales. - volatile int input, output
- déclaré avant le main.
37? Initialiser la table des vecteurs
dinterruption (C)
- Il faut stocker dans la table des vecteurs
dinterruption ladresse de la routine
dinterruption.
38? Initialiser la table des vecteurs
dinterruption (C)
- Il existe 2 façons de placer ladresse de la
routine dans la table des vecteurs. - A- En utilisant la convention assembleur
- B- Installer un vecteur directement du C.
39? Initialiser la table des vecteurs
dinterruption (C)
- A- En utilisant la convention assembleur
- .sect vectors
- INT1 br _c_int01
- La routine assembleur doit contenir l indication
d une référence externe - .ref _c_int01
40? Initialiser la table des vecteurs
dinterruption (C)
- Que faire si certains vecteurs ne sont pas
utilisés ? - Utiliser simplement la directive .space pour
sauter les interruptions non utilisées. - .sect vectors
- .space 3
- INT1 br _c_int01
41? Initialiser la table des vecteurs
dinterruption (C)
- Effet sur le fichier de linkage (.cmd)
42? Initialiser la table des vecteurs
dinterruption (C)
- B- Installer un vecteur directement du C
((void () ()) 0x8098fc1) c_int01
43? Activer les interruptions au CPU
- Avant dutiliser les interruptions, il faut les
activer (ou débloquer). - Cela est fait en 2 endroits
- Le masque des interruptions IE
- Le bit global dactivation des interruptions dans
le registre de status GIE.
44? Activer les interruptions au CPU
- Le registre IF contient le status des
interruptions et il doit être mis à 0 pour
effacer toute demande dinterruption lors de
linitialisation.
45? Activer les interruptions au CPU
- Initialisation
- Accès aux registres d interruption via
l assembleur - Routine assembleur appelée par le C
46? Activer les interruptions au CPU
- Accès aux registres dinterruption via
lassembleur
47? Activer les interruptions au CPU
- Routine assembleur appelée par le C
extern void initIE(unsigned int) initIE(0x1)
_initIE PUSH FP LDI SP,FP LDI -FP(2),IE LDI
-FP(1),R1 BD R1 LDI FP,FP NOP SUBI 2,SP
Branchement ici pas de RTS.
48? Activer les sources dinterruption
- Après que tous les préparatifs soient faits, on
permet maintenant aux éléments externes de faire
des interruptions.
49Exemple dutilisation dinterruption
/
/ / TEST.C - Test
program / /
/ include
"vecs.h" /
/ / MAIN -
Main routine / /
/ volatil
e int total0 void main(void) initInts() /
Enable interrupts / for() / Replace
with real code /
50Exemple dutilisation dinterruption
/
/ / INITVECS.C -
Interrupt vector routines / /
/ /
/ / C_INT99 -
Interrupt service routine / /
/ define dummyISR c_int99 / Rename ISR to
correspond to TI / extern total / naming
conventions / void dummyISR(void) total
/ Replace with real ISR /
51Exemple dutilisation dinterruption
INIT.ASM - C-callable ASM routine to
initialize interrupts
function
prototype void initInts(void) .file "init.asm"
.global _initInts FP .set
AR3 _initInts PUSH FP sauvegarde de AR3 LDI
SP,FP pile dans AR3 LDI 0h,IF clear IF
register OR 3h,IE enable INT0 INT1 OR
2000h,ST set GIE bit to one to globally
enable interrupts LDI -FP(1),R1 adresse
de retour, pas de rts BD R1 branchement quand
pipeline est vide LDI FP,FP on ramène AR3 de
la pile NOP SUBI 2,SP on repositionne le
SP B R1 branch occurs here (((PAS DE RTS)))
52Exemple dutilisation dinterruption
/
/ / VECS.H - Header
file for interrupt vector program
/ /
/ extern void
initInts()
53Exemple dutilisation dinterruption
VECS.ASM Interrupt
vector branch table for the C31 (Bootloader
Mode)
.title "vecs.asm" file name .ref
_c_int99 reference all
interrupt vectors declared elsewhere
Interrupt vectors
.sect "vectors" define named
section interrupt branches br
_c_int99 branch to interrupt vector 1
br _c_int99 branch to interrupt
vector 2 note use of long-immediate addr
essing mode branch (br) .end end of file
54Exemple dutilisation dinterruption
/ TEST.CMD - C31 linker command file
/ /
/ -c vecs.obj initi.o
bj initvecs.obj test.obj -mtest.map -otest.out -st
ack 0x400 -heap 0x400 -lrts30.lib
55Exemple dutilisation dinterruption
/ SPECIFY THE SYSTEM MEMORY MAP
/ MEMORY SRAM org 0x0 len 0x100 EXT0
org 0x100 len 0x3f00 / EXTERNAL MEMORY /
RAM0 org 0x809800 len 0x7C1
/ RAM BLOCK 0 / VECS org 0x809FC1 len
0x3f / SPECIFY THE SECTIONS ALLOCATION INTO
MEMORY / SECTIONS "vectors" gt VECS
.text gt RAM0 .bss gt RAM0
.cinit gt RAM0 .const gt RAM0
.stack gt RAM0 .sysmem gt RAM0
56Exemple de balayage (loopall.c)
/ Programme d'initialisation du AIC / define
TWAIT while(!(PBASE0x40 0x2)) int AICSEC4
0x1428, 0x1, 0x4A96, 0x67 volatile int PBASE
(volatile int ) 0x808000 void AICSET()
volatile int loop, loupe PBASE0x28
0x00000002 / Timer period / PBASE0x20
0x000002C1 / Timer control register / asm("
LDI 000000002h,IOF") for(loop 0
loop lt 250 loop) PBASE0x42 0x00000111
/ / PBASE0x43 0x00000111 / /
PBASE0x40 0x0E970300 / Serial global
control register / PBASE0x48 0x00000000
/ Clear xmit register / asm(" OR
000000006h,IOF")
57Exemple de balayage (loopall.c)
for(loop 0 loop lt 4 loop) TWAIT
for(loupe0 loupelt50 loupe) PBASE0x48
0x3 for(loupe0 loupelt50 loupe)
TWAIT for(loupe0 loupelt50 loupe)
PBASE0x48 AICSECloop for(loupe0
loupelt50 loupe)
58Exemple de balayage (loopall.c)
int UPDATE_SAMPLE(int output) int input
TWAIT PBASE0x48 output ltlt 2 input
PBASE0x4C ltlt 16 gtgt 18 return(input) main(
) int data_in, data_out AICSET()
while(1) data_in UPDATE_SAMPLE(data_out)
data_out data_in
59Exemple de balayage (loopall.cmd)
/ Fichier de commande / -c /
Linker en utilisant la convention C
/ loopall.obj / Fichier de code objet
/ -l rts30.lib / Librairie / -O loopall.out
/ Fichier compile / -m loopall.map /
Fichier listing / MEMORY VECS org
0x809FC0 len 0x40 RAM org 0x809800
len 0x0700 SECTIONS .text gt RAM
/ Code / .cinit
gt RAM / Tables d'initialisation /
.stack gt RAM / Pile systeme
/ .bss gt RAM /
Section BSS / vecs gt
VECS