{"id":1916,"date":"2012-04-05T10:06:38","date_gmt":"2012-04-05T09:06:38","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?page_id=1916"},"modified":"2019-01-05T14:03:13","modified_gmt":"2019-01-05T13:03:13","slug":"solutions-temps-reel-sous-linux","status":"publish","type":"page","link":"https:\/\/www.blaess.fr\/christophe\/livres\/solutions-temps-reel-sous-linux\/","title":{"rendered":"Solutions temps r\u00e9el sous Linux"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-5454\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/Blaess-2019.jpg\" alt=\"Solutions temps r\u00e9el sous Linux\" width=\"150\" height=\"200\" \/><\/p>\n<p style=\"text-align: justify;\">Ce livre est disponible depuis mai 2012, une seconde \u00e9dition est parue en novembre 2015 et une troisi\u00e8me en janvier 2019. Il traite des solutions libres permettant d&rsquo;obtenir un comportement temps r\u00e9el souple (<em>soft real time<\/em>) ou strict (<em>hard real time<\/em>) avec Linux. Les th\u00e8mes abord\u00e9s recouvrent&nbsp;: le <strong>multit\u00e2che<\/strong>, l&rsquo;<strong>ordonnancement<\/strong> temps partag\u00e9 et temps r\u00e9el souple du noyau Linux standard, le patch <strong>PREEMPT_RT<\/strong> qui permet d&rsquo;am\u00e9liorer le comportement du noyau standard et l&rsquo;extension <strong>Xenomai<\/strong> pour acc\u00e9der aux performances temps r\u00e9el strict. Un rapide aper\u00e7u du fonctionnement d&rsquo;un <strong>driver<\/strong> et de la gestion des <strong>interruptions<\/strong> est propos\u00e9 pour \u00e9tendre les fonctionnalit\u00e9s temps-r\u00e9el.<\/p>\n<p style=\"text-align: justify;\">Depuis la seconde \u00e9dition, les exemples manipulant des signaux d&rsquo;entr\u00e9e-sortie sont construits sur Raspberry Pi.<\/p>\n<h2>Exemples<\/h2>\n<p style=\"text-align: justify;\">Il existe une soixantaine d&rsquo;exemples dans le livre, dont les codes sources se trouvent <a href=\"https:\/\/www.blaess.fr\/christophe\/files\/livres\/strsl\/exemples-strsl-3.tar.bz2\">\u00e0 cet emplacement<\/a>.<\/p>\n<p style=\"text-align: justify;\">Les exemples de la premi\u00e8re \u00e9dition\u00a0 <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/livres\/strsl\/exemples-strsl.tar.bz2\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/livres\/strsl\/exemples-strsl.tar.bz2\">sont ici<\/a>, ceux de la seconde <a href=\"http:\/\/www.blaess.fr\/christophe\/files\/livres\/strsl\/exemples-strsl-2.tar.bz2\">se trouvent ici<\/a>.<\/p>\n<h2>Corrig\u00e9s des exercices<\/h2>\n<p style=\"text-align: justify;\">Une cinquantaine d&rsquo;exercices sont propos\u00e9s pour valider les concepts abord\u00e9s. Les solutions <a title=\"S.T.R.S.L. \u2013 Exercices corrig\u00e9s\" href=\"http:\/\/www.blaess.fr\/christophe\/livres\/solutions-temps-reel-sous-linux\/solutions-temps-reel-sous-linux-exercices-corriges\/\">sont disponibles ici<\/a>.<\/p>\n<h2>Commander sur Amazon<\/h2>\n<p style=\"text-align: center;\">Lien Amazon: <a href=\"https:\/\/amzn.to\/2VqRY5j\">https:\/\/amzn.to\/2VqRY5j<\/a><\/p>\n<h2>Sommaire<\/h2>\n<ul>\n<li><strong>Chapitre 1 &#8211; Multit\u00e2che et commutation<\/strong>\n<ul>\n<li>Multit\u00e2che sous Linux\n<ul>\n<li>Cr\u00e9ation de processus<\/li>\n<li>Parall\u00e9lisme multithreads<\/li>\n<\/ul>\n<\/li>\n<li>Syst\u00e8mes multiprocesseurs\n<ul>\n<li>Multiprocesseurs, multic\u0153urs et hyperthreading<\/li>\n<li>Affinit\u00e9 d\u2019une t\u00e2che<\/li>\n<\/ul>\n<\/li>\n<li>\u00c9tats des t\u00e2ches\n<ul>\n<li>Ordonnancement<\/li>\n<li>Pr\u00e9emption<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 2 &#8211; Interruptions, exceptions et appels syst\u00e8me<\/strong>\n<ul>\n<li>Mode noyau<\/li>\n<li>Interruptions\n<ul>\n<li>Principe<\/li>\n<li>Entr\u00e9es-sorties sans interruptions<\/li>\n<li>Entr\u00e9es-sorties avec interruptions<\/li>\n<li>Interruptions sous Linux<\/li>\n<li>Routage des interruptions<\/li>\n<\/ul>\n<\/li>\n<li>Exceptions\n<ul>\n<li>Principe<\/li>\n<li>Fichier core<\/li>\n<\/ul>\n<\/li>\n<li>Appels syst\u00e8me\n<ul>\n<li>Suivi d\u2019un appel syst\u00e8me<\/li>\n<\/ul>\n<\/li>\n<li>Threads du noyau<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 3 &#8211; Ordonnancement temps partag\u00e9 et priorit\u00e9s<\/strong>\n<ul>\n<li>Temps partag\u00e9\n<ul>\n<li>Principes<\/li>\n<li>Ordonnanceur historique<\/li>\n<li>Ordonnanceurs du noyau 2.6<\/li>\n<li>Ordonnanceur CFS<\/li>\n<li>Groupes de processus<\/li>\n<li>Autres ordonnanceurs<\/li>\n<\/ul>\n<\/li>\n<li>Configuration des priorit\u00e9s\n<ul>\n<li>Courtoisie des processus<\/li>\n<li>Priorit\u00e9s entre threads<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 4 &#8211; Limitations de l\u2019ordonnancement temps partag\u00e9 <\/strong>\n<ul>\n<li>Mesure du temps\n<ul>\n<li>Heure Unix avec gettimeofday()<\/li>\n<li>Pr\u00e9cision des mesures<\/li>\n<li>Horloges Posix<\/li>\n<\/ul>\n<\/li>\n<li>T\u00e2ches p\u00e9riodiques\n<ul>\n<li>Timers Unix classiques<\/li>\n<li>Timers Posix<\/li>\n<li>Granularit\u00e9<\/li>\n<li>Pr\u00e9cision<\/li>\n<\/ul>\n<\/li>\n<li>Pr\u00e9emption des t\u00e2ches<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 5 &#8211; Principes du temps r\u00e9el <\/strong>\n<ul>\n<li>D\u00e9finitions\n<ul>\n<li>Temps r\u00e9el<\/li>\n<li>Temps r\u00e9el strict<\/li>\n<li>Temps r\u00e9el souple<\/li>\n<li>R\u00f4les respectifs<\/li>\n<\/ul>\n<\/li>\n<li>Traitement direct dans le noyau\n<ul>\n<li>Traitement des interruptions<\/li>\n<\/ul>\n<\/li>\n<li>Temps r\u00e9el sous Linux\n<ul>\n<li>\u00c9chelle des priorit\u00e9s<\/li>\n<li>Configuration de l\u2019ordonnancement<\/li>\n<li>Processus temps r\u00e9el<\/li>\n<li>Garde-fou temps r\u00e9el<\/li>\n<li>Threads temps r\u00e9el<\/li>\n<li>Threads en Round Robin<\/li>\n<li>Rotation sans Round Robin<\/li>\n<li>Temps r\u00e9el depuis le shell<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 6 &#8211; Performances du temps r\u00e9el souple <\/strong>\n<ul>\n<li>Timers temps r\u00e9el\n<ul>\n<li>Pr\u00e9cisions et fluctuations<\/li>\n<li>Granularit\u00e9 des timers<\/li>\n<li>Conclusion sur les timers<\/li>\n<\/ul>\n<\/li>\n<li>Temps de commutation\n<ul>\n<li>Commutation entre threads<\/li>\n<li>Commutations entre processus<\/li>\n<li>Comparaison processus et threads<\/li>\n<li>Impr\u00e9visibilit\u00e9s dues \u00e0 la m\u00e9moire virtuelle<\/li>\n<\/ul>\n<\/li>\n<li>Pr\u00e9emptibilit\u00e9 du noyau\n<ul>\n<li>Principes<\/li>\n<li>Pr\u00e9emptibilit\u00e9 du noyau standard<\/li>\n<li>Conna\u00eetre la configuration d\u2019un noyau<\/li>\n<li>Exp\u00e9riences sur la pr\u00e9emptibilit\u00e9<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 7 &#8211; Probl\u00e8mes temps r\u00e9el classiques <\/strong>\n<ul>\n<li>D\u00e9marrage en Round Robin\n<ul>\n<li>Barri\u00e8res Posix<\/li>\n<\/ul>\n<\/li>\n<li>Inversion de priorit\u00e9\n<ul>\n<li>Principe<\/li>\n<li>H\u00e9ritage de priorit\u00e9<\/li>\n<\/ul>\n<\/li>\n<li>Prise de mutex\n<ul>\n<li>Comportement en temps r\u00e9el<\/li>\n<li>Reprise de mutex en temps r\u00e9el<\/li>\n<li>Solutions<\/li>\n<li>Appel explicite \u00e0 l\u2019ordonnanceur<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 8 &#8211; Limites et am\u00e9liorations du temps r\u00e9el Linux<\/strong>\n<ul>\n<li>Traitement des interruptions<\/li>\n<li>Linux-rt\n<ul>\n<li>Threaded interrupts<\/li>\n<li>Fully preemptible kernel<\/li>\n<\/ul>\n<\/li>\n<li>Outils de mesure des performances\n<ul>\n<li>Cyclictest<\/li>\n<li>Hwlatdetect, Hackbench&#8230;<\/li>\n<\/ul>\n<\/li>\n<li>\u00c9conomies d\u2019\u00e9nergie\n<ul>\n<li>Variation de fr\u00e9quence d\u2019horloge<\/li>\n<li>Heuristique performance<\/li>\n<li>Heuristique powersave<\/li>\n<li>Heuristique ondemand<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 9 &#8211; Extensions temps r\u00e9el de Linux<\/strong>\n<ul>\n<li>Les nanokernels temps r\u00e9el\n<ul>\n<li>Principes<\/li>\n<li>RTLinux<\/li>\n<li>RTAI et Adeos<\/li>\n<li>Xenomai<\/li>\n<li>Interface de programmation<\/li>\n<\/ul>\n<\/li>\n<li>Installation de Xenomai\n<ul>\n<li>Modification du noyau Linux<\/li>\n<li>Compilation de Linux modifi\u00e9<\/li>\n<li>Compilation de Xenomai<\/li>\n<\/ul>\n<\/li>\n<li>Exp\u00e9riences avec Xenomai\n<ul>\n<li>Premi\u00e8re exploration<\/li>\n<li>Programmes de tests<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 10 &#8211; Programmer avec Xenomai<\/strong>\n<ul>\n<li>Programmation de t\u00e2ches simples\n<ul>\n<li>Principes<\/li>\n<li>Initialisation du processus<\/li>\n<li>Cr\u00e9ation de t\u00e2che<\/li>\n<li>Compilation et ex\u00e9cution<\/li>\n<li>Processus unithread<\/li>\n<li>Recherche des changements de modes<\/li>\n<\/ul>\n<\/li>\n<li>Alarmes et t\u00e2ches p\u00e9riodiques\n<ul>\n<li>R\u00e9veils p\u00e9riodiques<\/li>\n<li>Alarmes<\/li>\n<li>Watchdog<\/li>\n<\/ul>\n<\/li>\n<li>Synchronisation des t\u00e2ches\n<ul>\n<li>S\u00e9maphores<\/li>\n<li>Mutex<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Chapitre 11 &#8211; Traitement des interruptions <\/strong>\n<ul>\n<li>Programmation d\u2019un driver\n<ul>\n<li>Squelette d\u2019un module<\/li>\n<li>Structure d\u2019un driver<\/li>\n<li>Traitement des interruptions<\/li>\n<li>Traitement en threaded interrupt<\/li>\n<\/ul>\n<\/li>\n<li>Interruptions avec Xenomai\n<ul>\n<li>Real Time Driver Model<\/li>\n<li>Interruptions avec RTDM<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Conclusion &#8211; \u00c9tat des lieux et perspectives <\/strong>\n<ul>\n<li>Situation actuelle\n<ul>\n<li>Linux \u00ab&nbsp;vanilla&nbsp;\u00bb<\/li>\n<li>Patch Linux-rt<\/li>\n<li>Xenomai<\/li>\n<li>Mesures<\/li>\n<\/ul>\n<\/li>\n<li>Perspectives<\/li>\n<\/ul>\n<\/li>\n<li><strong>Annexe A &#8211; Compilation d\u2019un noyau <\/strong>\n<ul>\n<li>Pr\u00e9paration des sources<\/li>\n<li>Configuration de la compilation\n<ul>\n<li>Principes<\/li>\n<li>Interfaces utilisateur<\/li>\n<li>Options de compilation<\/li>\n<\/ul>\n<\/li>\n<li>Compilation et installation\n<ul>\n<li>Compilation crois\u00e9e<\/li>\n<li>Compilation native<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Annexe B &#8211; Bibliographie<\/strong>\n<ul>\n<li>Livres<\/li>\n<li>Articles<\/li>\n<li>Sites web<\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Ce livre est disponible depuis mai 2012, une seconde &eacute;dition est parue en novembre 2015 et une troisi&egrave;me en janvier 2019. Il traite des solutions libres permettant d&rsquo;obtenir un comportement temps r&eacute;el souple (soft real time) ou strict (hard real time) avec Linux. Les th&egrave;mes abord&eacute;s recouvrent&nbsp;: le multit&acirc;che, l&rsquo;ordonnancement temps partag&eacute; et temps r&eacute;el [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":15,"menu_order":1,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-1916","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/pages\/1916","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=1916"}],"version-history":[{"count":15,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/pages\/1916\/revisions"}],"predecessor-version":[{"id":5458,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/pages\/1916\/revisions\/5458"}],"up":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/pages\/15"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=1916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}