{{{#!html

INDEX

}}} [[PageOutline]] **DOCS** → [__**[wiki:Howto-TP Config]**__] [__**[htdocs:cours/doc_MIPS32.pdf MIPS U]**__] [__**[wiki:Doc-MIPS-Archi-Asm-kernel MIPS K]**__] [__**[http://support.typora.io/Markdown-Reference markdown]**__] [__**[htdocs:files/CR031_TPx_Nom1_Nom2.md.tgz CR.md]**__] \\**COURS** → [__**[htdocs:cours/Archi-2-B1-reboot-2p.pdf 1]**__ __([htdocs:cours/Archi-2-B1-code-2p.pdf +code]__) __([htdocs:cours/Archi-2-B1-outils-2p.pdf +outils]__)] [__**[htdocs:cours/Archi-2-B2-interruptions-2p.pdf 2]**__] [__**[htdocs:cours/Archi-2-B3-cache-archi-2p.pdf 3]**__] [__**[htdocs:cours/Archi-2-B4-cache-perf-2p.pdf 4]**__] [__**[htdocs:cours/Archi-2-B5-threads-2p.pdf 5]**__] [__**[htdocs:cours/Archi-2-B6-alloc-2p.pdf 6]**__] [__**[htdocs:cours/Archi-2-B7-synchro-2p.pdf 7]**__] [__**[htdocs:cours/Archi-2-B8-initiateurs-2p.pdf 8]**__] [__**[htdocs:cours/Archi-2-B9-ZDL-2p.pdf 9]**__] \\**TME → ** [__**[wiki:AS6-TME-B1 1]**__] [__**[wiki:AS6-TME-B2 2]**__] [__**[wiki:AS6-TME-B3 3]**__] [__**[wiki:AS6-TME-B4 4]**__] [__**[wiki:AS6-TME-B5 5]**__] [__**[wiki:AS6-TME-B6 6]**__] [__**[wiki:AS6-TME-B7 7]**__] [__**[wiki:AS6-TME-B8 8]**__] [__**[wiki:AS6-TME-B9 9]**__] \\**CODE → ** [__**[htdocs:files/test.tgz test]**__] [__**[htdocs:files/tp1.tgz 1]**__] [__**[htdocs:files/tp2.tgz 2]**__] [__**[htdocs:files/tp3.tgz 3]**__] [__**[htdocs:files/tp4.tgz 4]**__] [__**[htdocs:files/tp5.tgz 5]**__] [__**[htdocs:files/tp6.tgz 6]**__] [__**[htdocs:files/tp7.tgz 7]**__] [__**[htdocs:files/tp8.tgz 8]**__] [__**[htdocs:files/tp9.tgz 9]**__] {{{#!html

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...