Xenomai

Xenomaiリンク

オフィシャルサイト

本家サイトです。最新版ダウンロードがあります。

Captain's Universe

Xenomaiを利用する色々なサンプルがあります。

RTnet

リアルタイム・ネットワークプロトコル・スタック

EtherCAT

リアルタイム・イーサネットプロトコル

EtherCATマスターライブラリ

Orocos

ロボット制御ライブラリ、フレームワーク

 

インストール

古いUbuntu-9.04にXenomai-2.4.8を組み込む手順。

※「説明」ではなく「メモ」ですのでご了承を。

Xenomai-3.Xでは、kernel-modeのサポートが無くなるらしい。 いままでRTLinux/Freeで開発したドライバーをRTDMにする必要がありそうだが、その前にXenomai-2.X系でkernel-mode用のドライバーとして移植したほうが順当かもしれない。

さて、もうサポートの終了したUbuntu-9.04。カーネルオプションでは、CPUにAtomを選ぶことはできないので、現時点であれば10.4LTS以降に組込むほうがいいかもしれない。
サポート無しなのでリポジトリが無くなっているし、最新のアップデートも出来ないが、古いリポジトリに変更することでカーネルソースは入手できる。

"このリポジトリをあまり使うな"というような注意書きがあったと思うが、計測制御に使うOSのバージョンが数年で無くなっても困る。何らかの理由でパッケージをインストールしたい事もあるかもしれないのに、リポジトリが無いからOSのバージョンを上げるような事態になるのは問題。

例えば、「何年か後にsambaを入る必要がでてきたが、もうリポジトリが無いので、OSのバージョンを上げる」というのでは運用上の問題も生ずるだろう。前もって、そういうパッケージを入れておけばいいのだが、何が必要になるのかの判断は難しいし、必要最小限の機能で出発するのが普通である。

(旧版リポジトリ)

# Required
deb http://old-releases.ubuntu.com/ubuntu/ jaunty main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ jaunty main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ jaunty-updates main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ jaunty-updates main restricted universe multiverse
deb http://old-releases.ubuntu.com/ubuntu/ jaunty-security main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ jaunty-security main restricted universe multiverse
# Optional
deb http://old-releases.ubuntu.com/ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ jaunty-backports main restricted universe multiverse

この修正は、/etc/apt/sources.listを編集するのだが、上記を追加した後に、パッケージリストの再読込みをする事を忘れないように。(apt-get update)
ここからapt-getすると、9.04の最新ソースlinux-2.6.28-19.66が入手できるようだが、以下の例はlinux-2.6.28-17.58なのでひとつ前のソースということになる。

Xenomaiはいつ頃からか、カーネルに組み込む形式になった。昔はRTLinuxと同様でmoduleだったはず。そのため、カーネル再構築の作業になる。

<開発及び動作環境(テスト用)>

マザーボード -- Jetway ATOM-GM1-330
PCI-Express x1 -- 1 slot
PCI   -- 2 slot
チップセット -- 945GC,ICH7
メモリ -- DDR2 4GB (※ Ubuntu-9.04の32ビット版なのでMax 3GB)
ビデオ -- オンボード(GMA950)
LAN -- RTL-8102EL

このマザーボードは、現時点では売られていないが、その当時に選んだ理由は簡単。Atomで省電力、PCIスロットが2つある事。ただ、テスト用のマザーボードなのでPCIバスの消費電力は未確認のまま。
PCIバスには、DIOボードとGPIBボードを入れるため、2スロットが必要だった。最近では、PCI-Express x1の計測ボードもあるようだが、現在所有しているのがCONTEC PIO-32/32F(PCI)Hと、GP-IB(PCI)Fの2枚のPCIボードのため。

カーネル再構築作業になるので、前もってUbuntu-9.04デスクトップ版をインストールしておく必要があるし、コンパイル環境などもインストールしてあるのが前提。(※ build-essential、dctrl-toolsなどの他に、開発に必要なライブラリなどもインストールしておく。) また、Xenomaiをインストールするので、前もってCPUの特徴を調べておく。(※cat /proc/cpuinfo)
これで表示される情報の中にflagsがあるが、fpu,tsc,apic,sepなどの機能があるかをチェックしておく。大昔のAthlon+AppoloPro-KT113Aなどはapicも無かった。

このAtomマザーにUbuntu-9.04は素直にインストールできるのだが、入手したカーネルソースのconfigには、CONFIG_M586=yとなっている。M586ではCPUのtscを使ったXenomaiテストができないはず。やっぱりUbuntu-10.04LTSの方がよかったかもしれないが、このまま作業を進める。

