28
TP Temps Réel Jérôme Pouiller <[email protected]> Polytech’ Paris - Mars 2012 Table des matières 1 Avant de commencer 2 1.1 Documentation .................................................... 3 1.1.1 Références des pages de man ......................................... 3 1.1.2 Standards ................................................... 3 1.2 Erreurs ......................................................... 3 1.3 Compilation ...................................................... 3 2 Watch file 4 2.1 Par scrutation ..................................................... 4 2.2 Par notification .................................................... 4 3 Ordonnancement 5 3.1 Rate Monotonic .................................................... 5 3.2 Earliest Deadline First ................................................ 5 3.3 Ordonnancement conjoint ............................................... 6 3.4 Serveurs de tâches asynchrones ............................................ 6 3.5 Sporadic Server .................................................... 7 3.6 Serveurs différé et sporadique ............................................ 7 3.7 Partage de ressources - Inversions de priorités .................................... 8 3.8 Partage de ressources - Dead Locks ......................................... 9 3.9 Inversion de priorité - 1 ................................................ 9 3.10 Inversion de priorité - 2 ................................................ 10 3.11 Inversion de priorité - 3 ................................................ 10 3.12 Contraintes de précédence .............................................. 11 4 Protection des structures de données 11 5 Tricky conditions 13 6 Structures de données et mutex 14 7 Protection de ressources 15 8 Threads et mutex 16 9 Tâches et sémaphores Xenomai 17 1

Realtime

  • Upload
    android

  • View
    219

  • Download
    2

Embed Size (px)

DESCRIPTION

Realtime

Citation preview

