ともに夢の実現を目指して

本家サイトです。最新版ダウンロードがあります。
Xenomaiを利用する色々なサンプルがあります。
リアルタイム・ネットワークプロトコル・スタック
リアルタイム・イーサネットプロトコル
ロボット制御ライブラリ、フレームワーク
Xenomai » インストール
※「説明」ではなく「メモ」ですのでご了承を。
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カーネルを起動する。
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シンボリックリンクを作成しておく。
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になる。
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
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秒程度かかる。
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に設定データを保存させる。
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のサイズ!
mkdir /usr/src/xenomai-build
cd /usr/src/xenomai-build
../xenomai-2.4.8/configure --enable-x86-sep
make install
...1分30秒待つ
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に追加する。
[ 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.