INDEX
DOCS →
[Config]
[MIPS U]
[MIPS K]
[markdown]
[CR.md]
COURS →
[1 (+code) (+outils)]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
TME →
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
CODE →
[test]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
8 - Périphériques initiateurs et API graphique
Pas de question de cours cette fois. Je vais vous demander d'expérimenter le code et je pose quelques questions
01_sequentiel
Dans cette version, il n'y a pas d'OS, tout est fait dans la fonction kinit()
et le code de commandes des périphériques est dans harch.c
Les trois étapes (lecture disque, traitement, affichage) sont faites séquentiellement
Questions
- Ouvrez le code pour voir la boucle de traitement.
- Faites tourner la simulation, la durée de chaque étape s'affichent.
- Quelle est la durée de chaque étape ?
- Que pouvez-vous en conclure ?
- Essayez de retirer les invalidations du cache (dans
harch.c)- Observez et expliquer le comportement.
- En déplaçant, l'instruction qui prend la valeur de clock(),
déterminer le nombre de cycles nécessaire à l'invalidation du buffer.
C'est long, pourquoi ?
- Expliquez l'usage des couples de variables globales utilisées pour la synchronisation des étapes.
(BDBusyetBDLock) et (DMABusyetDMALock).
02_parallel
Dans cette version, les trois étapes doivent être faites en parallèle sous la forme d'un pipeline avec deux couples de buffer utilisés en alternance.
- Disk->BD->BUFIN[0] - Disk->BD->BUFIN[1] & BUFIN[0]->CPU->BUFOUT[O] - Disk->BD->BUFIN[0] & BUFIN[1]->CPU->BUFOUT[1] & BUFOUT[0]->DMA->FBF - Disk->BD->BUFIN[1] & BUFIN[0]->CPU->BUFOUT[0] & BUFOUT[1]->DMA->FBF - Disk->BD->BUFIN[0] & BUFIN[1]->CPU->BUFOUT[1] & BUFOUT[0]->DMA->FBF - Disk->BD->BUFIN[1] & BUFIN[0]->CPU->BUFOUT[0] & BUFOUT[1]->DMA->FBF - Disk->BD->BUFIN[0] & BUFIN[1]->CPU->BUFOUT[1] & BUFOUT[0]->DMA->FBF - Disk->BD->BUFIN[1] & BUFIN[0]->CPU->BUFOUT[0] & BUFOUT[1]->DMA->FBF - etc.
Questions
- Qu'est ce qu'on gagne à procéder ainsi ?
- Est-ce qu'on peut gagner plus et si oui comment faire (en supposant qu'on a plusieurs processeurs dans le SoC).
Vous devez regarder la durée de chaque étape (chargement/calcul/affichage)
03_sdl
Le code ici utilise la version de ko6 vue dans les TP précédents. Il y a un service permettant de lire le clavier sans être bloquant qui a été ajouté, mais c'est tout. Tout le code de la sdl se trouve dans le programme utilisateur. A terme, il faut que ce soit dans une librairie, comme la libc, mais ce n'est pas fait.
Il y a deux applications sdl presque identiques.
- dans
uapp0: il y a un affichage mais sans gestion d'événements. - dans
uapp1: il y a la gestion d'événements.
03_sdl
├── Makefile
├── common
│ ├── debug_off.h
│ ├── debug_on.h
│ ├── errno.h
│ ├── esc_code.h
│ ├── list.h
│ ├── syscalls.h
│ └── usermem.h
├── kernel
│ ├── Makefile
│ ├── harch.c
│ ├── harch.h
│ ├── hcpu.h
│ ├── hcpua.S
│ ├── hcpuc.c
│ ├── kernel.ld
│ ├── kinit.c
│ ├── klibc.c
│ ├── klibc.h
│ ├── kmemory.c
│ ├── kmemory.h
│ ├── ksynchro.c
│ ├── ksynchro.h
│ ├── ksyscalls.c
│ ├── kthread.c
│ └── kthread.h
├── tags
├── uapp0
│ ├── MakeLinux
│ ├── Makefile
│ ├── aff_noevent.c
│ ├── ksdl.h
│ └── main.c
├── uapp1
│ ├── MakeLinux
│ ├── Makefile
│ ├── aff_event.c
│ ├── ksdl.h
│ └── main.c
└── ulib
├── Makefile
├── crt0.c
├── libc.c
├── libc.h
├── memory.c
├── memory.h
├── thread.c
├── thread.h
└── user.ld
Pour tester sur Linux/PC, vous pouvez allez dans uapp0 et exécuter l'application avec Linux/PC, dans tp3/03_sdl/uapp0
make -f MakeLinux ./aff_noevent
Vous pouvez alors tester ce même code sur ko6/almo1 dans tp8/03_sdl.
Le fichier tp8/03_sdl/Makefile contient la variable APP à 0 par défaut.
make exec
Vous pouvez aussi tester la version avec gestion des évènements du clavier dans uapp1.
Pour Linux : les évènement attendu sont les touches 'm' et 'p' pour changer le nombre de frames par seconde, et 'o' et 'l' pour changer la vitesse des balles.
make -f MakeLinux ./aff_event
et tester sur ko6/almo1 en choisissant APP=1.
Là, je devrais vous expliquer le code et vous demander de programmer un petit jeu... mais je ne vais pas le faire...