TP Temps RelJrme Pouiller Polytech Paris - Mars 2012Table des matires1 Avant de commencer 21.1 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.1 Rfrences des pages de man . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.2 Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3 Compilation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Watch le 42.1 Par scrutation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 Par notication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Ordonnancement 53.1 Rate Monotonic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.2 Earliest Deadline First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.3 Ordonnancement conjoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.4 Serveurs de tches asynchrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.5 Sporadic Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.6 Serveurs diffr et sporadique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.7 Partage de ressources - Inversions de priorits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.8 Partage de ressources - Dead Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.9 Inversion de priorit - 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.10 Inversion de priorit - 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.11 Inversion de priorit - 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.12 Contraintes de prcdence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Protection des structures de donnes 115 Tricky conditions 136 Structures de donnes et mutex 147 Protection de ressources 158 Threads et mutex 169 Tches et smaphores Xenomai 1711 AVANT DE COMMENCER10Implmentation dordonnanceurs 1810.1 Algorithmes dordonnancement de tches indpendantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1810.2 Algorithmes dordonnancement de tches apriodiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1810.3 Ordonnancement et ressources partages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1911Libtimer 1911.1 Version synchrone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2211.2 Version asynchrone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2212Calculs et temps rel 2212.1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2212.2 criture du Watchdog. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2312.3 Ecriture de lISR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23A Instructions dinstallation de la machine virtuelle Xenomai 24A.1 Mise en service de limage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24A.2 Lenvironnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24A.2.1 Se connecter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24A.2.2 Sauver son travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24A.2.3 Acceder internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24A.2.4 Travailler avec emacs, geany, etc... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25B criture des programmes Xenomai 25B.1 Documentation de Xenomai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25B.2 Compilation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25B.3 Vrouillage de la mmoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25B.4 A propos des noms des objets Xenomai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25B.5 Gestion des Erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26B.6 Excution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26C criture des modules noyau 26C.1 Compilation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26C.2 Excution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26C.3 Log Buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26D Modalits de rendu 27E Modalits de rendu 271 Avant de commencerCette section est purement informative. Il ny a pas de questions lintrieur.21.1 Documentation 1 AVANT DE COMMENCER1.1 Documentation1.1.1 Rfrences des pages de manComme le veut lusage, les rfrences des pages de man sont donns avec le numro de section entre parenthses. Ainsi, wait(2)signie que vous pouvez accder la documentation avec la commande man 2 wait. Si vous omettez le numro de section,man recherchera la premire page portant le nomwait (ce qui fonctionnera dans 95% des cas). Le numro de section vous donneaussi une indication sur le type de documentation que vous aller trouver. Daprs man(1), voici les diffrentes sections :1. Executable programs or shell commands2. System calls (functions provided by the kernel)3. Library calls (functions within program libraries)4. Special les (usually found in /dev)5. File formats and conventions (e.g. /etc/passwd)6. Games7. Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)8. System administration commands (usually only for root)9. Kernel routines [Non standard]Vous pouvez trouver une version en ligne de la plupart des pages de man sur The Friendly Manual (http://tfm.cz).Vous trouverez en particulier les pages relatives lAPI du noyau Linux qui ne sont pas prsentes en local sur vos machine.PreneznanmoinsgardeauxventuellesdiffrencesdeversionsdAPI(trsrareetquasimentexclusivementsurlespagesrelatives lABI du noyau).1.1.2 StandardsVous subissez aujourdhui tout le poids de lhistoire de la norme Posix (30 ans dhistoire de linformatique). Ne soyez pas tonnsde trouver de multiples interfaces pour une mme fonctionnalit. Cest particulirement vrai sur les fonction relatives au temps.Nous basons ces exercice sur la norme POSIX.1-2001 que vous pourrez trouver sur http://www.unix-systems.org/version3/online.htmlVous trouverez plus dinformations sur lhistoire des diffrentes normes existantes sur standards(7).1.2 ErreursPour indiquer quelle erreur sest produite, la plupart des fonctions Posix utilisent :soit leur valeur de retoursoit une variable globale de type int nomme errnoUtilisez strerror(3) pour obtenir le message derreur quivalent au code de retour.Exemple :1 if (err = pthread_create(&tid, NULL, f, NULL))printf("Task create: %s", strerror(err));if (-1 == pause())printf("Pause: %m");1.3 CompilationPour la plupart des exercices, vous aurez besoin de linker1avec -lpthread et -lrt.Par ailleurs, nous vous conseillons fortement de compiler avec loption -Wall de gcc et dutiliser un systme de Makele.1. Cest dire la phase de compilation o vous liez tous vous chiers .o ensemble32 WATCH FILE2 Watch le2.1 Par scrutationQuestion 2.1. Implmenter un programme watch_files prenant en paramtre un nom de chier. Par scrutation, votre pro-gramme dtectera chaque fois que le chier est cr ou supprim. Votre programme devra afcher un message chaque fois quildtecte une modication. Vous devrez tre le plus ractif possible lors de la modication de statut du chier.Documentation utile: stat(2), touch(1), rm(1)Question 2.2. Sans effectuer de mesure prcise, quel est lordre de grandeur du temps rponse de votre programme ?Question 2.3. Que constatez-vous sur le taux dutilisation du CPU?Documentation utile: top(1)Question 2.4. An de rendre notre programme moins gourmand, ajouter une temporisation de 1s entre chaque scrutation deltat du chier.Documentation utile: sleep(3)Question 2.5. Que constatez-vous sur le taux dutilisation du CPU?Documentation utile: top(1)Question 2.6. Quel est maintenant le temps de rponse de votre programme ?Question 2.7. CommentvolueraitletauxdutilisationduCPUetletempsderponsesinousdevionssurveillerltatdeplusieurs millions de chiers changeant rarement ?2.2 Par noticationAn damliorer notre programme, nous allons utiliser un systme pilot par vnements. Ce mode de fonctionnement est assezproche dun systme pilot par interruption.Question 2.8. Modiez votre programme an dtre noti des modications sur votre chier.Documentation utile: inotify(7), inotify_init(2), inotify_add_watch(2), dirname(3), basename(3), strncpy(3), strcmp(3) read(2),close(2)Question 2.9. Quel est maintenant le temps de rponse de votre programme ?Question 2.10. Que constatez-vous sur le taux dutilisation du CPU?Documentation utile: top(1)Question 2.11. Comment voluerait le taux dutilisation du CPU et le temps de rponse si nous devions surveiller ltat deplusieurs millions de chiers changeant rarement ?43 ORDONNANCEMENT3 Ordonnancement3.1 Rate MonotonicSoit les tches suivantes :Tche Arrive Priode Capacit chanceA 0 29 7 Fin de priodeB 0 5 1 Fin de priodeC 0 10 2 Fin de priodeQuestion 3.1. Calculez le taux dutilisation du CPU avec lalgorithme Rate Monotonic. Le jeu de tche est-il ordonnanable ?Question 3.2. Calculez les temps de rponses des diffrentes tches.Question 3.3. Combien de temps devrait-on simuler le systme pour avoir tous les ordonnancements possibles.Question 3.4. Dessinez les 30 premires units de temps de lordonnancement gnr par Rate Monotonic en version premptivepuis en non-premptive. Que constatez-vous ?Modions le jeu de tches :Tche Arrive Priode Capacit chanceA 0 30 6 Fin de priodeB 0 5 3 Fin de priodeC 0 10 2 Fin de priodeDans cet exemple, le jeu de tche est dit harmonique car chaque priode est multiple des autres priodes.Question 3.5. Calculez le taux dutilisation du CPU avec lalgorithme Rate Monotonic. Le jeu de tche est-il ordonnanable ?Question 3.6. Dessinez les 30 premires units de temps de lordonnancement gnr par Rate Monotonic en version premp-tive. Que constatez-vous ?Question 3.7. Calculez les temps de rponse des diffrentes tches. Que proposez-vous comme explication ?3.2 Earliest Deadline FirstSoit les tches suivantes :Tche Arrive Priode Capacit chanceA 0 12 5 Fin de priodeB 0 6 2 Fin de priodeC 0 24 5 Fin de priodeQuestion 3.8. Calculez le taux dutilisation du CPU avec lalgorithme EDF. Le jeu de tche est-il ordonnanable ?Question 3.9. Dterminez le nombre dunits de temps libres sur la priode.53.3 Ordonnancement conjoint 3 ORDONNANCEMENTQuestion 3.10. Dessinez les 24 premires units de temps de lordonnancement gnr par EDF en version premptive puis ennon-premptive.Question 3.11. Dessinez les 24 premires units de temps de lordonnancement gnr par LST en version premptive.3.3 Ordonnancement conjointOn considre le jeu de tches suivant :Tche Arrive Priode Capacit chanceA 0 12 5 Fin de priodeB 0 6 2 Fin de priodeC 0 24 5 Fin de priodeD 7 - 1 9E 12 - 3 21Question 3.12. Calculez si le systme est ordonnanable en utilisant lalgorithme Deadline Monotonic.Question 3.13. Dessinez les 35 premires units de temps de lordonnancement gnr par Deadline Monotonic.Question 3.14. Dessinez les 35 premires units de temps de lordonnancement gnr par EDF en version premptive.Question 3.15. Mesurez les temps de rponses des tches apriodiques.Question 3.16. Dessinez les 35 premires units de temps de lordonnancement gnr par LST.Question 3.17. Mesurez les temps de rponses des tches apriodiques.3.4 Serveurs de tches asynchronesSoit les tches suivantes :Tche Arrive Priode Capacit chanceA 0 12 4 Fin de priodeB 0 16 6 Fin de priodeS 0 10 2 Fin de priodeS est un serveur grant les tches asynchrones suivantes :Tche Arrive Priode Capacit chance1 2 - 1 Aucune2 14 - 4 Aucune3 28 - 2 AucuneQuestion 3.18. Dessinez les 32 premires units de temps de lordonnancement gnr par RM (en version premptive) avec unserveur par scrutation et gestion des tche asynchrone en fond de tche.Question 3.19. Calculez les temps de rponse des diffrentes tches.63.5 Sporadic Server 3 ORDONNANCEMENTQuestion 3.20. Dessinez les 32 premires units de temps de lordonnancement gnr par RM (en version premptive) avec unserveur diffr.Question 3.21. Calculez les temps de rponse des diffrentes tche.Question 3.22. Lutilisation dun serveur diffr dans cette conguration est-elle sure ?Question 3.23. Dessinez les 32 premires units de temps de lordonnancement gnr par RM (en version premptive) avec unserveur sporadique et utilisation des temps creux.Question 3.24. Calculez les temps de rponse des diffrentes tche.3.5 Sporadic ServerSoit les tches suivantes :Tche Arrive Priode Capacit chanceA 0 24 4 Fin de priodeB 0 28 8 Fin de priodeS 0 20 4 Fin de priodeS est un serveur sporadique grant les tches asynchrones suivantes :Tche Arrive Priode Capacit chance1 4 - 3 Aucune2 12 - 4 AucuneQuestion 3.25. Dessinez les 30 premires units de temps de lordonnancement gnr par RM (en version premptive).Question 3.26. Mesurez les temps de rponse des diffrentes tche.3.6 Serveurs diffr et sporadiqueSoit les tches suivantes :Tche Arrive Priode Capacit chanceA 0 7 2 Fin de priodeS 0 6 3 Fin de priodeS est un serveur de tches asynchrones grant les tches asynchrones suivantes :Tche Arrive Priode Capacit chance1 21 - 6 AucuneQuestion 3.27. Vriez que le systme est ordonnanable si on utilise lalgorithme RMQuestion 3.28. Calculez les temps de rponse des tches priodiques.73.7 Partage de ressources - Inversions de priorits 3 ORDONNANCEMENTQuestion 3.29. Dessinez les 32 premires units de temps de lordonnancement gnr par RM avec un serveur diffr. Lestemps de rponse des tches priodiques sont-ils respects ?Question 3.30. Pouviez-vous prdire ce comportement ?Question 3.31. Dessinez les 32 premires units de temps de lordonnancement gnr par RM et un serveur sporadique. Lestemps de rponse des tches priodiques sont-ils respects ?Question 3.32. Mesurez les temps de rponse de la tche 1.Question 3.33. Quel devrait tre la capacit du serveur pour garantir le temps rel avec un serveur diffr ?Question 3.34. Dessinez les 32 premires units de temps de lordonnancement gnr par RM et un serveur diffr avec cettenouvelle conguration.Question 3.35. Mesurez les temps de rponse de la tche 1.3.7 Partage de ressources - Inversions de prioritsSoit les tches suivantes :Tche Arrive Priode Capacit Priorit Sections critiquesA 15 - 10 1 _____11111B 0 25 10 2 __________C 10 - 20 3 _111111111111111____Question 3.36. Dessinez les 50 premires units de temps en utilisant un algorithme dordonnancement priorit xe (premp-tif) sans prendre en compte les sections critiques.Question 3.37. Dessinez les 50 premires units de temps en utilisant un algorithme dordonnancement priorit xe (premp-tif).Question 3.38. Proposez une modication du systme de priorit an de rduire la latence de A. Dessinez les 50 premiresunits de temps en utilisant cette nouvelle stratgie dordonnancement.83.8 Partage de ressources - Dead Locks 3 ORDONNANCEMENT3.8 Partage de ressources - Dead LocksSoit les tches suivantes :Tche Arrive Priode Capacit chance Sections CritiquesA 0 10 5 Fin de priode _11122B 0 25 8 Fin de priode ___2221212Question 3.39. Dessinez les 18 premires units de temps en utilisant un ordonnancement EDF et un priority inheritance.Question 3.40. Dessinez les 18 premires units de temps en utilisant un ordonnancement EDF et un higtest lock (aka ImmediateCeiling Priority Protocol).Question 3.41. Dessinez les 18 premires units de temps en utilisant un ordonnancement EDF et un original ceiling priorityprotocol (OCPP).3.9 Inversion de priorit - 1Soit les tches suivantes :Tche Arrive Priode Capacit Priorit Sections critiquesA 4 - 4 1 _11_B 4 - 1 2 _C 2 - 4 3 _22_D 2 - 1 4 _E 0 - 6 5 _1212122_Question 3.42. Dessinez les 16 premires units de temps ordonnancement priorit statique et sans algorithme de gestiondinversion de priorit.Question 3.43. Dessinez les 16 premires units de temps en utilisant un ordonnancement priorit statique et lalgorithmedhritage de priorit.Question 3.44. Calculezlestempsderponsesdesdiffrentestchesenutilisantunordonnancementprioritstatiqueetlalgorithme higtest lock (aka Immediate Ceiling Priority Protocol).Question 3.45. Dessinez les 16 premires units de temps du cas prcdant.Question 3.46. Calculezlestempsderponsesdesdiffrentestchesenutilisantunordonnancementprioritstatiqueetlalgorithme original ceiling priority protocol (OCPP).Question 3.47. Dessinez les 16 premires units de temps du cas prcdant.93.10 Inversion de priorit - 2 3 ORDONNANCEMENT3.10 Inversion de priorit - 2Soit les tches suivantes :Tche Arrive Priode Capacit Priorit Sections critiquesA 4 - 4 1 _11_B 4 - 1 2 _C 2 - 6 3 _11121_D 2 - 1 4 _E 0 - 4 5 _22_Question 3.48. Dessinez les 16 premires units de temps ordonnancement priorit statique et sans algorithme de gestiondinversion de priorit.Question 3.49. Dessinez les 16 premires units de temps en utilisant un ordonnancement priorit statique et lalgorithmedhritage de priorit.Question 3.50. Calculezlestempsderponsesdesdiffrentestchesenutilisantunordonnancementprioritstatiqueetlalgorithme higtest lock (aka Immediate Ceiling Priority Protocol).Question 3.51. Dessinez les 16 premires units de temps du cas prcdant.Question 3.52. Calculezlestempsderponsesdesdiffrentestchesenutilisantunordonnancementprioritstatiqueetlalgorithme original ceiling priority protocol (OCPP).Question 3.53. Dessinez les 16 premires units de temps du cas prcdant.3.11 Inversion de priorit - 3Soit les tches suivantes :Tche Arrive Priode Capacit Priorit Sections critiquesA 5 - 4 1 _11_B 5 - 1 2 _C 2 - 6 3 _112121_D 2 - 1 4 _E 0 - 5 5 _222_Question 3.54. Dessinez les 16 premires units de temps ordonnancement priorit statique et sans algorithme de gestiondinversion de priorit.Question 3.55. Dessinez les 16 premires units de temps en utilisant un ordonnancement priorit statique et lalgorithmedhritage de priorit.Question 3.56. Calculezlestempsderponsesdesdiffrentestchesenutilisantunordonnancementprioritstatiqueetlalgorithme higtest lock (aka Immediate Ceiling Priority Protocol).Question 3.57. Dessinez les 16 premires units de temps du cas prcdant.103.12 Contraintes de prcdence 4 PROTECTION DES STRUCTURES DE DONNESQuestion 3.58. Calculezlestempsderponsesdesdiffrentestchesenutilisantunordonnancementprioritstatiqueetlalgorithme original ceiling priority protocol (OCPP).Question 3.59. Dessinez les 16 premires units de temps du cas prcdant.3.12 Contraintes de prcdenceECDFGABHSoit les tches suivantes :Tche Arrive Priode Capacit chanceA 0 - 3 12B 0 - 1 10C 0 - 3 20D 0 - 1 15E 0 - 5 25F 0 - 4 37G 0 - 1 20H 0 - 1 40Question 3.60. Dessinez les 20 premires units de temps en utilisant un ordonnancement EDF (premptif) sans prendre encompte les contraintes de prcdence. Est-ce conforme aux besoins de lapplication ?Question 3.61. Utilisez la mthode de Blazewicz/Chetto pour supprimer les contraintes de prcdence.Question 3.62. Calculez de nouveau le taux dutilisation et redessinez lordonnancement ainsi gnr sur sa priode dtude.Conclure sur lordonnanabilit de lapplication.4 Protection des structures de donnesNous avons implment une structure de liste simplement chane :/**Creation date: 2010-01-03 11:22:08+01:00*Licence: GPL*Main authors:*- Jrme Pouiller 6**Sample use of mutexes.**/#include #include #include 114 PROTECTION DES STRUCTURES DE DONNEStypedef struct list_item_s {struct list_item_s*next;16 int value;} list_item_t;/*Add an element in list*/void list_add(list_item_t**list, int n) {list_item_t*item = malloc(sizeof(list_item_t));item->value = n;item->next =*list;*list = item;}26/*Remove an element*/void list_del(list_item_t**list, int n) {list_item_t*i,*tmp;if ((*list)->value == n) {tmp =*list;*list = (*list)->next;free(tmp);return ;36 }for (i =*list; i->next; i = i->next)if (i->next->value == n) {tmp = i->next;i->next = tmp->next;free(tmp);return ;}printf("Item %d not found\n", n);}Nous avons crit un scnario de test comme il se doit :#define N_ITERATIONS 110void*task(void*arg) {4 list_item_t**l = arg;int i;list_add(l, 0);for (i = 1; i < N_ITERATIONS; i++) {list_add(l, i);list_del(l, i - 1);if (!(i % 100))printf("%08lX: %d\n", pthread_self(), i);}14 list_del(l, N_ITERATIONS - 1);return NULL;}#define NB_THREAD 2int main(int argc, char**argv) {// Initialize an empty listlist_item_t*l = NULL;pthread_t id[NB_THREAD];24 int i;125 TRICKY CONDITIONSfor (i = 0; i < NB_THREAD; i++)pthread_create(&id[i], NULL, task, (void*) &l);for (i = 0; i < NB_THREAD; i++)pthread_join(id[i], NULL);if (l)printf("Error: list is not empty\n");34 return 0;}Nanmoins, le rsultat nest pas celui que nous attendions.Question 4.1. Observez le comportement avec diffrentes valeurs de N_ITERATIONS et NB_THREAD. Quel est le problme ?Remarque: La question peut se faire en environ 2 lignes.Documentation utile: pthread_create(3)Question 4.2. Rsolvez le problme. Vous prendrez soin de limiter la porte de vos sections critiques.Remarque: La question peut se faire en moins de 10 lignes.Documentation utile: pthread_mutex_lock(3), pthread_mutex_unlock(3)5 Tricky conditionsNous avons un problme avec le code ci-dessous :/**Creation date: 2010-01-03 11:22:08+01:00*Licence: GPL*Main authors:5*- Jrme Pouiller **Sample use of conditions.**/#include #include #include #include 15 static pthread_cond_t c = PTHREAD_COND_INITIALIZER;static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;static int count = 0;void*sender(void*arg) {int i;for (i = 0; i < 10; i++) {count++;printf("%08lX: Increment count: count=%d\n", pthread_self(), count);25 if (count == 3) {pthread_cond_signal(&c);printf("%08lX: Sent signal. count=%d\n", pthread_self(), count);}}136 STRUCTURES DE DONNES ET MUTEXreturn NULL;}void*receiver(void*arg) {printf("%08lX: Begin waiting\n", pthread_self());35 pthread_cond_wait(&c, &m);printf("%08lX: Received signal. count=%d\n", pthread_self(), count);return NULL;}int main(int argc, char**argv) {pthread_t id[2];pthread_mutex_lock(&m);pthread_create(&id[0], NULL, sender, NULL);45 pthread_create(&id[1], NULL, receiver, NULL);pthread_join(id[0], NULL);pthread_join(id[1], NULL);pthread_mutex_unlock(&m);return 0;}De temps en temps, le signal envoy par la thread sender nest pas reu par la thread receiver.Question 5.1. Exacerber le problme en plaant une temporisation dans le code.Remarque: La question peut se faire en 2 lignes.Documentation utile: sleep(3)Question 5.2. Utilisez le mutex m de manire approprie pour rsoudre le problme.Remarque: La question peut se faire en 4 lignes.Documentation utile: pthread_cond_wait(3),pthread_mutex_lock(3), pthread_mutex_unlock(3)6 Structures de donnes et mutexUn rseau de chemin de fer relie les villes A, B, C et D. Deux trains circulent sur ce rseau :Le train circulant entre A, B et CLe train circulant entre A, B et DA BCDOn souhaite effectuer une simulation du fonctionnement de ce rseau de chemin de fer sachant que chaque segment de la lignene peut tre utiliser que par un train la fois. Nanmoins, un nombre illimit de trains peuvent se trouver dans la mme gare.Nous avons dcid de modliser chaque train par une thread et le dplacement dune ville une autre par une temporisation d1spendant laquelle le segment de ligne est occup.Nous utilisons une structure de graphe pour reprsenter notre rseau ferr. Ce choix nous permettra de facilement tendre notrealgorithme de nouveaux cas.Question 6.1. Implmenter cette simulation.147 PROTECTION DE RESSOURCESRemarque: Une manire commune de reprsenter un graphe de X nuds en informatique est dutiliser une matrice de X Xboolens. Chaque valeur reprsente lexistence (ou labsence) dune arte. Dans le cas dun graphe non-orient, la matrice serasymtrique :0 1 0 01 0 1 10 1 0 00 1 0 0Remarque: La question peut se faire en environ 80 lignes.Documentation utile: pthread_create(3), pthread_mutex_lock(3), pthread_mutex_unlock(3), sleep(3)7 Protection de ressourcesNous avons besoin denvoyer 4 messages vers un serveur distant. Nous utilisons le code ci-dessous :#define SZ 20void*task(void*arg) {4 char*buf = (char*) arg;send(buf, SZ);return NULL;}int main(int argc, char**argv) {pthread_t id[4];int i;char msgs[4][SZ] = { "HELO sysmic.org\n", "SEND jezz\n", "QUOTA\n", "BYE\n" };14for (i = 0; i < 4; i++)pthread_create(&id[i], NULL, task, msgs[i]);for (i = 0; i < 4; i++)pthread_join(id[i], NULL);printf("\n");return 0;}Dans le cadre de notre tude, nous navons pas daccs rel au serveur, nous avons donc crit une fonction de simulation delenvoie des donne :#include #include #include #include 5void send_char(char data) {double time = (double) random() / RAND_MAX*8;struct timespec t;t.tv_sec = time / 1000;t.tv_nsec = (int) (time*1000000) % 1000000000;nanosleep(&t, NULL);write(1, &data, 1);}15 void send(char*data, size_t len) {158 THREADS ET MUTEXunsigned i;for (i = 0; i < len && data[i]; i++)send_char(data[i]);}Malheureusement, il semblerait quil y ait un problme car les messages reu par le serveurs ne sont pas cohrents :Aa[1b{cB2(deC3)}DE45Ff]6Or, pour que le serveur puisse interprter les donnes, il ne faut pas que les messages des tches concurrentes soit enchevtrs.On propose demballer send dans une nouvelle fonction alternative permettant de rgler le problme :int safe_send(char*data, size_t len);Question 7.1. Implmentez safe_send.Remarque: La question peut se faire en moins de 10 lignes.Documentation utile: pthread_mutex_lock(3), pthread_mutex_unlock(3)La fonction safe_send rsout le problme de cohrence, mais cause des problmes de latences dans la fonction task. Danscertains cas, celle-ci sexcute beaucoup plus lentement quavant.Question 7.2. crivez un scnario de test permettant de mettre en vidence et de mesurer le phnomne de latence.Remarque: La question peut se faire en moins de 20 lignes.Documentation utile: clock_gettime(3), memset(3)Nous allons essayer de rsoudre le problme de latence. Pour cela, nous allons crer une nouvelle tche permettant denvoyer lesdonnes de manire asynchrone.An de transmettre la tche les donnes envoyer, nous devons mettre en place une structure de donnes adquate. Nousproposons dutiliser une le (FIFO) sous la forme dun buffer circulaire.Enn, notre buffer circulaire ncessitera un mcanisme de rveil de la tche denvoi lorsque des donnes sont disponible dans lebuffer.Question 7.3. Implmentez cette solution.Remarque: La question peut se faire en moins de 40 lignes.Documentation utile: pthread_create(3), pthread_mutex_lock(3), pthread_mutex_unlock(3), pthread_cond_wait(3), pthread_cond_signal(3)8 Threads et mutexQuestion 8.1. crivez un programme avec N taches, N tant une constante dnie la compilation. Chacune des taches con-tiendra une boucle incrmentant et afchant un compteur. Utilisez des smaphores pour synchroniser les boucles. Vous devriezobtenir le comportement suivant (N = 4) :$ ./concurenceTask: 0, count: 0Task: 1, count: 0Task: 2, count: 0Task: 3, count: 0Task: 0, count: 1Task: 1, count: 1Task: 2, count: 1Task: 3, count: 1169 TCHES ET SMAPHORES XENOMAITask: 0, count: 2Task: 1, count: 2Task: 2, count: 2[...]Documentation utile: pthread_create(3), pthread_cancel(3), pthread_join(3), pthread_mutex_init, pthread_mutex_lock(3),pthread_mutex_unlock(3), pthread_mutex_destroy(3)Question 8.2. Modiez votre code pour crer un dead lock sur toutes les taches.Question 8.3. Fixez N 4. Ajoutez une cinquime tache. La cinquime tache devra monopoliser processeur (ie : for(;;);).En modiant les priorits des taches, produisez une inversion de priorit.Remarque: Sur un systme multicoeurs, il est possible que vous ayez besoin de crer autant de tches que de coeurs an demonopoliser le systme.Documentation utile: pthread_setschedparam(3), pthread_setschedpolicy(3)9 Tches et smaphores XenomaiAn de faire ce TP, nous vous avons fourni un Linux avec un noyau patch avec Xenomai. Ce patch nous permet davoir unsystme temps rel et proter dune API spcialise pour le temps rel. Notez que nous utiliserons exclusivement lAPI Nativedurant ce TP.Reportez-vous lannexe B pour les informations concernant lusage de la bibliothque Xenomai.Question 9.1. crivez un programme avec N taches, N tant une constante dnie la compilation. Chacune des taches con-tiendra une boucle incrmentant et afchant un compteur. Utilisez des smaphores pour synchroniser les boucles. Vous devriezobtenir le comportement suivant (N = 4) :$ ./concurenceTask: 0, count: 0Task: 1, count: 0Task: 2, count: 0Task: 3, count: 0Task: 0, count: 1Task: 1, count: 1Task: 2, count: 1Task: 3, count: 1Task: 0, count: 2Task: 1, count: 2Task: 2, count: 2[...]Documentation utile: native/task.h, rt_task_create, rt_task_start, rt_task_delete, native/sem.h, rt_sem_create,rt_sem_delete, rt_sem_p, rt_sem_v, mlockall(2)Question 9.2. Vriez le bon fonctionnement de votre programme avec N = 100.1710 IMPLMENTATION DORDONNANCEURS10 Implmentation dordonnanceursLe chier sched.c implmente un environnement capable de simuler des ordonnanceurs. Ce simulateur est bas sur les fonctionPosix makecontext et swapcontext qui permettent de contrler manuellement le changement de contexte entre plusieurstches.Question 10.1. tudiez sched.c.Documentation utile: makecontext(3), swapcontext(3)10.1 Algorithmes dordonnancement de tches indpendantesQuestion 10.2. A partir de sched.c, modiez la fonction elect an dimplmenter un ordonnanceur priorit statique.Question 10.3. Plutt que dutiliser une dure de simulation arbitraire, calculez celle-ci an que la dure de la simulation soitsufsante pour faire simulation hors-ligne.Question 10.4. Implmentez un ordonnanceur Rate Monotonic. Bien entendu le membre priority de la structure task_tne sera pas utilis pour cet algorithme.Question 10.5. ImplmentezunordonnanceurEarliest DealineFirst. Bienentendulemembreprioritydelastructuretask_t ne sera pas utilis pour cet algorithme.10.2 Algorithmes dordonnancement de tches apriodiquesNous souhaitons ajouter des tche apriodiques. Nous les intgrons notre systme en utilisant des tche avec une priode nulle.Question 10.6. Ajoutez la gestion de ces tches. Utilisez le temps CPU non-utilis par les tches priodiques pour excuter cestches. Vous navez pas besoin de grer de priorits entre les tches asynchrones.Question 10.7. Effectuez la gestion des tches apriodiques dans un serveur de scrutation (polling server).Question 10.8. Effectuez la gestion des tches apriodiques dans un serveur diffr (defferable server)Question 10.9. (Bonus) Effectuez la gestion des tches apriodiques dans un serveur sporadique (sporadic server).Question 10.10. Implmentez lalgorithme de Round-Robin.1810.3 Ordonnancement et ressources partages 11 LIBTIMER10.3 Ordonnancement et ressources partagesNous souhaitons ajouter la gestion des mutex dans notre systme. Le patch sched_mutex.patch ajoute les structures nces-saire pour la gestion des mutex.Question 10.11. Appliquezsched_mutex.patchvotreimplmentationdordonnanceurprioritsstatiquesetimpl-mentez les fonctions lock et unlock;Question 10.12. Implmentez un scnario avec un deadlock.Question 10.13. Implmentez un scnario avec une inversion de priorit.Question 10.14. Implmentez lalgorithme ICPP (Immediate Ceiling Priority Protocol).Documentation utile: qsort(3)Question 10.15. (Bonus) Implmentez lalgorithme dhritage de priorit.Documentation utile: qsort(3)Question 10.16. (Bonus difcile) Dans notre simulation, les date de premption sont connue lavance. Par consquent, nousavons pu nous affranchir des problme de rentrance. Modier votre implmentation dhritage de priorit an de la rendrerentrante.Question 10.17. (Sujet de thse) Ajoutez lordonnanceur la possibilit dordonnancer les tches sur plusieurs processeurssimultanment. Maintenez votre implmentation dhritage de priorit fonctionnelle (et rentrante). Garantissez des temps derponse de vos algorithme en o(n) +o(s) (o n est le nombre de tche et s le nombre de sections critiques). Vos propositions sont envoyer Ingo Molnr, auteur des mutex hritage de priorit, de lordonnanceur Completly Fair et de la premption diteTemps Relle sur le noyau Linux.Question 10.18. Implmentez lalgorithme OCPP (Original Ceiling Priority Protocol).Documentation utile: qsort(3)Question 10.19. Dtectez les possibles inversions de priorits dans les fonctions m_lock, m_unlock.Question 10.20. Dtectez les dead locks dans les fonctions m_lock, m_unlock.11 LibtimerOn se propose dimplmenter une bibliothque libtimer permettant de lancer des tches une date xe ou aprs une certainepriode. Le fonctionnement de cette bibliothque est dcrit dans timer.h :/**Author: Jrme Pouiller *Created: Fri Dec 11 22:57:13 CET 2009*Licence: GPL**Define interface for timer services.*/1911 LIBTIMER9 #ifndef MYTIMER_H#define MYTIMER_H#include #include /*Helper to define a task*/typedef void (*task_t)();/*INSERT YOUR mytimer_s DEFINITION HERE*/19 /*Contains all needed data*/typedef struct mytimer_s mytimer_t;/**All following functions return*- 0 on success*- another value on error*//*29*Initialize new timer instance.*Instance is returned using parameter out.*User have to call this function first*/int mytimer_run(mytimer_t*out);/*Stop timer instance*/int mytimer_stop(mytimer_t*mt);/*Add a task to timer. Task will be executed at time tp*/39 int mytimer_add_absolute(mytimer_t*mt, task_t t, const struct timespec*tp);/*Add a task to timer. Task will be executed in ms milliseconds*/int mytimer_add_msecond(mytimer_t*mt, task_t t, unsigned long ms);/*Add a task to timer. Task will be executed in s seconds*/int mytimer_add_second(mytimer_t*mt, task_t t, unsigned long sec);/*Add a task to timer. Task will be executed in h hours*/int mytimer_add_hour(mytimer_t*mt, task_t t, unsigned long h);49/*Remove first occurence of task t from timer.*/int mytimer_remove(mytimer_t*mt, task_t t);#endif /*MYTIMER_H*/La structure mytimer_s (que vous dnirez) contient tout le contexte dexcution.Les tches lancer sont dcrite par le type task_t.Lutilisateur de la bibliothque commencera par un appel mytimer_run.Il ajoutera les tches avec les fonctions mytimer_add.mytimer_add_absolute excute la tche une heure xe donne tandis que les autres fonctions mytimer_add ex-cutentlatcheuntempsrelatiflinstantprsent.Parexemple, mytimer_add_second(s, t, 3)excuterat3secondes aprs lappel cette fonction.Toutes les fonctions de libtimer retournent un entier. Il sagit dun code derreur. Vous tes libre dans le choix des codesde retour.On considre que les tches sont exemptes de bugs et quelles ne tentent pas de mettre en pril la stabilit de votre bibliothqueet du systme.2011 LIBTIMERlibtimer tentera dtre le plus prcis possible dans lheure de lancement des tches. Nanmoins, on ignorera le biais introduitpar le systme dexploitation et les autres processus.An de vous aider, vous trouverez une implmentation de liste chane dans list.h et list.c :/**Author: Jrme Pouiller *Created: Fri Dec 11 22:57:54 CET 2009*Licence: GPL5**/#ifndef LIST_H#define LIST_H#include #include typedef struct list_item_s {/*ADD YOUR MEMBERS HERE*/struct list_item_s*next;15 } list_item_t;#define EMPTY_LIST NULL#define NEXT(s) (s)->next#define FOREACH(I, LIST) for (I = LIST; I; I = NEXT(I))bool list_isEmpty(list_item_t*l);int list_size(list_item_t*list);25 /*Add an element. Dont forget to allocate it before*/void list_add(list_item_t**list, list_item_t*item);/*Remove an element. Return removed element. Dont forget to free it AFTER removing*/list_item_t*list_remove(list_item_t**list, list_item_t*item);#endif /*LIST_H*//**Author: Jrme Pouiller *Created: Fri Dec 11 22:57:54 CET 2009*Licence: GPL**/#include "list.h"9 bool list_isEmpty(list_item_t*l) {return (l == EMPTY_LIST);}int list_size(list_item_t*list) {int count = 0;list_item_t*i;FOREACH(i, list)count++;19 return count;}2111.1 Version synchrone 12 CALCULS ET TEMPS REL/*Add an element. Dont forget to allocate it before*/void list_add(list_item_t**list, list_item_t*item) {item->next =*list;*list = item;}/*Remove an element. Return removed element. Dont forget to free it AFTER removing*/29 list_item_t*list_remove(list_item_t**list, list_item_t*item) {list_item_t*i;if (*list == item) {*list = (*list)->next;return item;}FOREACH(i,*list)if (i->next == item) {i->next = item->next;39 return item;}// Nothing foundreturn NULL;}11.1 Version synchroneOn considre pour linstant que le temps dexcution des tches est nul.Question 11.1. Implmentez libtimer tel que dcrit dans le chier dentte timer.h.Documentation utile: pthread_cond_timedwait(3), pthread_cond_wait(3), pthread_cond_signal(3), clock_gettime(2), sleep(3),pthread_create(3), pthread_mutex_lock(3), pthread_mutex_unlock(3), pthread_mutex_init(3), pthread_cond_init(3), pthread_cancel(3),ctime_r(3)11.2 Version asynchroneNous avons suppos dans que le temps dexcution des tches taient nul. Nous souhaitons maintenant crire la version nale dela bibliothque excutant les tches de manire asynchrone.Question 11.2. Modiez votre bibliothque de manire excuter les tches de manire concurrente.Documentation utile: pthread_attr_setdetachstate(3), pthread_create(3), pthread_attr_init(3)12 Calculs et temps rel12.1 IntroductionCe TP est inspir du fonctionnement dun tlphone portable. Sur ce systme, un microphone utilise un DMA pour placer lesdonnes acquises en mmoire. Une interruption est ensuite dclenche lorsque que le DMA contient assez de donnes par tretraites. Le tlphone portable utilise ensuite un systme de compression par paquet dont le temps de traitement est variable.Enn, le tlphone doit envoyer ses donnes lantenne toutes les 4.6ms, soit une frquence de 217Hz environ.An de faire ce TP, nous vous avons fourni un Linux avec un noyau patch avec Xenomai. Ce patch nous permet davoir unsystme temps rel et proter dune API spcialise pour le temps rel.2212.2 criture du Watchdog 12 CALCULS ET TEMPS REL12.2 criture du WatchdogNous allons utiliser le priphrique Real Time Clock (RTC) prsent sur les architectures i386 pour gnrer des interruptionsncessaires la suite de lexercice.A chaque priode, la RTC produit une interruption. Le driver RTC traduit cette interruption par lcriture dun octet sur le chier/dev/rtc0. Le chier rtc.c vous donne un exemple de programmation du priphrique RTC.Question 12.1. tudiez le programme, compilez-le, puis programmez la RTC 2 Hz et lancez trois priodes.Nous utiliserons la bibliothque Xenomai pour les questions suivantes. Reportez-vous lannexe B pour plus dinformations surson utilisation.Nous allons dans la suite du TP travailler avec linterruption produite par la RTC. Une mauvaise gestion de linterruption pourraproduire un IRQ storm. Nous allons donc mettre en place watchdog an de rendre notre dveloppement plus confortable. Notrewatchdog nous permettra de dtecter si notre systme ne rpond plus et de reprendre la main dessus.Question 12.2. Modiezrtc.cdemanireajouterunwatchdog. Dclenchervotrewatchdogsur1seconde. Lorsquelewatchdog se dclenche, dsactivez la RTC et avertissez lutilisateur.Documentation utile: native/alarm.h, rt_alarm_start, rt_alarm_create, rt_alarm_delete, rt_alarm_wait, native/task.h,rt_task_create, rt_task_delete, rt_task_start, rt_timer_ns2ticks12.3 Ecriture de lISRMaintenant que nous avons un bon outil de test, nous pouvons commencer travailler sur linterruption en elle-mme.Les interruptions doivent forcement tre excutes dans le noyau de Linux. Pour cette raison les questions suivantes sont criresous forme de module. Reportez-vous lannexe C pour les informations concernant le dveloppement des modules noyau.Question 12.3. Placez une ISR sur le linterruption 8 (Real Time Clock). Dans votre ISR, grez un compteur dappel n. Afchern dans le buffer du noyau lorsquune interruption survient.Documentation utile: native/intr.h, rt_intr_create, rt_intr_enable, rt_intr_deleteRemarquez le fonctionnement du nano-kernel Adeos. Votre interruption apparat dans /proc/ipipe/Xenomai alors que lesautres interruption apparaissent dans /proc/ipipe/Linux. Adeos gre Xenomai et Linux comme deux OS diffrents.Nous allons maintenant simuler le traitement de donnes. Nous choisissons de calculer la suite de Fibonacci pour simuler le tempsde traitement des donnes. Nous utilisons cette fonction en raison de sa grande amplitude de temps de calcul. Ainsi, fibo(34)se calcule 4 milliards de fois plus lentement que fibo(2).Question 12.4. Faites une implmentation nave (rcursive) de Fibonacci. Afchezfibo(n % M) lorsquune interruptionsurvient, M tant une constante dnie la compilation.Augmentez M jusqu ce que le temps pass dans linterruption soit mesurable (> 100ms) lorsque n approche un multiple de M.Remarque: Vous pouvez utilisez le timestamp produit dans le log buffer du noyau comme mesure approximative.Question 12.5. Augmentez la frquence de la RTC 128Hz. Vriez le fonctionnement de linterruption.Remarque: Vous pouvez utilisez le timestamp produit par le log buffer. Vu que lon casse le temps rel du noyau, ce timestampnest sont pas able en absolu. Nanmoins, le temps en moyenne est able. On peut calculer le nombre dinterruptions entre ledbut et la n du test et ainsi voir si on rate des interruption.Question 12.6. Dportez le calcul et lafchage defibo dans une seconde tache laide dune queue. Afchez le nombredlments dans la queue. Noubliez pas de grer les erreurs.Documentation utile: rt_queue_create, rt_queue_delete, rt_queue_write, rt_queue_read, rt_queue_inquire, rt_task_create,rt_task_start, rt_task_delete23A INSTRUCTIONS DINSTALLATION DE LA MACHINE VIRTUELLE XENOMAIQuestion 12.7. Ajoutez la gestion dune le de rsultats. Dans lISR, dpiler un rsultat et afchez-le. Grez intelligemment lecas o la le est vide.Documentation utile: native/queue.h, rt_queue_create, rt_queue_delete, rt_queue_write, rt_queue_readQuestion 12.8. Chargez le CPU laide des commande dd(1) et ping(1). Vriez la qualit de vos taches temps relles.A Instructions dinstallation de la machine virtuelle XenomaiA.1 Mise en service de limageNous avons besoin de congurer votre compte pour utiliser limage virtuelle patch avec Xenomai.Ouvrez un terminal. Commencez par importer la conguration de la machine virtuelle :vboxmanage import "/opt/TP_vms/jezz-324/Ubuntu 9.04 Xenomai 32bits-nodisk.ovf"Cette conguration ne contient pas de dique dur. Nous en attachons donc un :vboxmanage storageattach "Ubuntu 9.04 Xenomai 32bits" --storagectl "SATA Controller"--port 1 --type hdd --medium "/opt/TP_vms/jezz-324/Ubuntu 9.04 Xenomai 32bits-disk1.vmdk"Le disque dur que nous avons ajout nest pas accessible en lecture. Nous allons utiliser le systme dimage incrmentale propospar Virtual Box. Ainsi, vous navez besoin davoir un accs en criture que sur le chier contenant le delta. Ce delta pourra toutde mme atteindre quelques centaine de mgaoctet. Nous choisissons donc un emplacement en local pour le contenir :vboxmanage modifyvm "Ubuntu 9.04 Xenomai 32bits" --snapshotfolder /var/tmp/snapshots-LOGIN/Nous pouvons maintenant crer le premier incrment :vboxmanage snapshot "Ubuntu 9.04 Xenomai 32bits" take "Initial"Vous pouvez dmarrer VirtualBox et dmarrer la machine virtuelle "Ubuntu 9.04 Xenomai 32bits"A.2 LenvironnementA.2.1 Se connecterlogin : userpassword : userA.2.2 Sauver son travailDans un terminal utiliser la commande scp(1) pour vous connecter votre machine hte par lIP 10.0.2.2 :scp -r exo1 [email protected]:Linverse fonctionne aussi videment :scp -r [email protected]:exo1 .A.2.3 Acceder internetVous devez congurer votre navigateur pour utiliser le proxy de lcole.24B CRITURE DES PROGRAMMES XENOMAIA.2.4 Travailler avec emacs, geany, etc...Vous avez la possibilit dxcuter des commandes en root avec la commande sudo(1) :sudo apt-get install emacsB criture des programmes XenomaiB.1 Documentation de XenomaiVous pourrez trouvez la documentation de lAPI de Xenomai dans/usr/share/doc/xenomai-doc/html/api ou enligne sur http://www.xenomai.org/documentation/xenomai-2.4/html.Remarquez que est capable de prsenter plusieurs interfaces de programmation. Dans notre cas, nous nutiliserons que linterfacenative. Par consquent, seule la section Modules/Native Xenomai API de la documentation vous sera utile.Vous pouvez trouver les headers inclure en explorant longlet lesB.2 CompilationLes commandes xeno-config --xeno-cflags et xeno-config --xeno-ldflags permettent dobtenir respective-ment les options de compilation et les options de link utiliser pour que votre programme fonctionne avec Xenomai. Vous devrezde plus prciser que vous utilisez la skin Native avec loption -lnative.Par ailleurs, nous vous conseillons fortement de compiler avec loption -Wall de gcc et dutiliser un systme de Makele.Noubliez pas que dans un Makele, il faut utiliser le mot-clef shell pour lancer une commande. Par exemple :bin: file.ogcc -Wall $(shell xeno-config --xeno-ldflags) -lnative $< -o [email protected]: file.cgcc -Wall $(shell xeno-config --xeno-cflags) -c $< -o [email protected] Vrouillage de la mmoireEn cas de ncessit, le gestionnaire de mmoire du noyau Linux peut-tre amen placer des pages de mmoire virtuelle sur ledisque dur (processus de swaping). Lorsquune de ces pages de mmoire est ncessaire, elle doit tre replace en mmoire avantdtre utilise. Cela cre une latence qui peut poser problme dans le cas dapplication temps relles.Un appel la fonction mlockall(1) permet de demander au noyau de vrouiller les pages de mmoire en mmoire physique :mlockall(MCL_CURRENT | MCL_FUTURE);La mmoire doit tre vrouille avant tout appel lAPI Xenomai.B.4 A propos des noms des objets XenomaiIl est possible dans Xenomai dassocier chaque objet un nom unique sur le systme. Cela permet de binder des objets entre desprocessus ou entre des domaines dexcution.Lutilisation des noms oblige tre rigoureux et correctement dtruire les objets avant de sortir des processus. Les instancesdes objets resteront en mmoire.Par consquent, nous vous conseillons de ne pas utiliser cette fonctionnalit des les exercices suivants et passer un pointeurNULL comme nom.25B.5 Gestion des Erreurs C CRITURE DES MODULES NOYAUB.5 Gestion des ErreursLa plupart des fonctions Xenomai retournent une valeur ngative pour indiquer quune erreur sest produite. Vous pouvez utiliserstrerror(3) pour obtenir le message derreur quivalent.Exemple classique :if (err = rt_task_start(t, f, NULL))printf("Task start: %s\n", strerror(-err));B.6 ExcutionVous aurez besoin dexcuter les programmes que vous crerez avec les droits root. Nous vous dconseillons lutilisation desudo(1) pour lancer vos programmes car Ctrl+C sera moins ractif.C criture des modules noyauC.1 CompilationLa manire classique de compiler un module noyau est de crer un Makele contenant :EXTRA_CFLAGS=-I/lib/modules/$(shell uname -r)/build/include/xenomaiobj-m += module.oPuis lancer la compilation avec :make -C /lib/modules/$(uname -r)/build SUBDIRS=$(pwd) modulesLe systme de compilation du noyau se chargera de compiler votre module avec les bonnes options.Nous vous fournissons le chier Makefile reprenant ces lignes.C.2 ExcutionLes modules ne sont pas des applications. Ils nont pas de fonctionmain. Comme cest souvent le cas lorsque lon souhaitetendre une application en cours de fonctionnement, vous avez la possibilit de dclarer des fonctions qui seront appeles lors decertain vnements. Les fonctions les plus utiles sont dclares par MODULE_INIT (chargement du module) et MODULE_EXIT(dchargement du module).Vous pourrez charger le module laide de insmod(1) et le dcharger laide de rmmod(1).Nous vous fournissons le chier module.c qui vous donne un squelette de module pour le noyau Linux.C.3 Log BufferLe noyau possde un buffer circulaire permettant de logger des messages. Il est possible dcrire dans le buffer depuis un module laide de printk(9) et des macros pr_debug, pr_info, pr_notice, pr_warning, pr_err, etc.... Il est possible de dumper le contenudu buffer avec la commande dmesg(1) (utilisant lappel systme syslog(2)). Il est aussi possible de suivre lvolution du bufferavec la commande :tail -f /var/log/kern.log26E MODALITS DE RENDUD Modalits de renduVotre rendu fera lobjet dun traitement automatis. An dviter tout problme, veuillez suivre les rgles suivantes.Vous devez rendre votre travail dans une archive gzippe. Larchive devra se nommerTR-nom.tar.gz et se dcompresserdans le rpertoire du mme nom.Votre archives ne pas contenir de chiers binaires. Il ne doit contenir que vos sources (chiers sources, chiers enttes, Makele,etc... ).Aucun de vos noms de chiers ne doit contenir de caractres despacements, accentus ou non-imprimables.Exemple de cration de rendu :make cleancd ..tar cvzf TR-pouiller.tar.gz TR-pouillerVous devrez envoyer votre rendu par e-mail avant le 31 Dcembre 1999 23h59 . Votre e-mail nedevra comporter que votre rendu comme unique pice jointe.Le sujet du mail devra suivre la nomenclature suivante : [TR] nom (exemple : [TR] pouiller).Enn, le corps du mail devra contenir une ligne indiquant votre prnom, votre nom et votre email sous la forme :*Prnom Nom Exemple :Veuillez trouver en pice jointe le rendu de projet temps rel de :*Jrme Pouiller Cordialement,--Jrme Pouiller, SysmicExpert Linux embarquE Modalits de renduVotre rendu fera lobjet dun traitement automatis. An dviter tout problme, veuillez suivre les rgles suivantes.Vous devez rendre votre travail dans une archive gzippe. Larchive devra se nommer TR-nom.tar.gz o nom sera le nomdun membre de votre quipe que nous dsignerons par contact administratif. Votre archive devra et se dcompresser dans lerpertoire du mme nom.Votre archives ne pas contenir de chiers binaires. Il ne doit contenir que vos sources (chiers sources, chiers enttes, Makele,etc... ).Aucun de vos noms de chiers ne doit contenir de caractres despacements, accentus ou non-imprimables.Votre archive devra contenir sa racine un chier nomm AUTHORS. Ce chier devra au moins contenir les prnoms, les nom etles email des membre de votre quipe sous la forme :*Prnom1 Nom1 2*Prnom2 Nom2 [...]Les lignes ne correspondant pas cette nommenclature sont ignoresExemple de cration de rendu :make cleanecho *Jrme Pouiller >> AUTHORSecho *Thibaud Hilaire >> AUTHORScd ..tar cvzf TR-pouiller.tar.gz TR-pouiller27E MODALITS DE RENDUVous devrez envoyer votre rendu par e-mail avant le 31 Dcembre 1999 23h59 . Votre e-mail nedevra comporter que votre rendu comme unique pice jointe.Le sujet du mail devra suivre la nomenclature suivante : [TR] nom o nom est le nom de votre contact administratif (exemple :[TR] pouiller).Enn, le corps du mail devra se conformer au mme formalisme que le chier AUTHORS.Exemple :Veuillez trouver en pice jointe le rendu de projet temps rel de :*Jrme Pouiller *Thibaud Hilaire 5 Cordialement,--Jrme Pouiller, SysmicExpert Linux embarqu28