<作業の流れ>
  1) Ubuntu-9.04のカーネルソースを入手する。
  2) Xenomai-2.4.8のソースを入手する。(一応、kernel-2.6.28用のXenomai)
  3) Ubuntu-9.04カーネルソースにAdeosパッチを入れる。
  4) Ubuntu-9.04カーネルソースにXenomaiの変更を加える。 ※(3)、(4)は専用スクリプトで同時にできる。
  5) make xconfigで新カーネルオプションを設定する。
  6) Ubuntuカーネルのコンパイル。
  7) Xenomaiのインストール。
  8) 6)で生成したxenomaiカーネルをインストールする。
  9) 再起動してxenomaiカーネルを起動する。

 

  (1) Ubuntu-9.04のカーネルソースを入手する。

sudo -s

以下は全てrootでの作業になる。

cd /usr/src
apt-get source linux-image-2.6.28-17-generic

linux-2.6.28.orig.tar.gzというソースファイルと"〜.diff.gz","〜.dsc"ファイルができる。
linux-2.6.28ディレクトリーは、2.6.28-17.58が展開されたソースになる。

  ※2011/7/31時点では前述のリポジトリーから、linux_2.6.28-19.66.diff.gz、linux_2.6.28-19.66.dsc、
      linux_2.6.28.orig.tar.gzの3つのファイルとlinux-2.6.28ディレクトリーが作成されるが、
      この例では一つ前の17.58のソースを使用している。

tar czf linux-2.6.28-17.58.tar.gz linux-2.6.28

linux-2.6.28ディレクトリーは、Adeos,Xenomaiの変更を加えるベースとなるカーネルソースなので、このまま圧縮保存しておく。

mv linux-2.6.28 linux-2.6.28-17.58-xeno

ソースツリーのディレクトリー名称を変更しておく。

ln -s linux-2.6.28-17.58-xeno linux

linuxシンボリックリンクを作成しておく。

 

(2) Xenomai-2.4.8のソースを入手する。

http://www.xenomai.org/index.php/Xenomai:Newsから、xenomai-2.4.8.tar.bz2を入手する。
そして、ソースを展開する。

cd /usr/src
tar xvjf xenomai-2.4.8.tar.bz2

そうすると、xenomai-2.4.8というディレクトリーが出来る。
この/usr/src/xenomai-2.4.8が、README.INSTALLで書かれている$xenomai_rootになる。

 

(3) Ubuntu-9.04カーネルソースにAdeosパッチを入れる。

README.INSTALLに書かれているように、$xenomai_root/scripts/prepare-kernel.shでも指定できるが、 ここでは先にパッチを当ててしまう。

cd /usr/src
cp -p xenomai-2.4.8/ksrc/arch/x86/patches/adeos-ipipe-2.6.28.9-x86-2.2-07.patch .
cd linux
patch -p1 -f < ../adeos-ipipe-2.6.28.9-x86-2.2-07.patch

 

(4) Ubuntu09.04カーネルソースにXenomaiの変更を加える。

cd /usr/src/linux
cp -p /boot/config-2.6.28-17-generic .config

標準のカーネルオプションをコピーしておく。但し、この中には、CONFIG_M586=yの設定がある。果たしてこの設定で、CPUのtsc機能を使えるのかが判らないので、変更すべきだと思われる。tsc,sepを使わないとXenomaiのサンプルプログラムも動作しない場合もある。(※"latency"テストなど)
9.04ではAtomの設定がないので、このあたりが不便。

MakefileのEXTRAVERSIONを変更しておく。バージョンは2.6.28-17.58のはずだが、MakefileのEXTRAVERSIONには".10"が設定されている。"-17.58"でもなく、"-17-generic"でもない。

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 28
EXTRAVERSION = .10

少しvermagicを調べてみる。
modinfo /lib/modules/2.6.28-17-generic/kernel/drivers/net/3c501.ko で調べると"vermagic: 2.6.28-17-generic SMP mod_unload modversions 586"となる。やはり、"EXTRAVERSION = .10"というのは...?。 しかも、"586"の表示が。

とりあえず、Makefileでは"EXTRAVERSION = -17"にして、make-kpkgの--append-to-versionに"-xeno"を指定し、--revisionに"17.58"にしておく。

vermagicは、2.6.28-17-xenoになるが、計測ボード用ドライバー(DIO,GPIB)は自作になるのでかまわない。Linux2.6系の計測ドライバーはvermagicが同じでなければロードできないので、計測ボードメーカーのドライバー等を使用する際には注意したほうがいい。
また、vermagicを一致させても、カーネルのデバッグオプションなどが異なるとドライバーもロードできなくなる。この場合、modinfoでvermagicを確認しても区別はつかないので注意が必要。

