{"id":553,"date":"2013-10-03T21:19:04","date_gmt":"2013-10-03T19:19:04","guid":{"rendered":"http:\/\/www.martoni.fr\/wordpress\/?p=553"},"modified":"2013-10-07T16:27:02","modified_gmt":"2013-10-07T14:27:02","slug":"xenomai-sur-apf28","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/wordpress\/2013\/10\/03\/xenomai-sur-apf28\/","title":{"rendered":"Xenomai sur APF28"},"content":{"rendered":"<p>Beaucoup de ceux qui ont travaill\u00e9 sur microcontr\u00f4leur et qui passent sur des syst\u00e8mes <a href=\"http:\/\/kadionik.vvv.enseirb-matmeca.fr\/embedded\/embedded.html\">Linux pour l&#8217;embarqu\u00e9<\/a> sont surpris de tomber sur un syst\u00e8me qui n&rsquo;est pas <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Syst%C3%A8me_temps_r%C3%A9el\">temps r\u00e9el<\/a>.<br \/>\nAlors que l&rsquo;on \u00e9tait habitu\u00e9 \u00e0 g\u00e9rer l\u2019ordonnancement de nos t\u00e2ches \u00e0 la main avec un petit <a href=\"http:\/\/en.wikipedia.org\/wiki\/Scheduling_%28computing%29\">scheduler<\/a> maison, sous Linux il faut se d\u00e9battre avec les priorit\u00e9s et les r\u00e9glages de tick d&rsquo;horloge. Et malgr\u00e9 cela on sait que l&rsquo;on restera dans du temps r\u00e9el \u00abmou\u00bb.<\/p>\n<p>Et oui, Linux n&rsquo;est pas un syst\u00e8me temps r\u00e9el, on arrive \u00e0 obtenir de bon r\u00e9sultats avec les derni\u00e8res versions du kernel mais \u00e7a reste du \u00abtemps-r\u00e9el mou\u00bb.<\/p>\n<p>Pour avoir un syst\u00e8me r\u00e9ellement temps r\u00e9el une technique consiste \u00e0 s&rsquo;adjoindre les services d&rsquo;un deuxi\u00e8me micro-noyau qui lui est temps r\u00e9el et qui consid\u00e8re Linux comme une t\u00e2che subalterne. C&rsquo;est l\u2019int\u00e9r\u00eat de <a href=\"http:\/\/www.xenomai.org\/\">xenomai<\/a> (prononcez X\u00e9nomaille \ud83d\ude09 ) qui utilise <a href=\"http:\/\/gna.org\/projects\/adeos\">adeos<\/a> comme noyau temps r\u00e9el.<\/p>\n<p>Chez <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=Main_Page\">Armadeus<\/a> les noyaux <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=Kernel\">fournis par d\u00e9fauts pour les cartes<\/a> ne sont pas directement pr\u00e9vu pour xenomai. Mais apr\u00e8s discussion sur le canal <a href=\"irc:\/\/irc.rezosup.org\/#Armadeus\">IRC du projet<\/a> et quelques recherches sur <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=Xenomai\">le wiki<\/a> on peut r\u00e9ussir \u00e0 s&rsquo;en sortir avec une <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=APF28\">APF28<\/a>.<\/p>\n<p>Voici donc un petit tuto de la marche \u00e0 suivre pour installer Xenomai sur une APF28, j&rsquo;ai choisi un noyau 3.4.6 de Linux car je savais que quelqu&rsquo;un l&rsquo;avait d\u00e9j\u00e0 fait avec, mais il faudrait peut-\u00eatre voir pour un 3.8 qui fonctionne mieux visiblement.<\/p>\n<p>Tout d&rsquo;abord il faut t\u00e9l\u00e9charger le trunk armadeus comme <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=GIT\">expliqu\u00e9 ici<\/a>.<br \/>\n<code><\/p>\n<pre>\r\n$ git clone git:\/\/git.code.sf.net\/p\/armadeus\/code apf28\r\n<\/code><\/pre>\n<p>Puis configurer notre \u00abtree\u00bb pour une APF28.<\/p>\n<p><code><\/p>\n<pre>\r\n$ cd apf28\r\n$ make apf28_defconfig\r\n<\/code><\/pre>\n<p>Un fois que le menu de configuration s'affiche il faut modifier la configuration comme suit:<\/p>\n<pre><code>\r\n Toolchain  --->\r\n     Kernel Headers (Linux 2.6 (manually specified version))  --->\r\n     (3.4.6) linux version\r\n ...\r\n Kernel  --->\r\n     Kernel version (Custom version)  --->\r\n         (3.4.6) Kernel version\r\n \r\n     Linux Kernel Extensions  --->\r\n         [*] Adeos\/Xenomai Real-time patch\r\n         (http:\/\/download.gna.org\/adeos\/patches\/v3.x\/arm\/older) Adeos patch URL\r\n         (ipipe-core-3.4.6-arm-4.patch) Path for Adeos patch file\r\n ...\r\n System configuration  --->\r\n     (ttyAMA0) Port to run a getty (login prompt) on\r\n ...\r\n\r\n Package Selection for the target --->\r\n    Real-Time --->\r\n        [*] Xenomai Userspace\r\n...\r\n<\/code><\/pre>\n<p>Ne pas oublier de virer la looongue liste de patchs relatifs au vieux noyau 2.6.x. Le plus simple pour cela est d'\u00e9diter directement le fichier .config de buildroot (buildroot\/.config) et ne mettre la valeur suivante pour les patch :<br \/>\n<code><\/p>\n<pre>\r\n BR2_LINUX_KERNEL_PATCH=\"..\/patches\/linux\/$(BR2_LINUX_KERNEL_VERSION)\"\r\n<\/code><\/pre>\n<p>Ainsi que les patches se trouvant dans le package xenomai du buildroot armadeus, qui sont eux aussi sp\u00e9cifiques au vieux noyau officiel:<br \/>\n<code><\/p>\n<pre>\r\n$ cd buildroot\/package\/xenomai\/\r\n$ rm adeos-00-compatibility_with_armadeus.patch adeos-01-adeos-prevent_system_freeze_on_mxc_with_gpio_generated_interrupts.patch\r\n<\/code><\/pre>\n<p>Il faut de plus modifier busybox :<br \/>\n<code><\/p>\n<pre>\r\n $ make busybox-menuconfig\r\n<\/code><\/pre>\n<p>Avec les options suivantes :<br \/>\n<code><\/p>\n<pre>\r\nShells  --->\r\n        Choose your default shell (ash)  --->\r\n    --- ash\r\n    ---   Ash Shell Options\r\n          ...\r\n          [*]   Builtin getopt to parse positional parameters \r\n<\/code><\/pre>\n<p>Puis lancer le make g\u00e9n\u00e9ral.<br \/>\n<code><\/p>\n<pre>\r\n$ make\r\n<\/code><\/pre>\n<p>Si cette erreur survient :<br \/>\n<code><\/p>\n<pre>\r\nmake[1]: \/opt\/projects\/armadeus\/apf28_xenomai\/buildroot\/output\/build\/xenomai-2.6.2.1\/scripts\/prepare-kernel.sh : commande introuvable\r\n<\/code><\/pre>\n<p>Il faut forcer la compilation du paquet x\u00e9nomai en lan\u00e7ant un make d\u00e9di\u00e9:<br \/>\n<code><\/p>\n<pre>\r\n$ make xenomai\r\n<\/code><\/pre>\n<p>Puis relancer le make g\u00e9n\u00e9ral:<br \/>\n<code><\/p>\n<pre>\r\n$ make\r\n<\/code><\/pre>\n<p>Tout doit s'\u00eatre d\u00e9roul\u00e9 correctement, il suffit maintenant de mettre son APF28 \u00e0 jour, sous <a href=\"http:\/\/www.denx.de\/wiki\/U-Boot\">U-Boot<\/a> \u00e7a donne un truc du genre :<\/p>\n<p><code><\/p>\n<pre>\r\nBIOS> run update_all\r\n<\/code><\/pre>\n<p>Vu que nous sommes sur un noyau Linux r\u00e9cent les d\u00e9veloppeur se sont amus\u00e9s \u00e0 changer les nom du tty de la console principale, il faut donc le dire \u00e0 U-Boot sinon on risque de ne pas voir Linux booter :<\/p>\n<p><code><\/p>\n<pre>\r\n$ setenv console console=ttyAMA0,115200n8\r\n$ setenv consoledev ttyAMA0\r\n<\/code><\/pre>\n<p>Et l\u00e0 on peut tenter un boot ... jusqu\u2019\u00e0 tomber sur cette erreur dans Linux :<br \/>\n<code><\/p>\n<pre>\r\nUBIFS error (pid 1): ubifs_get_sb: cannot open \"ubi0:rootfs\", error -19\r\nVFS: Cannot open root device \"ubi0:rootfs\" or unknown-block(0,0)\r\nPlease append a correct \"root=\" boot option; here are the available partitions:\r\n1f00            3072 mtdblock0 (driver?)\r\n1f01             512 mtdblock1 (driver?)\r\n1f02             512 mtdblock2 (driver?)\r\n1f03             512 mtdblock3 (driver?)\r\n1f04             512 mtdblock4 (driver?)\r\n1f05            8192 mtdblock5 (driver?)\r\n1f06          248832 mtdblock6 (driver?)\r\nKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)\r\nBacktrace:\r\n[<c00332c0>] (dump_backtrace+0x0\/0x110) from [<c0392fa0>] (dump_stack+0x18\/0x1c)\r\n r6:00008000 r5:c7fad000 r4:c04f2be0 r3:00000002\r\n[<c0392f88>] (dump_stack+0x0\/0x1c) from [<c0393018>] (panic+0x74\/0xf0)\r\n[<c0392fa4>] (panic+0x0\/0xf0) from [<c0008f1c>] (mount_block_root+0x1c8\/0x208)\r\n r3:00000002 r2:00000001 r1:c7c27f78 r0:c043f6e4\r\n[<c0008d54>] (mount_block_root+0x0\/0x208) from [<c00091e8>] (prepare_namespace+0x94\/0x1cc)\r\n[<c0009154>] (prepare_namespace+0x0\/0x1cc) from [<c0008afc>] (kernel_init+0x128\/0x170)\r\n r5:c0027b84 r4:c04f1d40\r\n[<c00089d4>] (kernel_init+0x0\/0x170) from [<c004dfe0>] (do_exit+0x0\/0x6dc)\r\n r5:c00089d4 r4:00000000\r\n<\/code><\/pre>\n<p>Car le nom du driver de NAND a lui aussi chang\u00e9 ! Or ce param\u00e8tre est transmis par U-Boot au kernel au moment du boot. Nous allons donc devoir modifier U-Boot pour que Linux d\u00e9marre correctement et r\u00e9ussisse \u00e0 charger le rootfs.<br \/>\nL'essentiel de la configuration de U-Boot se trouve dans le header suivant :<br \/>\n<code><\/p>\n<pre>\r\nbuildroot\/target\/device\/armadeus\/apf28\/apf28-u-boot-2013.04.h \r\n<\/code><\/pre>\n<p>\u00c0 la ligne 153 mettre la valeur suivante :<br \/>\n<code><\/p>\n<pre>\r\n#define CONFIG_MTDMAP\t\t\t\"gpmi-nand\"\r\n<\/code><\/pre>\n<p>Puis reconstruire U-Boot avec les commandes suivantes:<br \/>\n<code><\/p>\n<pre>\r\n$ make uboot-dirclean\r\n$ make uboot\r\n<\/code><\/pre>\n<p>Et enfin reflasher U-Boot sur son APF28:<br \/>\n<code><\/p>\n<pre>\r\nBIOS> run update_uboot\r\n<\/code><\/pre>\n<p>Un fois tout cela fait on peut booter Linux correctement et avoir X\u00e9nomai qui d\u00e9marre:<br \/>\n<code><\/p>\n<pre>\r\n$ dmesg | grep Xeno\r\n<\/code><\/pre>\n<p>Par contre il y a encore un probl\u00e8me avec le xeno-test.<br \/>\n<code><\/p>\n<pre>\r\n$ xeno-test\r\n<\/code><\/pre>\n<p>Mais on me souffle qu'il est plus facile de passer sur un kernel 3.8 avec le trunk du projet X\u00e9nomai pour r\u00e9soudre ce probl\u00e8me ...<\/p>\n<p>Je vais donc retourner discuter sur le<a href=\"irc:\/\/irc.rezosup.org\/#Armadeus\"> canal irc<\/a> pour me mettre \u00e0 la page. Suite au prochain \u00e9pisode...<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beaucoup de ceux qui ont travaill\u00e9 sur microcontr\u00f4leur et qui passent sur des syst\u00e8mes Linux pour l&#8217;embarqu\u00e9 sont surpris de tomber sur un syst\u00e8me qui n&rsquo;est pas temps r\u00e9el. Alors que l&rsquo;on \u00e9tait habitu\u00e9 \u00e0 g\u00e9rer l\u2019ordonnancement de nos t\u00e2ches &hellip; <a href=\"http:\/\/www.fabienm.eu\/wordpress\/2013\/10\/03\/xenomai-sur-apf28\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[106,10,123],"tags":[],"class_list":["post-553","post","type-post","status-publish","format-standard","hentry","category-embarque","category-informatique","category-kernel-programmation"],"_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=553"}],"version-history":[{"count":18,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/553\/revisions"}],"predecessor-version":[{"id":572,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/553\/revisions\/572"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=553"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}