{{{#!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 }}} {{{#!html En travaux

}}} 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()` 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. Que pouvez-vous en conclure ? - Essayez de retirer les invalidations du cache (dans `harch.c`), observez et expliquer le comportement. - Expliquez l'usage des couples de variables globales (`BDBusy` et `BDLock`) et (`DMABusy` et `DMALock`) utilisées pour la synchronisation des étapes. == 02_parallel [[Image(htdocs:img/image-parallel.png,nolink,center,height=230)]] Dans cette version, les trois étapes sont faites en parallèle sous la forme d'un pipeline avec deux couples de buffer utilisés en altenance. {{{ - 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). 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, vous pouvez allez dans `uapp0 et exécuter l'application avec Linux/PC, dans `tp3/03_sdl/uapp0` {{{#!bash make -f MakeLinux ./aff_event }}} Vous pouvez alors tester ce même code sur ko6/almo1 dans `tp8/03_sdl` {{{#!bash make exec }}} Je ne pose pas de questions... Je me suis mal organisé. Par conséquent, je vais faire une petite revue de code en TP... et après ceux qui le veulent pourraient tenter de faire un jeu, par exemple le jeu de la vie.