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
[[Image(htdocs:img/image-seq.png,nolink,center,height=300)]]
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.\\(`BDBusy` et `BDLock`) et (`DMABusy` et `DMALock`).
== 02_parallel
[[Image(htdocs:img/image-parallel.png,nolink,center,height=230)]]
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)
{{{#!comment
Pour ceux qui veulent, on peut aussi paralléliser le traitement CPU en mettant plusieurs processeurs dans la plateforme (htdocs:files/04_multicore.tgz)
}}}
== 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.
1. dans `uapp0` : il y a un affichage mais sans gestion d'événements.
2. 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`
{{{#!bash
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.
{{{#!bash
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.
{{{#!bash
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...