{"id":586,"date":"2013-10-27T17:42:19","date_gmt":"2013-10-27T15:42:19","guid":{"rendered":"http:\/\/www.martoni.fr\/wordpress\/?p=586"},"modified":"2013-10-28T10:40:54","modified_gmt":"2013-10-28T08:40:54","slug":"xenomai-sur-apf28-avec-un-kernel-moderne-3-8","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/wordpress\/2013\/10\/27\/xenomai-sur-apf28-avec-un-kernel-moderne-3-8\/","title":{"rendered":"X\u00e9nomai sur APF28, avec un kernel moderne (3.8)"},"content":{"rendered":"<p>Cher journal,<\/p>\n<p>Je t&rsquo;\u00e9cris aujourd&rsquo;hui car je viens de voir une news passer <a href=\"http:\/\/linuxfr.org\/news\/apres-101-tours-de-jeu-fin-de-partie-pour-le-noyau-3-0-x\">sur LinuxFR<\/a> disant que le kernel long-term 3.0 de Linux n&rsquo;est plus support\u00e9 car cela fait deux ans qu&rsquo;il est sorti.<\/p>\n<p>Deux ans !<\/p>\n<p>Et dire qu&rsquo;Armadeus se traine encore <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=Kernel\">le support d&rsquo;antiquit\u00e9s<\/a> comme le 2.6.29 pour l&rsquo;apf27 ou le 2.6.35 pour l&rsquo;APF28. Il est temps de se lancer dans des trucs un peu moderne comme le <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=Kernel-with-device-tree\">device tree<\/a>, et d&rsquo;utiliser un xenomai r\u00e9cent.<\/p>\n<p>Je vais donc t&rsquo;expliquer, mon cher journal, ma d\u00e9marche d&rsquo;installation d&rsquo;un xenomai r\u00e9cent sur un kernel Linux 3.8 (donc r\u00e9cent).<\/p>\n<p><strong>Le kernel 3.8 ou l&rsquo;arriv\u00e9e du Device Tree<\/strong><\/p>\n<p>La raison pour laquelle j&rsquo;avais utilis\u00e9 un kernel 3.4.6 pour faire mes <a href=\"http:\/\/www.martoni.fr\/wordpress\/?p=553\">premi\u00e8res exp\u00e9rimentations de xenomai<\/a> \u00e9tait que c&rsquo;est un noyau suffisamment r\u00e9cent pour avoir des technologies moderne, mais c&rsquo;est un noyau suffisamment \u00abvieux\u00bb pour \u00e9viter la r\u00e9volution du Device Tree.<\/p>\n<p>Sauf que le 3.4.6 n&rsquo;est plus si neuf et si on veux rester un peu dans la course il faut bien s&rsquo;y mettre un jour \u00e0 ce fameux dt. Je me suis donc lanc\u00e9 sur le 3.8 car c&rsquo;est le noyau le plus r\u00e9cent qui est support\u00e9 par adeos <a href=\"http:\/\/download.gna.org\/adeos\/patches\/v3.x\/arm\/\">pour l&rsquo;architecture arm<\/a>.<\/p>\n<p><strong>Device tree ?<\/strong><\/p>\n<p>Le device tree est une technologie qui s&rsquo;est impos\u00e9e sur les architectures arm pour Linux. \u00c0 l&rsquo;origine sur les autres architectures, nous avions souvent un hard assez uniforme pour un type de processeur, les architectures des cartes m\u00e8res en x86 se ressemblent en g\u00e9n\u00e9rale par exemple. Cette diversit\u00e9 limit\u00e9 des architectures permettait d&rsquo;inscrire en dur dans le code de Linux un fichiers source pour chaque plate-forme (cf le r\u00e9pertoire arch\/ dans <a href=\"https:\/\/git.kernel.org\/cgit\/linux\/kernel\/git\/stable\/linux-stable.git\/tree\/arch?id=refs\/tags\/v3.11.6\">le code de linux<\/a>).<\/p>\n<p>Int\u00e9grer une nouvelle architecture sur un ancien noyau consiste donc \u00e0 cr\u00e9er un fichier source du nom de la plate-forme, et y d\u00e9crire les diff\u00e9rentes adresses m\u00e9moire, les fr\u00e9quences d&rsquo;horloges, les lignes d&rsquo;interruptions, num\u00e9ro de gpio, composant pr\u00e9sent sur chaque bus. Le tout dans des structures C appel\u00e9es au d\u00e9marrage. C&rsquo;est ce qu&rsquo;on trouve pour Armadeus dans les fichiers suivant par exemple:<\/p>\n<pre><code>\r\n# pour le kernel 2.6.35.3 sur APF28\r\narch\/arm\/mach-mx28\/apf28dev.c\r\narch\/arm\/mach-mx28\/mach-apf28.c\r\n<\/code><\/pre>\n<p>Le probl\u00e8me avec l&rsquo;<a href=\"http:\/\/www.arm.com\/\">ARM<\/a> c&rsquo;est que le nombre d&rsquo;architectures d\u00e9velopp\u00e9es autour ce processeur est pl\u00e9thorique (voir \/arch\/arm\/ dans le code Linux), et  cela commen\u00e7ait \u00e0 devenir ing\u00e9rable. C&rsquo;est pourquoi il a \u00e9t\u00e9 d\u00e9cid\u00e9 de s\u00e9parer la descriptions des architectures avec le codes (g\u00e9n\u00e9rique) de Linux.<\/p>\n<p>L&rsquo;id\u00e9e du device tree est de compiler une fois pour toute le noyau linux pour toutes les architectures du processeur et de d\u00e9marrer Linux en passant la description de la plate-forme en param\u00e8tre. Cela se traduit sous uboot par un binaire \u00e0 t\u00e9l\u00e9charger en plus, heureusement la macro est d\u00e9j\u00e0 pr\u00eate <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=Kernel-with-device-tree#Boot_Linux_using_U-Boot_scripts\">comme expliqu\u00e9 sur le wiki<\/a> il suffit de faire un run update_dtb :<\/p>\n<pre><code>\r\n# donner l'adresse m\u00e9moire du dt\r\nsetenv fdt_addr_r 41000000\r\n# mettre \u00e0 jour\r\nrun update_dtb\r\n<\/code><\/pre>\n<p>Dans l&rsquo;id\u00e9al, quand cela aura \u00e9t\u00e9 int\u00e9gr\u00e9 correctement chez Armadeus, il n&rsquo;y aura plus qu&rsquo;un seul binaire du noyau linux pour toutes nos cartes et il suffira de charger le bon device tree pour l&rsquo;APF que l&rsquo;on utilise. Ce qui sera un v\u00e9ritable gain en maintenance et permettra \u00e0 armadeus d&rsquo;\u00eatre beaucoup plus \u00e0 jour avec un moindre effort (un seul noyau \u00e0 supporter pour toutes les cartes).<\/p>\n<p>Mais nous n&rsquo;y sommes pas encore, c&rsquo;est un peu une qu\u00eate du Gr\u00e2\u00e2l pour l&rsquo;instant \ud83d\ude09<\/p>\n<p>Pour l&rsquo;instant nous en sommes encore \u00e0 l&rsquo;\u00e9tape de bouts de code pouss\u00e9 dans la mainline armadeus et pas encore officiellement support\u00e9. C&rsquo;est pourquoi il faut encore faire de nombreuses manipulations pour faire tourner un kernel moderne sur l&rsquo;APF28.<\/p>\n<p><strong>Installation du Kernel 3.8 pour APF28<\/strong><\/p>\n<p><a href=\"http:\/\/www.martoni.fr\/wordpress\/?p=553\">Comme dans mon billet pr\u00e9c\u00e9dent<\/a>, il faut \u00abdescendre\u00bb une vue r\u00e9cente d&rsquo;armadeus avec git :<\/p>\n<pre><code>\r\n$ git clone git:\/\/git.code.sf.net\/p\/armadeus\/code apf28\r\n<\/code><\/pre>\n<p>Puis le configurer pour l&rsquo;APF28 :<\/p>\n<pre><code>\r\n$ cd apf28\r\n$ make apf28_defconfig\r\n<\/code><\/pre>\n<p>Cette derni\u00e8re commande a pour vocation de configurer buildroot pour notre APF28 avec la configuration officiellement support\u00e9 par Armadeus. Mais nous, nous voulons un kernel plus r\u00e9cent (le 3.8 si vous suivez encore), donc nous allons devoir modifier tout <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=How_to_use_vanilla_kernel_on_APF28\">\u00e7a comme expliqu\u00e9 sur le wiki<\/a>.<\/p>\n<pre><code>\r\nToolchain  --->\r\n     Kernel Headers (Linux 2.6 (manually specified version))  --->\r\n     (3.8) linux version\r\n ...\r\n Kernel  --->\r\n     Kernel version (Custom version)  --->\r\n         (3.8) Kernel version\r\n     ... \r\n     (40008000) load address (for 3.7+ multi-platform image)\r\n     [*]   Device tree support\r\n     (imx28-apf28dev) Device Tree Source file names\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\/) Adeos patch URL\r\n         (ipipe-core-3.8-arm-1.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        [*]   Install testsuite\r\n...\r\n<\/code><\/pre>\n<p>Ne pas oublier de virer les patches freescales qui trainent encore pour les anciens noyau dans le fichier buildroot\/.config :<\/p>\n<pre><code>\r\nBR2_LINUX_KERNEL_PATCH=\"..\/patches\/linux\/$(BR2_LINUX_KERNEL_VERSION)\"\r\n<\/code><\/pre>\n<p>Le nom du driver de nand a chang\u00e9 depuis la version utilis\u00e9 par d\u00e9faut chez Armadeus. Il est donc n\u00e9cessaire de le changer dans U-Boot pour qu&rsquo;il passe les bons param\u00e8tre \u00e0 Linux au d\u00e9marrage. Pour cela il faut modifier le fichier suivant :<\/p>\n<pre><code>\r\nbuildroot\/target\/device\/armadeus\/apf28\/apf28-u-boot-2013.04.h\r\n<\/code><\/pre>\n<p>Et \u00e0 la ligne 153 mettre la valeur suivante :<\/p>\n<pre><code>\r\n#define CONFIG_MTDMAP\t\t\t\"gpmi-nand\"\r\n<\/code><\/pre>\n<p><strong>Xenomai 2.6.3<\/strong><\/p>\n<p>Par defaut, la version de xenomai sur armadeus est la 2.6.2.1. Comme on veut le dernier cri on va changer la version \u00e0 la 2.6.3 en modifiant le package dans :<\/p>\n<pre><code>\r\nbuildroot\/package\/xenomai\/xenomai.mk\r\n<\/code><\/pre>\n<p>En modifiant la ligne :<\/p>\n<pre><code>\r\nXENOMAI_VERSION = 2.6.3\r\n<\/code><\/pre>\n<p>Et comme pour le 3.4.6 il faut virer les patches qui trainent dans ce r\u00e9pertoire :<\/p>\n<pre><code>\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>On modifie toujours busybox :<\/p>\n<pre><code>\r\nmake busybox-menuconfig\r\n<\/code><\/pre>\n<p>En ajoutant l&rsquo;option suivante:<\/p>\n<pre><code>\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><strong>make<\/strong><\/p>\n<p>Apr\u00e8s toutes ces modifications on peut enfin lancer la compilation g\u00e9n\u00e9rale:<\/p>\n<pre>\r\nmake\r\n<\/pre>\n<p>Il semble y avoir une erreur \u00e9trange avec le packet xenomai, pour \u00eatre sur qu&rsquo;il le compile et l&rsquo;installe, une fois la premi\u00e8re compilation compl\u00e8te r\u00e9aliser il faut relancer une compilation sp\u00e9cifique du package xenomai:<\/p>\n<pre><code>\r\nmake xenomai-dirclean;make xenomai;make linux;make;cp -v buildroot\/output\/images\/* \/tftpboot\/\r\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Installation de la cible<\/strong><\/p>\n<p>L'installation sur la cible est l\u00e9g\u00e8rement diff\u00e9rente des binaires officiels car nous avons \u00e0 installer le fameux devices tree. Et le kernel \u00e9tant r\u00e9cent, il faut aussi changer le nom de l'uart utilis\u00e9 pour la console:<\/p>\n<pre><code>\r\n$ setenv console console=ttyAMA0,115200n8\r\n$ setenv consoledev ttyAMA0\r\n$ setenv fdt_addr_r 41000000\r\n$ saveenv\r\n<\/code><\/pre>\n<p>Si l'ip du serveur tftp est configur\u00e9e correctement il suffit de faire un update_all pour (presque) tout installer :<\/p>\n<pre><code>\r\nrun update_all\r\n<\/code><\/pre>\n<p>\u00c0 ce niveau on peut faire une tentative de boot, mais nous allons rester bloqu\u00e9 \u00e0 la d\u00e9compression du kernel :<\/p>\n<pre><code>\r\nBIOS> boot\r\n\r\nNAND read: device 0 offset 0x400000, size 0x80000\r\n 524288 bytes read: OK\r\n\r\nLoading from nand0, offset 0x500000\r\n   Image Name:   Linux-3.8.0-ipipe\r\n   Created:      2013-10-27  14:55:29 UTC\r\n   Image Type:   ARM Linux Kernel Image (uncompressed)\r\n   Data Size:    2969768 Bytes = 2.8 MiB\r\n   Load Address: 40008000\r\n   Entry Point:  40008000\r\n## Booting kernel from Legacy Image at 40000000 ...\r\n   Image Name:   Linux-3.8.0-ipipe\r\n   Created:      2013-10-27  14:55:29 UTC\r\n   Image Type:   ARM Linux Kernel Image (uncompressed)\r\n   Data Size:    2969768 Bytes = 2.8 MiB\r\n   Load Address: 40008000\r\n   Entry Point:  40008000\r\n   Verifying Checksum ... OK\r\n## Flattened Device Tree blob at 41000000\r\n   Booting using the fdt blob at 0x41000000\r\n   Loading Kernel Image ... OK\r\nOK\r\n   Loading Device Tree to 47b33000, end 47b39d9f ... OK\r\n\r\nStarting kernel ...\r\n\r\nUncompressing Linux... done, booting the kernel.\r\n<\/code><\/pre>\n<p><strong>Patch ad\u00e9os<\/strong><\/p>\n<p>D'apr\u00e8s <a href=\"http:\/\/www.xenomai.org\/pipermail\/xenomai\/2013-July\/028837.html\">Marek Vasut<\/a> il y a un probl\u00e8me dans le patch adeos pour imx28, il faut modifier le fichier icoll.c dans linux :<\/p>\n<pre><code>\r\n$ vim buildroot\/output\/build\/linux-3.8\/arch\/arm\/mach-mxs\/icoll.c\r\n<\/code><\/pre>\n<p>Et modifier la ligne 95 :<\/p>\n<pre><code>\r\n-    handle_IRQ(irqnr, regs);\r\n+    ipipe_handle_multi_irq(irqnr, regs);\r\n<\/code><\/pre>\n<p>On peut ensuite tout recompiler pour avoir quelques chose de fonctionnel :<\/p>\n<pre>\r\n make linux;make;mv -v buildroot\/output\/images\/* \/tftpboot\/\r\n<\/pre>\n<p><strong>Testbench Xenomai<\/strong><\/p>\n<p>On peut valider le bon d\u00e9marrage de Xenomai au moyen de la commande suivante :<\/p>\n<pre>\r\n# dmesg | grep Xeno\r\nI-pipe: head domain Xenomai registered.\r\nXenomai: hal\/arm started.\r\nXenomai: scheduling class idle registered.\r\nXenomai: scheduling class rt registered.\r\nXenomai: real-time nucleus v2.6.3 (Lies and Truths) loaded.\r\nXenomai: starting native API services.\r\nXenomai: starting POSIX services.\r\nXenomai: starting RTDM services.\r\n<\/pre>\n<p>Pour lancer le testbench complet de Xenomai, ne pas oublier de monter le driver idoine :<\/p>\n<pre>\r\nmodprobe xeno_switchtest\r\n<\/pre>\n<p>Puis pour lancer le test :<\/p>\n<pre>\r\nxeno-test\r\n<\/pre>\n<p>Ce qui donne le r\u00e9sultat suivant sur l'apf28 :<\/p>\n<pre><code>\r\nStarted child 584: \/bin\/sh \/usr\/bin\/xeno-test-run-wrapper \/usr\/bin\/xeno-test\r\n+ echo 0\r\n+ \/usr\/bin\/arith\r\nmul: 0x79364d93, shft: 26\r\ninteg: 30, frac: 0x4d9364d9364d9364\r\n\r\nsigned positive operation: 0x03ffffffffffffff * 1000000000 \/ 33000000\r\ninline calibration: 0x0000000000000000: 375.074 ns, rejected 5\/10000\r\ninlined llimd: 0x79364d9364d9362f: 4084.395 ns, rejected 8\/10000\r\ninlined llmulshft: 0x79364d92ffffffe1: 94.725 ns, rejected 2\/10000\r\ninlined nodiv_llimd: 0x79364d9364d9362f: 167.000 ns, rejected 2\/10000\r\nout of line calibration: 0x0000000000000000: 375.174 ns, rejected 3\/10000\r\nout of line llimd: 0x79364d9364d9362f: 4084.758 ns, rejected 10\/10000\r\nout of line llmulshft: 0x79364d92ffffffe1: 123.900 ns, rejected 1\/10000\r\nout of line nodiv_llimd: 0x79364d9364d9362f: 166.625 ns, rejected 4\/10000\r\n\r\nsigned negative operation: 0xfc00000000000001 * 1000000000 \/ 33000000\r\ninline calibration: 0x0000000000000000: 375.049 ns, rejected 6\/10000\r\ninlined llimd: 0x86c9b26c9b26c9d1: 4124.954 ns, rejected 10\/10000\r\ninlined llmulshft: 0xd45d172d0000001e: 124.375 ns, rejected 2\/10000\r\ninlined nodiv_llimd: 0x86c9b26c9b26c9d1: 166.995 ns, rejected 2\/10000\r\nout of line calibration: 0x0000000000000000: 375.187 ns, rejected 4\/10000\r\nout of line llimd: 0x86c9b26c9b26c9d1: 4118.808 ns, rejected 10\/10000\r\nout of line llmulshft: 0xd45d172d0000001e: 94.737 ns, rejected 3\/10000\r\nout of line nodiv_llimd: 0x86c9b26c9b26c9d1: 166.787 ns, rejected 2\/10000\r\n\r\nunsigned operation: 0x03ffffffffffffff * 1000000000 \/ 33000000\r\ninline calibration: 0x0000000000000000: 375.012 ns, rejected 7\/10000\r\ninlined nodiv_ullimd: 0x79364d9364d9362f: 83.391 ns, rejected 2\/10000\r\nout of line calibration: 0x0000000000000000: 375.058 ns, rejected 1\/10000\r\nout of line nodiv_ullimd: 0x79364d9364d9362f: 165.141 ns, rejected 4\/10000\r\n+ \/usr\/bin\/clocktest -C 42 -T 30\r\n== Tested clock: 42 (CLOCK_HOST_REALTIME)\r\nCPU      ToD offset [us] ToD drift [us\/s]      warps max delta [us]\r\n--- -------------------- ---------------- ---------- --------------\r\n  0                  2.7            0.005          0            0.0\r\n+ \/usr\/bin\/switchtest -T 30\r\n== Testing FPU check routines...\r\n== FPU check routines: unimplemented, skipping FPU switches tests.\r\n== Threads: sleeper0-0 rtk0-1 rtk0-2 rtup0-3 rtup0-4 rtus0-5 rtus0-6 rtuo0-7 rtuo0-8\r\nRTT|  00:00:01\r\nRTH|---------cpu|ctx switches|-------total\r\nRTD|           0|        5537|        5537\r\nRTD|           0|        5535|       11072\r\nRTD|           0|        5535|       16607\r\nRTD|           0|        5558|       22165\r\nRTD|           0|        5539|       27704\r\nRTD|           0|        5535|       33239\r\nRTD|           0|        5535|       38774\r\nRTD|           0|        5558|       44332\r\nRTD|           0|        5535|       49867\r\nRTD|           0|        5535|       55402\r\nRTD|           0|        5537|       60939\r\nRTD|           0|        5517|       66456\r\nRTD|           0|        5537|       71993\r\nRTD|           0|        5576|       77569\r\nRTD|           0|        5519|       83088\r\nRTD|           0|        5578|       88666\r\nRTD|           0|        5537|       94203\r\nRTD|           0|        5519|       99722\r\nRTD|           0|        5535|      105257\r\nRTD|           0|        5551|      110808\r\nRTD|           0|        5542|      116350\r\nRTT|  00:00:22\r\nRTH|---------cpu|ctx switches|-------total\r\nRTD|           0|        5537|      121887\r\nRTD|           0|        5578|      127465\r\nRTD|           0|        5517|      132982\r\nRTD|           0|        5537|      138519\r\nRTD|           0|        5578|      144097\r\nRTD|           0|        5519|      149616\r\nRTD|           0|        5578|      155194\r\nRTD|           0|        5535|      160729\r\nRTD|           0|        4657|      165386\r\n+ \/usr\/bin\/cond-torture-native\r\nsimple_condwait\r\nrelative_condwait\r\nabsolute_condwait\r\nsig_norestart_condwait\r\nsig_restart_condwait\r\nsig_norestart_condwait_mutex\r\nsig_restart_condwait_mutex\r\nsig_norestart_double\r\nsig_restart_double\r\ncond_destroy_whilewait\r\nTest OK\r\n+ \/usr\/bin\/cond-torture-posix\r\nsimple_condwait\r\nrelative_condwait\r\nabsolute_condwait\r\nsig_norestart_condwait\r\nsig_restart_condwait\r\nsig_norestart_condwait_mutex\r\nsig_restart_condwait_mutex\r\nsig_norestart_double\r\nsig_restart_double\r\ncond_destroy_whilewait\r\nTest OK\r\n+ \/usr\/bin\/mutex-torture-native\r\nsimple_wait\r\nrecursive_wait\r\ntimed_mutex\r\nmode_switch\r\npi_wait\r\nlock_stealing\r\nNOTE: lock_stealing mutex_trylock: not supported\r\ndeny_stealing\r\nsimple_condwait\r\nrecursive_condwait\r\nauto_switchback\r\nTest OK\r\n+ \/usr\/bin\/mutex-torture-posix\r\nsimple_wait\r\nrecursive_wait\r\nerrorcheck_wait\r\ntimed_mutex\r\nmode_switch\r\npi_wait\r\nlock_stealing\r\nNOTE: lock_stealing mutex_trylock: not supported\r\ndeny_stealing\r\nsimple_condwait\r\nrecursive_condwait\r\nauto_switchback\r\nTest OK\r\n+ start_load\r\n+ echo start_load\r\n+ check_alive \/usr\/bin\/latency\r\n+ echo check_alive \/usr\/bin\/latency\r\n+ wait_load\r\nStarted child 640: dohell 900\r\nStarted child 641: \/usr\/bin\/latency\r\n== Sampling period: 1000 us\r\n== Test mode: periodic user-mode task\r\n== All results in microseconds\r\nwarming up...\r\nRTT|  00:00:01  (periodic user-mode task, 1000 us period, priority 99)\r\nRTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst\r\nRTD|     77.333|     87.708|    108.541|       0|     0|     77.333|    108.541\r\nRTD|     44.166|     87.458|    109.958|       0|     0|     44.166|    109.958\r\nRTD|     66.249|     87.583|    109.166|       0|     0|     44.166|    109.958\r\nRTD|     67.624|     87.874|    108.958|       0|     0|     44.166|    109.958\r\nRTD|     68.583|     87.916|    100.583|       0|     0|     44.166|    109.958\r\nRTD|     66.458|     87.791|     95.416|       0|     0|     44.166|    109.958\r\nRTD|     66.916|     87.791|     97.541|       0|     0|     44.166|    109.958\r\nRTD|     67.374|     87.833|     96.749|       0|     0|     44.166|    109.958\r\nRTD|     68.624|     87.833|     98.416|       0|     0|     44.166|    109.958\r\nRTD|     66.749|     87.833|     97.249|       0|     0|     44.166|    109.958\r\nRTD|     67.249|     87.874|     97.916|       0|     0|     44.166|    109.958\r\nRTD|     67.833|     87.874|     96.708|       0|     0|     44.166|    109.958\r\nRTD|     65.999|     87.791|     98.374|       0|     0|     44.166|    109.958\r\nRTD|     67.541|     87.874|     96.749|       0|     0|     44.166|    109.958\r\nRTD|     67.958|     87.833|     95.249|       0|     0|     44.166|    109.958\r\nRTD|     66.874|     87.916|     98.791|       0|     0|     44.166|    109.958\r\n\u0003\/usr\/bin\/xeno-test-run-wrapper: \/usr\/bin\/xeno-test: line 1: can't open \/tmp\/xeno-test-in-584: Interrupted system call\r\n---|-----------|-----------|-----------|--------|------|-------------------------\r\nRTS|     44.166|     87.791|    109.958|       0|     0|    00:00:17\/00:00:17\r\n<\/code><\/pre>\n<p><strong>Conclusion<\/strong><\/p>\n<p>Et voila, mon cher journal, le r\u00e9sultat de toute mon \u00e9pop\u00e9e fantastique. La qu\u00eate fut longue et fastidieuse, et cette proc\u00e9dure m\u00e9riterait certainement une configuration d\u00e9di\u00e9e chez armadeus.<br \/>\nQue penserais-tu, mon cher journal d'un :<\/p>\n<pre>\r\nmake apf28_xeno3.8_defconfig\r\n<\/pre>\n<p>Je suis sur que \u00e7a int\u00e9resserait du monde, on pourrait m\u00eame envisager de faire une telle cible pour chaque noyau partiellement support\u00e9 dans armadeus.<a href=\"http:\/\/sourceforge.net\/p\/armadeus\/code\/commit_browser\"> Vu les r\u00e9cents commit<\/a> il semble y avoir pas mal de personnes qui se lance dans la compilation autre que le kernel officiel armadeus.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cher journal, Je t&rsquo;\u00e9cris aujourd&rsquo;hui car je viens de voir une news passer sur LinuxFR disant que le kernel long-term 3.0 de Linux n&rsquo;est plus support\u00e9 car cela fait deux ans qu&rsquo;il est sorti. Deux ans ! Et dire qu&rsquo;Armadeus &hellip; <a href=\"http:\/\/www.fabienm.eu\/wordpress\/2013\/10\/27\/xenomai-sur-apf28-avec-un-kernel-moderne-3-8\/\">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],"tags":[],"class_list":["post-586","post","type-post","status-publish","format-standard","hentry","category-embarque","category-informatique"],"_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/586","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=586"}],"version-history":[{"count":27,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/586\/revisions"}],"predecessor-version":[{"id":613,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/586\/revisions\/613"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=586"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}