cd /usr/src/xenomai-2.4.8
scripts/prepare-kernel.sh --arch=i386 --linux=/usr/src/linux
又は、
scripts/prepare-kernel.sh --arch=i386 --linux=/usr/src/linux-2.6.28-17.58-xeno

既に(3)でAdeosパッチを当てているので、ここでは--adeosオプションは使用しない。
※Atom330(1.6GHz)で10秒程度かかる。

 

(5) make xconfigで新カーネルオプションを設定する。

cd /usr/src/linux
make xconfig

このカーネルオプションの設定は、大変面倒くさいが、CPU関連、Adeos関連、Xenomai関連のオプションを指定することになるので、注意深く、設定する必要がる。設定しだいでは、$xenomai_root/src/testsuiteにあるサンプルプログラムが動作しない場合もある。

コンフィグレーション画面の設定項目は膨大な数があるので、殆どはUbuntu-9.04のコンフィグファイルの設定をそのまま使うが、以下の部分は設定を変更する。

[Real-time sub-system]

WARNINGが表示されている状態では、Xenomaiオプションは設定できないので、
このWARNINGを無くすように設定する必要がある。
[Power management and ACPI option]配下にある[ACPI support],[APM support],
[CPU Frequency scaling]のチェックを全てはずすと、Xenomaiオプションの設定が
可能になる。

    [Xenomai]                                               ON -> ON
    [Nucleus]                                               ON -> ON
        [Pervasive real-time support in user-space]         ON -> ON
            [Interrupt shield support]                      OFF-> OFF
            [Priority coupling support]                     ON -> ON
        [Optimize as pipeline head]                         ON -> ON
        [Statistics collection]                             ON -> ON
        [Debug support]                                     OFF-> ON (*)
            [Nucleus Debugging support]                     OFF-> OFF
            [Queue Debugging support]                       OFF-> OFF
            [Registry Debugging support]                    OFF-> OFF
            [Timer Debugging support]                       OFF-> OFF
            [Watchdog support]                              ON -> ON
        [Shared interrupt]                                  OFF-> ON (*)
        [Timing]
            [Enable periodic timing]                        OFF-> OFF
        [Scalability]
            [O(1) scheduler]                                OFF-> OFF
            [Timer indexing method]                         (1)-> (1)
                (1) Linear
                (2) Tree
                (3) Hash
        [Machine]
            [Enable FPU support]                            ON -> ON
            [NMI watchdog]
                [Enable NMI watchdog]                       OFF-> OFF
            [SMI workaround]
                [Disable SMI detection]                     OFF-> OFF
                    [Enable SMI workaround]                 OFF-> ON (*)
                        [Globally disable SMI]              ON -> ON
        [Interfaces]
            [Native API]                                    ON -> ON
                [Message pipes]                             ON -> ON
                [Counting semaphores]                       ON -> ON
                [Event flags]                               ON -> ON
                [Mutexes]                                   ON -> ON
                [Condition variables]                       ON -> ON
                [Message queues]                            ON -> ON
                [Memory heaps]                              ON -> ON
                [Alarms]                                    ON -> ON
                [Message passing support]                   ON -> ON
                [Interrupts]                                OFF-> ON (*)
                [Debugging support]                         ON -> ON
            [POSIX API]                                     ON -> ON
                [Shared Memory]                             OFF-> ON (*)
                [Interrupt]                                 OFF-> ON (*)
                [Select syscall]                            OFF-> ON (*)
                [Debugging support]                         ON -> ON
            [pSOS+emulator]                                 OFF-> OFF
            [uITRON API]                                    OFF-> OFF
            [VRTX emulator]                                 OFF-> OFF
            [VxWorks emulator]                              OFF-> OFF
            [RTAI emulator]                                 OFF-> OFF
            [Real-Time Driver Model]                        ON -> ON
                [Select support for RTDM file descriptors]  OFF-> OFF
                [RTDM debugging support]                    ON -> ON
        [Drivers]
            [Serial drivers]
                [16550A UART driver]                        OFF-> ON (*)
                    [Hardware access mode]                  (1)-> (1)
                        (1) Port-based
                        (2) Memory-mapped
                        (3) Any access mode
            [Testing drivers]                               OFF-> ON (*)
                [Timer benchmark driver]                    OFF-> ON (*)
                  [Kernel-only latency measurement module]  OFF-> ON (*)
                [IRQ benchmark driver]                      OFF-> ON (*)
                [Context switch unit testing driver]        OFF-> ON (*)
            [CAN drivers]                                   OFF-> ON (*)
                全てONに

