{"id":3422,"date":"2013-02-15T09:31:21","date_gmt":"2013-02-15T08:31:21","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=3422"},"modified":"2024-08-07T21:58:51","modified_gmt":"2024-08-07T20:58:51","slug":"raspberry-pi-interruptions-gpio-avec-rtdm","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2013\/02\/15\/raspberry-pi-interruptions-gpio-avec-rtdm\/","title":{"rendered":"Raspberry Pi &#8211; Interruptions GPIO avec RTDM"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/02\/scope-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3432 alignright\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/02\/scope-01.png\" alt=\"IRQ GPIO Raspberry-Pi RTDM\" width=\"200\" height=\"150\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/02\/scope-01.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/02\/scope-01-300x225.png 300w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/><\/a>Dans un <a title=\"G\u00e9rer les GPIO du Raspberry Pi avec RTDM\" href=\"http:\/\/www.blaess.fr\/christophe\/2013\/01\/26\/gerer-les-gpio-du-raspberry-pi-avec-rtdm\/\">article pr\u00e9c\u00e9dent<\/a>, j&rsquo;indiquais que le support des interruptions d\u00e9clench\u00e9es par les ports GPIO du Raspberry Pi n&rsquo;\u00e9tait pas encore satisfaisant sous Xenomai en utilisant un driver RTDM. Depuis quelques semaines\u00a0 Paul Corner travaille sur le sujet, et il a finalement r\u00e9solu le probl\u00e8me mercredi dernier. Comme nous le soup\u00e7onnions, il y avait un conflit entre le gestionnaire d&rsquo;interruptions de Xenomai et celui de Linux (qui restait anormalement install\u00e9).<\/p>\n<p style=\"text-align: justify;\">Les <em>patches<\/em> de Paul n&rsquo;ont pas encore \u00e9t\u00e9 int\u00e9gr\u00e9s dans Xenomai (mais je suppose qu&rsquo;ils le seront dans les jours \u00e0 venir). En attendant, voici comment obtenir de meilleurs r\u00e9sultats que pr\u00e9c\u00e9demment.<\/p>\n<p style=\"text-align: justify;\">\n<!--more-->\n<\/p>\n<h1>Xenomai 2.6.2.1 avec Linux 3.5.7<\/h1>\n<p style=\"text-align: justify;\">R\u00e9cup\u00e9rons les sources <em>mainline<\/em> de Linux 3.5.7 et la derni\u00e8re version de Xenomai.<\/p>\n<pre>[~]$ <strong>cd ~\/Projets\/<\/strong>\n[Projets]$ <strong>mkdir Xenomai-RPI<\/strong>\n[Projets]$ <strong>cd Xenomai-RPI\/<\/strong>\n[Xenomai-RPI]$ <strong>wget <a title=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/v3.x\/linux-3.5.7.tar.bz2\" href=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/v3.x\/linux-3.5.7.tar.bz2\">http:\/\/www.kernel.org\/pub\/linux\/kernel\/v3.x\/linux-3.5.7.tar.bz2<\/a><\/strong>\n--2013-02-15 09:47:09--  http:\/\/www.kernel.org\/pub\/linux\/kernel\/v3.x\/linux-3.5.7.tar.bz2\nR\u00e9solution de www.kernel.org (www.kernel.org)... 149.20.4.69, 149.20.20.133\nConnexion vers www.kernel.org (www.kernel.org)|149.20.4.69|:80... connect\u00e9.\nrequ\u00eate HTTP transmise, en attente de la r\u00e9ponse... 200 OK\nLongueur: 80996724 (77M) [application\/x-bzip2]\nSauvegarde en : \u00ablinux-3.5.7.tar.bz2\u00bb\n\n100%[=================================================&gt;] 80 996 724  1,29M\/s   ds 69s     \n\n2013-02-15 09:48:18 (1,12 MB\/s) - \u00ablinux-3.5.7.tar.bz2\u00bb sauvegard\u00e9 [80996724\/80996724]\n\n[Xenomai-RPI]$ <strong>wget http:\/\/download.gna.org\/xenomai\/stable\/xenomai-2.6.2.1.tar.bz2<\/strong>\n--2013-02-15 09:50:15--  http:\/\/download.gna.org\/xenomai\/stable\/xenomai-2.6.2.1.tar.bz2\nR\u00e9solution de download.gna.org (download.gna.org)... 78.40.125.79\nConnexion vers download.gna.org (download.gna.org)|78.40.125.79|:80... connect\u00e9.\nrequ\u00eate HTTP transmise, en attente de la r\u00e9ponse... 200 OK\nLongueur: 22647120 (22M) [application\/x-bzip2]\nSauvegarde en : \u00abxenomai-2.6.2.1.tar.bz2\u00bb\n\n100%[=================================================&gt;] 22 647 120  1,31M\/s   ds 17s     \n\n2013-02-15 09:50:32 (1,31 MB\/s) - \u00abxenomai-2.6.2.1.tar.bz2\u00bb sauvegard\u00e9 [22647120\/22647120]\n\n[Xenomai-RPI]$<\/pre>\n<p style=\"text-align: justify;\">D\u00e9compressons et pr\u00e9parons les sources de Linux en utilisant le patch correspondant dans ceux propos\u00e9s par Xenomai.<\/p>\n<pre>[Xenomai-RPI]$ <strong>tar xjf linux-3.5.7.tar.bz2 <\/strong>\n[Xenomai-RPI]$ <strong>tar xjf xenomai-2.6.2.1.tar.bz2<\/strong> \n[Xenomai-RPI]$ <strong>xenomai-2.6.2.1\/scripts\/prepare-kernel.sh --linux=.\/linux-3.5.7 --arch=arm --adeos=xenomai-2.6.2.1\/ksrc\/arch\/arm\/patches\/ipipe-core-3.5.7-arm-3.patch <\/strong>\npatching file arch\/arm\/Kconfig\npatching file arch\/arm\/boot\/compressed\/decompress.c\npatching file arch\/arm\/boot\/compressed\/head.S\npatching file arch\/arm\/boot\/compressed\/string.c\npatching file arch\/arm\/common\/gic.c\n[...]\npatching file mm\/mmap.c\npatching file mm\/mmu_context.c\npatching file mm\/mprotect.c\npatching file mm\/vmalloc.c\n[Xenomai-RPI]$<\/pre>\n<p style=\"text-align: justify;\">Appliquons les <em>patches<\/em> de Paul Corner. En attendant qu&rsquo;ils soient int\u00e9gr\u00e9s dans Xenomai, je vous en propose une copie sur ce site.<\/p>\n<pre>[Xenomai-RPI]$ <strong>wget <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/Paul's-patches.tar.bz2\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/Paul's-patches.tar.bz2\">http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/Paul\\'s-patches.tar.bz2<\/a><\/strong>\n--2013-02-15 09:57:25--  http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/Paul's-patches.tar.bz2\nR\u00e9solution de www.blaess.fr (www.blaess.fr)... 213.186.33.17\nConnexion vers www.blaess.fr (www.blaess.fr)|213.186.33.17|:80... connect\u00e9.\nrequ\u00eate HTTP transmise, en attente de la r\u00e9ponse... 200 OK\nLongueur: 456155 (445K) [application\/x-bzip2]\nSauvegarde en : \u00abPaul's-patches.tar.bz2\u00bb\n\n100%[=================================================&gt;] 456 155     1,01M\/s   ds 0,4s    \n\n2013-02-15 09:57:26 (1,01 MB\/s) - \u00abPaul's-patches.tar.bz2\u00bb sauvegard\u00e9 [456155\/456155]\n\n[Xenomai-RPI]$ <strong>tar xjf Paul\\'s-patches.tar.bz2 <\/strong>\n[Xenomai-RPI]$ <strong>ls \"Paul's patches\/\"<\/strong>\n0001-Raspberry-Pi-bcm2835-bcm2708-support-added.patch\n0002-Use-correct-module_param-data-type-in-lirc_rpi.c.patch\n0003-Default-config.-Minimal-set-of-modules-enabled-along.patch\n0004-Switch-to-using-a-chained-interrupt-handler-for-GPIO.patch\n[Xenomai-RPI]$<\/pre>\n<p style=\"text-align: justify;\">Quatre <em>patches<\/em>, donc, \u00e0 appliquer successivement sur le noyau Linux d\u00e9j\u00e0 modifi\u00e9 pour Xenomai. Le premier ajoute le support pour le Raspberry Pi.<\/p>\n<pre>[linux-3.5.7]$ <strong>patch -p1 &lt; ..\/Paul\\'s\\ patches\/0001* <\/strong>\npatching file Documentation\/kernel-parameters.txt\npatching file arch\/arm\/Kconfig\npatching file arch\/arm\/Kconfig.debug\npatching file arch\/arm\/Makefile\nHunk #2 FAILED at 310.\n1 out of 2 hunks FAILED -- saving rejects to file arch\/arm\/Makefile.rej\n[...]\npatching file drivers\/Makefile\nReversed (or previously applied) patch detected!  Assume -R? [n] <strong>(<em>Entr\u00e9e<\/em>)<\/strong>\nApply anyway? [n] <strong>(<em>Entr\u00e9e<\/em>)<\/strong>\nSkipping patch.\n1 out of 1 hunk ignored -- saving rejects to file drivers\/Makefile.rej\npatching file drivers\/base\/dma-mapping.c\npatching file drivers\/char\/Kconfig\npatching file drivers\/char\/Makefile\npatching file drivers\/char\/broadcom\/Kconfig\n[...]\npatching file include\/linux\/sizes.h\npatching file include\/linux\/vmalloc.h\npatching file init\/Kconfig\nReversed (or previously applied) patch detected!  Assume -R? [n] <strong>(<em>Entr\u00e9e<\/em>)<\/strong>\nApply anyway? [n] <strong>(<em>Entr\u00e9e<\/em>)<\/strong>\nSkipping patch.\n1 out of 1 hunk ignored -- saving rejects to file init\/Kconfig.rej\npatching file kernel\/Makefile\nReversed (or previously applied) patch detected!  Assume -R? [n] <strong>(<em>Entr\u00e9e<\/em>)<\/strong>\nApply anyway? [n] <strong>(<em>Entr\u00e9e<\/em>)<\/strong>\nSkipping patch.\n1 out of 1 hunk ignored -- saving rejects to file kernel\/Makefile.rej\npatching file kernel\/module.c\npatching file mm\/vmalloc.c\npatching file sound\/arm\/Kconfig\npatching file sound\/arm\/Makefile\npatching file sound\/arm\/bcm2835-ctl.c\n[...]\n[linux-3.5.7]$<\/pre>\n<p style=\"text-align: justify;\">Comme on peut le voir il y a quelques rejets, il s&rsquo;agit de probl\u00e8mes b\u00e9nins, et l&rsquo;on peut sans risque presser simplement <em>Entr\u00e9e<\/em> lorsque <code>patch<\/code> nous interroge sur la conduite \u00e0 tenir.<\/p>\n<p style=\"text-align: justify;\">Le second <em>patch<\/em> permet d&rsquo;\u00e9liminer un avertissement \u00e0 la compilation et le troisi\u00e8me offre une configuration par d\u00e9faut pour le Raspberry Pi. Ces deux <em>patches<\/em> ne sont pas obligatoires.<\/p>\n<pre>[linux-3.5.7]$ <strong>patch -p1 &lt; ..\/Paul\\'s\\ patches\/0002* <\/strong>\npatching file drivers\/staging\/media\/lirc\/lirc_rpi.c\n[linux-3.5.7]$ <strong>patch -p1 &lt; ..\/Paul\\'s\\ patches\/0003*<\/strong> \npatching file arch\/arm\/configs\/bcmrpi_defconfig\n[linux-3.5.7]$<\/pre>\n<p style=\"text-align: justify;\">Enfin le quatri\u00e8me <em>patch<\/em> est celui qui corrige l&rsquo;erreur dans le gestionnaire d&rsquo;interruption GPIO qui nous posait tant de soucis jusqu&rsquo;\u00e0 pr\u00e9sent.<\/p>\n<pre>[linux-3.5.7]$ <strong>patch -p1 &lt; ..\/Paul\\'s\\ patches\/0004* <\/strong>\npatching file arch\/arm\/mach-bcm2708\/armctrl.c\npatching file arch\/arm\/mach-bcm2708\/bcm2708_gpio.c\n[linux-3.5.7]$<\/pre>\n<p style=\"text-align: justify;\">Les quatre <em>patches<\/em> \u00e9tant appliqu\u00e9s nous pouvons compiler le noyau &#8211; par exemple en utilisant la configuration par d\u00e9faut cr\u00e9\u00e9e par Paul.<\/p>\n<pre>[linux-3.5.7]$ <strong>make ARCH=arm help<\/strong>\nCleaning targets:\n  clean\t\t  - Remove most generated files but keep the config and\n                    enough build support to build external modules\n  mrproper\t  - Remove all generated files + config + various backup files\n  distclean\t  - mrproper + remove editor backup and patch files\n[...]\n  at91x40_defconfig        - Build for at91x40\n  badge4_defconfig         - Build for badge4\n  bcmring_defconfig        - Build for bcmring\n<strong>  bcmrpi_defconfig         - Build for bcmrpi<\/strong>\n  bonito_defconfig         - Build for bonito\n  cam60_defconfig          - Build for cam60\n[...]\nExecute \"make\" or \"make all\" to build all targets marked with [*] \nFor further info see the .\/README file\n[linux-3.5.7]$ <strong>make ARCH=arm bcmrpi_defconfig<\/strong>\n  HOSTCC  scripts\/basic\/fixdep\n  HOSTCC  scripts\/kconfig\/conf.o\n  SHIPPED scripts\/kconfig\/zconf.tab.c\n  SHIPPED scripts\/kconfig\/zconf.lex.c\n  SHIPPED scripts\/kconfig\/zconf.hash.c\n  HOSTCC  scripts\/kconfig\/zconf.tab.o\n  HOSTLD  scripts\/kconfig\/conf\n#\n# configuration written to .config\n#\n[linux-3.5.7]$<\/pre>\n<p style=\"text-align: justify;\">Personnellement, je pr\u00e9f\u00e8re un fichier de configuration personnalis\u00e9 l\u00e9g\u00e8rement diff\u00e9rent (j&rsquo;utilise une console s\u00e9rie et pas d&rsquo;\u00e9cran vid\u00e9o, mon syst\u00e8me de fichiers est format\u00e9 en ext2 et pas en ext4, etc.)<\/p>\n<pre>[linux-3.5.7]$ <strong>wget <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/config-linux-3.5.7-xenomai\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/config-linux-3.5.7-xenomai\" target=\"_blank\" rel=\"noopener\">http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/config-linux-3.5.7-xenomai<\/a><\/strong>\n--2013-02-15 10:52:24--  http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/config-linux-3.5.7-xenomai\nR\u00e9solution de www.blaess.fr (www.blaess.fr)... 213.186.33.17\nConnexion vers www.blaess.fr (www.blaess.fr)|213.186.33.17|:80... connect\u00e9.\nrequ\u00eate HTTP transmise, en attente de la r\u00e9ponse... 200 OK\nLongueur: 58181 (57K) [text\/plain]\nSauvegarde en : \u00abconfig-linux-3.5.7-xenomai\u00bb\n\n100%[=================================================&gt;] 58 181      --.-K\/s   ds 0,09s   \n\n2013-02-15 10:52:24 (634 KB\/s) - \u00abconfig-linux-3.5.7-xenomai\u00bb sauvegard\u00e9 [58181\/58181]\n\n[linux-3.5.7]$ <strong>mv config-linux-3.5.7-xenomai .config<\/strong>\n[linux-3.5.7]$ <strong>make ARCH=arm menuconfig<\/strong><\/pre>\n<p style=\"text-align: justify;\">On peut v\u00e9rifier quelques options puis quitter avant de compiler le kernel.<\/p>\n<pre>[linux-3.5.7]$ <strong>make ARCH=arm CROSS_COMPILE=\/usr\/local\/cross\/rpi\/bin\/arm-linux- -j 4<\/strong>\nscripts\/kconfig\/conf --silentoldconfig Kconfig\nWRAP arch\/arm\/include\/generated\/asm\/auxvec.h\nWRAP arch\/arm\/include\/generated\/asm\/bitsperlong.h\nWRAP arch\/arm\/include\/generated\/asm\/cputime.h\nWRAP arch\/arm\/include\/generated\/asm\/errno.h\n[...]\nLD [M] lib\/zlib_deflate\/zlib_deflate.ko\nLD [M] lib\/zlib_inflate\/zlib_inflate.ko\nLD [M] net\/core\/pktgen.ko\nLD [M] net\/key\/af_key.ko\n[linux-3.5.7]$<\/pre>\n<p style=\"text-align: justify;\">\u00c9videmment la compilation suppose la pr\u00e9sence d&rsquo;une <em>cross-toolchain<\/em> \u00e0 l&#8217;emplacement indiqu\u00e9 dans la variable <code>CROSS_COMPILE<\/code>.<\/p>\n<p style=\"text-align: justify;\">Le noyau se trouve dans <code>arch\/arm\/boot\/zImage<\/code>, je le transf\u00e8re sur le Raspberry Pi (qui est d\u00e9j\u00e0 allum\u00e9) en le renommant en <code>kernel.img<\/code>.<\/p>\n<pre>[linux-3.5.7]$ <strong>scp arch\/arm\/boot\/zImage root@192.168.5.28:\/boot\/kernel.img<\/strong>\nroot@192.168.5.28's password: \nzImage                                                   100% 2553KB   2.5MB\/s   00:01    \n[linux-3.5.7]$<\/pre>\n<p style=\"text-align: justify;\">Les modules du noyau peuvent \u00eatre regroup\u00e9s ainsi&nbsp;:<\/p>\n<pre>[linux-3.5.7]$ <strong>make ARCH=arm INSTALL_MOD_PATH=.\/modules-rpi modules_install<\/strong>\n  INSTALL crypto\/aes_generic.ko\n  INSTALL crypto\/arc4.ko\n  INSTALL crypto\/authenc.ko\n[...]\n  INSTALL net\/core\/pktgen.ko\n  INSTALL net\/key\/af_key.ko\n  DEPMOD  3.5.7-core\n[linux-3.5.7]$ <strong>cd modules-rpi\/<\/strong>\n[modules-rpi]$ <strong>ls<\/strong>\nlib\n[modules-rpi]$ <strong>tar cjf modules-rpi.tar.bz2 lib\/<\/strong>\n[modules-rpi]$<\/pre>\n<p style=\"text-align: justify;\">Je transf\u00e8re l&rsquo;archive sur le Raspberry Pi et je la d\u00e9compresse \u00e0 la racine du syst\u00e8me de fichiers.<\/p>\n<pre>[modules-rpi]$ <strong>scp modules-rpi.tar.bz2 root@192.168.5.28:\/<\/strong>\nroot@192.168.5.28's password: \nmodules-rpi.tar.bz2                                    100%  898KB 897.7KB\/s   00:00    \n[modules-rpi]$ <strong>ssh root@192.168.5.28<\/strong>\nroot@192.168.5.28's password: \nroot@R-Pi [\/root]# <strong>cd \/<\/strong>\nroot@R-Pi [\/]# <strong>tar xjf modules-rpi.tar.bz2 <\/strong>\nroot@R-Pi [\/]# <strong>reboot<\/strong>\nConnection to 192.168.5.28 closed by remote host.\nConnection to 192.168.5.28 closed.\n[modules-rpi]$ cd ..\n[linux-3.5.7]$<\/pre>\n<pre style=\"text-align: justify;\">Compilons maintenant les composants de l'espace utilisateur de Xenomai. [linux-3.5.7]$ <strong>cd ..\/xenomai-2.6.2.1\/<\/strong>\n[xenomai-2.6.2.1]$ <strong>PATH=$PATH:\/usr\/local\/cross\/rpi\/bin\/<\/strong>\n[xenomai-2.6.2.1]$ <strong>.\/configure --host=arm-linux CFLAGS='-march=armv6' LDFLAGS='-march=armv6'<\/strong>\nconfigure: WARNING: if you wanted to set the --build type, don't use --host.\nIf a cross compiler is detected then cross compile mode will be used\nchecking build system type... i686-pc-linux-gnu\nchecking host system type... arm-unknown-linux-gnu\n[...]\nconfig.status: linking .\/include\/asm-arm to src\/include\/asm\/xenomai\nconfig.status: linking .\/include\/asm-generic to src\/include\/asm-generic\/xenomai\nconfig.status: executing depfiles commands\nconfig.status: executing libtool commands\n[xenomai-2.6.2.1]$ <strong>make<\/strong>\nMaking all in src make[1]: entrant dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Xenomai-RPI\/xenomai-2.6.2.1\/src \u00bb \nMaking all in include make[2]: entrant dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Xenomai-RPI\/xenomai-2.6.2.1\/src\/include \u00bb\n[...]\nmake[1]: Rien \u00e0 faire pour \u00ab all-am \u00bb.\nmake[1]: quittant le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Xenomai-RPI\/xenomai-2.6.2.1 \u00bb\n[xenomai-2.6.2.1]$ <strong>make DESTDIR=$(pwd)\/RPI install<\/strong>\nMaking install in src\nmake[1]: entrant dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Xenomai-RPI\/xenomai-2.6.2.1\/src \u00bb\nMaking install in include\nmake[2]: entrant dans le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Xenomai-RPI\/xenomai-2.6.2.1 \u00bb\n[...]\nsudo found (sudo is sudo), testing it...\n[sudo] password for cpb:\nsudo is working.\nmake[2]: Rien \u00e0 faire pour \u00ab install-data-am \u00bb.\nmake[2]: quittant le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Xenomai-RPI\/xenomai-2.6.2.1 \u00bb\nmake[1]: quittant le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Xenomai-RPI\/xenomai-2.6.2.1 \u00bb\n[xenomai-2.6.2.1]$<\/pre>\n<p style=\"text-align: justify;\">On peut transf\u00e9rer les \u00e9l\u00e9ments utiles sur le Raspberry Pi. Dans cet article ils ne nous serviront pas car nous \u00e9crirons uniquement un module kernel avec RTDM.<\/p>\n<pre>[xenomai-2.6.2.1]$ <strong>cd RPI\/<\/strong>\n[RPI]$ <strong>tar cjf xenomai-rpi.tar.bz2 usr\/xenomai\/bin\/ usr\/xenomai\/sbin\/ usr\/xenomai\/lib\/<\/strong>\n[RPI]$ <strong>scp xenomai-rpi.tar.bz2 root@192.168.5.28:\/ <\/strong>\nroot@192.168.5.28's password: \nxenomai-rpi.tar.bz2                                      100%  330KB 329.8KB\/s   00:01    \n[RPI]$ <strong>ssh root@192.168.5.28<\/strong>\nroot@192.168.5.28's password: \nroot@R-Pi [\/root]# <strong>cd \/<\/strong>\nroot@R-Pi [\/]# <strong>tar xjf xenomai-rpi.tar.bz2 <\/strong>\nroot@R-Pi [\/]# <strong>exit<\/strong>\nConnection to 192.168.5.28 closed.\n[RPI]$<\/pre>\n<h1>Module RTDM<\/h1>\n<p>Nous pouvons r\u00e9utiliser le module <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/irq-gpio-rtdm.c\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/irq-gpio-rtdm.c\" target=\"_blank\" rel=\"noopener\"><code>irq-gpio-rtdm.c<\/code><\/a> de l&rsquo;<a title=\"G\u00e9rer les GPIO du Raspberry Pi avec RTDM\" href=\"http:\/\/www.blaess.fr\/christophe\/2013\/01\/26\/gerer-les-gpio-du-raspberry-pi-avec-rtdm\/\" target=\"_blank\" rel=\"noopener\">article du 26 janvier dernier<\/a> avec quelques l\u00e9g\u00e8res modifications.<\/p>\n<pre><strong>irq-gpio-rtdm.c<\/strong>\n#include &lt;linux\/fs.h&gt;\n#include &lt;linux\/gpio.h&gt;\n#include &lt;linux\/interrupt.h&gt;\n#include &lt;linux\/module.h&gt;\n\n#include &lt;rtdm\/rtdm_driver.h&gt;\n\n\/\/ GPIO IN 23 -&gt; Broche 16\n#define GPIO_IN  23\n\/\/ GPIO OUT 22 -&gt; Broche 15\n#define GPIO_OUT 22\n\nstatic rtdm_irq_t irq_rtdm;\n\nstatic int handler_interruption(rtdm_irq_t * irq)\n{\n    static int value = 0;\n    gpio_set_value(GPIO_OUT, value);\n    value = 1 - value;\n    return RTDM_IRQ_HANDLED;\n}\n\nstatic int __init exemple_init (void)\n{\n    int err;\n\n    int numero_interruption = gpio_to_irq(GPIO_IN);\n\n    if ((err = gpio_request(GPIO_IN, THIS_MODULE-&gt;name)) != 0) {\n        return err;\n    }\n    if ((err = gpio_direction_input(GPIO_IN)) != 0) {\n        gpio_free(GPIO_IN);\n        return err;\n    }\n    if ((err = gpio_request(GPIO_OUT, THIS_MODULE-&gt;name)) != 0) {\n        gpio_free(GPIO_IN);\n        return err;\n    }\n    if ((err = gpio_direction_output(GPIO_OUT, 1)) != 0) {\n        gpio_free(GPIO_OUT);\n        gpio_free(GPIO_IN);\n        return err;\n    }\n\n    irq_set_irq_type(numero_interruption,  IRQF_TRIGGER_RISING);\n\n    if ((err = rtdm_irq_request(&amp; irq_rtdm, \n                     numero_interruption, handler_interruption, \n                     RTDM_IRQTYPE_EDGE,\n                     THIS_MODULE-&gt;name, NULL)) != 0) {\n        gpio_free(GPIO_OUT);\n        gpio_free(GPIO_IN);\n        return err;\n    }\n    return 0; \n}\n\nstatic void __exit exemple_exit (void)\n{\n    rtdm_irq_free(&amp; irq_rtdm);\n    gpio_free(GPIO_OUT);\n    gpio_free(GPIO_IN);\n}\n\nmodule_init(exemple_init);\nmodule_exit(exemple_exit);\nMODULE_LICENSE(\"GPL\");<\/pre>\n<p style=\"text-align: justify;\">Le fichier <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/Makefile\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2013-02-15\/Makefile\" target=\"_blank\" rel=\"noopener\"><code>Makefile<\/code><\/a> est le suivant, il vous faudra ajuster les portions soulign\u00e9es des chemins pour correspondre au r\u00e9pertoire que vous avez utilis\u00e9 pour l&rsquo;ensemble de ces tests.<\/p>\n<pre><strong>Makefile<\/strong>\nEXTRA_CFLAGS := -I <span style=\"text-decoration: underline;\">\/home\/cpb\/Projets\/Xenomai-RPI\/<\/span>xenomai-2.6.2.1\/RPI\/usr\/xenomai\/include\/\n\nifneq (${KERNELRELEASE},)\n    obj-m += irq-gpio-rtdm.o\nelse\n    ARCH ?= arm\n    CROSS_COMPILE ?= \/usr\/local\/cross\/rpi\/bin\/arm-linux-\n    KERNEL_DIR = <span style=\"text-decoration: underline;\">\/home\/cpb\/Projets\/Xenomai-RPI\/<\/span>linux-3.5.7\n    MODULE_DIR := $(shell pwd)\n    CFLAGS := -Wall -g \n\n.PHONY: all\nall:: modules\n\n.PHONY: modules\nmodules:\n    ${MAKE} ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -C ${KERNEL_DIR} SUBDIRS=${MODULE_DIR}  modules\n\nXENOCONFIG=<span style=\"text-decoration: underline;\">\/home\/cpb\/Projets\/Xenomai-RPI\/<\/span>xenomai-2.6.2.1\/RPI\/usr\/xenomai\/bin\/xeno-config\n\n.PHONY: clean\nclean::\n    rm -f  *.o  .*.o  .*.o.* *.ko  .*.ko  *.mod.* .*.mod.* .*.cmd *~\n    rm -f Module.symvers Module.markers modules.order \n    rm -rf .tmp_versions\nendif<\/pre>\n<h1>R\u00e9sultats<\/h1>\n<p style=\"text-align: justify;\">Les r\u00e9sultats sont tr\u00e8s concluants. Avec des observations \u00e0 l&rsquo;oscilloscope, on voit que la latence typique pour la r\u00e9ponse \u00e0 une interruption GPIO est comprise entre 3 et 5 micro-secondes comme en t\u00e9moigne la capture ci-dessous.<br \/>\n<a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/02\/scope-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3432\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/02\/scope-01.png\" alt=\"IRQ GPIO Raspberry-Pi RTDM\" width=\"400\" height=\"300\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/02\/scope-01.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/02\/scope-01-300x225.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><br \/>\nJe ne connais pas encore la latence maximale, mais \u00e0 premi\u00e8re vue avec un syst\u00e8me bien charg\u00e9 elle ne semble pas d\u00e9passer la quinzaine de micro-secondes. Je ferai des mesures plus pr\u00e9cises dans les jours \u00e0 venir.<\/p>\n<h1 style=\"text-align: justify;\">Conclusion<\/h1>\n<p style=\"text-align: justify;\">La maintenance des <em>patches<\/em> Xenomai pour le Raspberry Pi est compliqu\u00e9e par le fait qu&rsquo;il n&rsquo;y a pas encore de support <em>mainline<\/em> pour cette carte. Certaines rumeurs parlent d&rsquo;une int\u00e9gration dans le kernel Linux 3.10, mais rien n&rsquo;est s\u00fbr encore. En attendant, savoir qu&rsquo;il existe des <em>patches<\/em> externes permettant d&rsquo;obtenir des r\u00e9sultats tr\u00e8s acceptables en terme de temps r\u00e9el est plut\u00f4t rassurant m\u00eame si la mise en \u0153uvre est l\u00e9g\u00e8rement plus compliqu\u00e9e que pour d&rsquo;autres plates-formes.<\/p>","protected":false},"excerpt":{"rendered":"<p>Dans un article pr&eacute;c&eacute;dent, j&rsquo;indiquais que le support des interruptions d&eacute;clench&eacute;es par les ports GPIO du Raspberry Pi n&rsquo;&eacute;tait pas encore satisfaisant sous Xenomai en utilisant un driver RTDM. Depuis quelques semaines&nbsp; Paul Corner travaille sur le sujet, et il a finalement r&eacute;solu le probl&egrave;me mercredi dernier. Comme nous le soup&ccedil;onnions, il y avait un [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5,8,11,14],"tags":[],"class_list":["post-3422","post","type-post","status-publish","format-standard","hentry","category-actualite","category-embarque","category-linux-2","category-raspberry-pi","category-temps-reel"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"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=3422"}],"version-history":[{"count":19,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3422\/revisions"}],"predecessor-version":[{"id":6433,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3422\/revisions\/6433"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=3422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=3422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=3422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}