[Processor type and features]
    [Processor family]
        Atomの設定が無いので、
            [586/K5/5x86/6x86/6x86MX] -> 
                [Pentium-4/Celeron(P4-based)/Pentium4M/older Xeon]   (*)
    [SMT(Hyperthreading) scheduler support]                ON -> ON
    [Multi-core scheduler support]                         ON -> ON
    [Preemption Model]                                     (2)-> (2) 
        (1) No Forced Preemption
        (2) Voluntary Kernel Preemption
        (3) Preemptible Kernel
    [Timer frequency]                                      (2)-> (1) (*)
        (1) 100Hz
        (2) 250Hz
        (3) 300Hz
        (4) 1000Hz

[Power management and ACPI option]
        [Hibernation]                                      ON -> OFF (*)
    [ACPI support]                                         ON -> OFF (*)
    [APM support]                                          ON -> OFF (*)
    [CPU Frequency scaling]                                ON -> OFF (*)

[Kernel hacking]
    [Kernel debugging]                                     ON -> ON
        [Compile the kernel with debug info]               ON -> OFF (*)
    その他のデバッグオプションはデフォルトのままにして、
    必要なときに設定してカーネルを再構築する。

(*)が変更した箇所。

[Shared interrupt]は、PCIボードでの割込みを扱うカーネル空間用のドライバーを 作るためにONにしておく。

[Compile the kernel with debug info]がONになっているのでOFFにする。 これが有効になっているとカーネルのファイルサイズが10倍ぐらいになってしまうので、 起動時間も遅くなる。どうしてもデバッグが必要になったときに再構築すればいい。

[Timer frequency]のデフォルトが250Hzだが、リアルタイム計測部からのデータを 画面に表示させる必要もあるので、少しでもアプリケーション側にCPUリソースを多く与えるために、 一般的な100Hzに戻す。

(※ちなみに昔のPentium 1GHz程度のCPUでは、100Hzと250Hzでは、カーネル コンパイル時間はあまり違わないが、1000Hzにすると何倍もかかったような記憶がある。)

最後に、「保存」ボタンを押して、.configに設定データを保存させる。

 

(6) Ubuntuカーネルのコンパイル。

make-kpkg clean
make-kpkg --initrd --append-to-version -xeno --revision 17.58 kernel_image modules_image

すぐにエラーが表示されて止まる。
include/linux/ipipe.h:76:2: error: #error "CONFIG_NR_CPUS is too large, please lower it."
.configを調べると、CONFIG_NR_CPUS=64になっているが、ATOM330なのでCONFIG_NR_CPUS=4に変更しておく。 ここで再びmake xconfigで修正する。

[Processor type and features]
(64)Maximum number of CPUs(2-512) -> (4)Maximum number of CPUs(2-512)

64を4に変更するのだが、xconfigの場合は、上の該当行をダブルクリックすると数字の変更ができる。 .configに保存して終了する。

そして、再び

make-kpkg clean
make-kpkg --initrd --append-to-version -xeno --revision 17.58 kernel_image modules_image

...3時間20分待つ。

/usr/src/linux-image-2.6.28-17-xeno_17.58_i386.debが出来上がる。

なんと276MBのサイズ!

 

(7) Xenomaiのインストール。

mkdir /usr/src/xenomai-build
cd /usr/src/xenomai-build
../xenomai-2.4.8/configure  --enable-x86-sep
make install

...1分30秒待つ

 

(8) (6)で生成したxenomaiカーネルをインストールする。

cd ..
cp -p /boot/grub/menu.lst /boot/grub/menu-orig.lst
dpkg -i linux-image-2.6.28-17-xeno_17.58_i386.deb

一応、現在のmenu.lstを保存しておく。
menu.lstには、この新しいxenomaiカーネルのエントリーは作成されないので、自分でmenu.lstに追加する。

 

(9) 再起動してxenomaiカーネルを起動する。

[    0.000000] Your mptable is wrong, contact your HW vendor!
[ 0.000000] BIOS bug, no explicit IRQ entries, using default mptable. (tell your hw vendor)

起動時、このようなエラーが表示される。
Ubuntu-9.04,kernel-2.6.28-17では、Atomの選択が無かったのでPentium4にしたが、mptableのバージョンを認識できないようだ。

しかし、SMPとして2つのCPUとしては認識しているし、Xenomai関連は動作しているので、 試験程度では問題ないだろう。

[    5.586537] I-pipe: Domain Xenomai registered.
[ 5.586632] Xenomai: hal/i386 started.
[ 5.587720] Xenomai: real-time nucleus v2.4.8 (Lords Of Karma) loaded.
[ 5.587890] Xenomai: SMI-enabled chipset found
[ 5.587940] Xenomai: SMI workaround enabled
[ 5.588029] Xenomai: starting native API services.
[ 5.588072] Xenomai: starting POSIX services.
[ 5.588161] Xenomai: starting RTDM services.