たけおか ぼちぼち日記

思いついたらメモ


テーマ:
Xenomaiは、Linuxの実時間拡張。
http://www.xenomai.org/

Xenomai を、Raspberry Pi に入れた。

Xenomaiは、Linux kernel(と、Makefile)に若干のパッチを当てる。
よって、Xenomaiが対応しているバージョンの kernel しか使えないのが、
やや残念。

現在の Raspbian は、kernel 3.6.11。
Xenomai 対応の最新は、kernel 3.5.7。
やや古いが、ま、ええやろ。

少し前、kernel 3.5.7 用のパッチは、3.5.7 kernelに当てると、少し失敗した。
しかし、今は、そのパッチに fix 版がでて、極めて簡単に動かせるようになった。
(私は、少し前に、色んなバージョンのxenomai+LinuxKernelでトライして、苦労した)


Linux+xenomai のソースツリーは、raspi と x86機の両方にあると、便利。
そして、それらのパスは、両マシンで、完全に一致させるべき。
(パスが、完全に一致していないと、数々の、非常に面倒くさいことが発生する)



以下は、kernel 3.5.7 を Xenomai 付きにして、raspberry Piで動かす方法



まず、普通に 通常kernelをmakeしてみる
kernel のコンパイルは、x86 マシンで、クロス・コンパイルする。



開発ツールをゲットする。

x86% git clone https://github.com/raspberrypi/tools

tools-master.zipというファイルが得られる。

それを、x86マシンの /opt/arm-tools/ に展開。

x86% sudo tcsh
x86# mkdir -p /opt/arm-tools/
x86# cd /opt/arm-tools/
x86# unzip /tmp/tools-master.zip

ツールの準備は以上




Linux kernelの取得

x86% mkdir -p raspi/src/linux-xenomai/
x86% cd raspi/src/linux-xenomai/
x86% wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.7.tar.bz2
x86% tar xvjf linux-3.5.7.tar.bz2



kernelを make するには、参考になる config ファイルがあった方が良い。
以下の、方法で、動作中のraspiから、configを得てみる。
ただし、kernelのバージョンが異なっているので、まったく適切なものが得られるとは限らない。

raspi% zcat /proc/config.gz > /tmp/raspi-kern-config
raspi% scp /tmp/raspi-kern-config x86:raspi/src/linux-xenomai/linux-3.5.7

x86% cd raspi/src/linux-xenomai/linux-3.5.7
x86% mv raspi-kern-config .config



次の様な shell script を、用意する。

-- raspi/src/linux-xenomai/make-menuconfig.sh

#! /bin/bash
# setup kernel-config

CCPREFIX=/opt/arm-tools/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-

ARCH=arm CROSS_COMPILE=${CCPREFIX} make menuconfig

--


-- raspi/src/linux-xenomai/make-do.sh

# make
date

CCPREFIX=/opt/arm-tools/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-
ARCH=arm CROSS_COMPILE=${CCPREFIX} make -j 4

date

--
上記の make -j 4 の数値は、並列に make を実行する指定である。
使用する x86機のコア数に応じて、適切に設定すると、make を早く終えることができる。


kernelのコンパイルの準備

x86% cd raspi/src/linux-xenomai/linux-3.5.7
x86% make mrproper

x86% sh ../make-menuconfig.sh
コンフィギュレーションをいじり、exit

x86% sh ../make-do.sh |& tee make-log


x86機の速さによるが、10分~30分程度で、make が終了するであろう。

makeが終了すると、
arch/arm/boot/ に
zImage
ができる




Raspberry Piに、新kernel, moduleなどを持っていく。

1)moduleを集める
shell変数 MODULES_TEMP に固めるディレクトリ(../newlinux/)を指定


x86% bash
x86$ mkdir -p ../newlinux
x86$ MODULES_TEMP= ../newlinux/modules
x86$ ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=${MODULES_TEMP} make modules_install


2)kernelもコピー

x86$ cp arch/arm/boot/zImage ../newlinux/

x86$ cd ..
x86$ tar cvJf newlinux.tar.xz newlinux
x86$ scp newlinux.tar.xz raspi:~/tmp/




Raspberry Piで kernel, module など配置


1) 新kernelを、/bootにコピー

raspi% cd ~/tmp
raspi% tar xvJf newlinux.tar.xz
raspi% cd newlinux
raspi% sudo bash
raspi# cp zImage /boot/kernel_new.img


raspiの /boot/config.txt を編集し、
kernel=kernel_new.img

を追加。
(kernel= 指定がすでに存在していたら、そのエントリは、コメントにする)


2) moduleの配置

raspi# cd modules/lib/modules
raspi# mv 3.5.7 /lib/modules/


以上で、準備完了


新 kernel で再起動

raspi# sync;sync;sync
raspi# reboot

起動が終わったら、ログインして、uname を実行し、kernelを確かめる

raspi% uname -a
Linux raspi 3.5.7 #5 PREEMPT Fri Jul 26 11:45:30 JST 2013 armv6l GNU/Linux






Xenomai を入れる。

kernel 3.5.7 に対応するのは、 xenomai 2.6.2.1 である。
xenomai 2.6.2.1 と、Raspi用パッチを入手する。

x86% cd raspi/src/linux-xenomai/
x86% wget http://download.gna.org/xenomai/stable/xenomai-2.6.2.1.tar.bz2
x86% wget https://raw.github.com/TinHead/raspberry-xenomai-stuff/master/ipipe-core-3.5.7-raspberry-post-fixed.patch


x86% bash
x86$ tar xvjf xenomai-2.6.2.1.tar.bz2
x86$ xenomai-2.6.2.1/scripts/prepare-kernel.sh --verbose --arch=arm --adeos=xenomai-2.6.2.1/ksrc/arch/arm/patches/ipipe-core-3.5.7-arm-3.patch --linux=linux-3.5.7

x86$ cd linux-3.5.7
x86$ patch -p1 < ../ipipe-core-3.5.7-raspberry-post-fixed.patch



kernel のコンフィギュレーションをする。


x86$ sh ../make-menuconfig.sh


menuconfig で、
a)
"Kernel Features"で
"Interrupt pipeline" を生かす。
b)
"Kernel Features" -> "Preemption Model" で
"Preemptible Kernel (Low-Latency Desktop)" を選択
c)
"Real-time sub-system" で
"Xenomai" を生かす。
"Nucleus" を生かす。
d)
"Real-time sub-system" -> "Interfaces"で
"Native API"などを生かす。


menuconfig を終了する。
.config の内容を確認。

--

# CONFIG_NO_HZ
# CONFIG_CC_STACKPROTECTOR
# XENO_OPT_STATS
# CONFIG_CC_STACKPROTECTOR

--
上記 4つが、生かされていないことを確認する。


kernel をmake


x86$ sh ../make-do.sh |& tee make-xeno-log



kernelができたら、通常kernelの時と同様の手順で、実機に送り、
新kernel, moduleを配置する。

raspi の /boot/config.txt の kernel= に新kernelを設定する。
raspi を reboot する。



raspi が新kernelで起動したら、uname -a で、kernelのバージョンを確認する。

raspi% uname -a
Linux nana 3.5.7-xenomai-take #4 PREEMPT Thu Jul 25 04:19:28 JST 2013 armv6l GNU/Linux

(上記は、menuconfigで、"local version"の文字列に "-xenomai-take" を入れたもの)

そして、dmesgを確認する。

raspe% dmesg|less

下記のようなメッセージで、I-pipe が起動していることを確認する。

[ 0.000000] I-pipe, 250.000 MHz clocksource
[ 0.000000] Interrupt pipeline (release #3)


下記のようなメッセージで、Xenomai と Nucleus が起動していることを確認する。

[ 1.142057] I-pipe: head domain Xenomai registered.
[ 1.147008] Xenomai: hal/arm started.
[ 1.150845] Xenomai: scheduling class idle registered.
[ 1.156009] Xenomai: scheduling class rt registered.
[ 1.166183] Xenomai: real-time nucleus v2.6.2.1 (Day At The Beach) loaded.

上記が確認できれば、Xenomai は動作開始している。





Xenomaiのユーザランド・コマンドは Raspiで、セルフ・コンパイルする。

raspi上のソースツリーは、x86 のソースツリーとまったく同じパスに置くべし。

ソースツリーのコピー方法は色々あるが、
例えば、

x86$ cd raspi/src/
x86$ tar cjf - linux-xenomai | ssh raspi 'cd raspi/src/; tar xvjf -'


とやると、メディアが不要で、体も動かさなくてよい。

以下、Raspberry Piでの作業。

Xenomaiのユーザランド・コマンドを make & install

raspi$ cd raspi/src/linux-xenomai/xenomai-2.6.2.1/
raspi$ ./configure CFLAGS="-march=armv6" LDFLAGS="-march=armv6" --prefix=/opt/xenomai
raspi$ make
raspi$ sudo bash
raspi# make install


一般に、xenomai の管理は、root 権限で行う。
とりあえずのテストを行う。
ローダブル・モジュールを、読み込んでおく。
(当然ながら、menuconfigで選択したskin(API)のみしか、存在しない)

raspi# modprobe xeno_switchtest
raspi# modprobe xeno_posix
raspi# modprobe xeno_rtdm
raspi# modprobe xeno_native


テスト開始


raspi# /opt/xenomai/bin/latency -p 100 -T 60
== Sampling period: 100 us
== Test mode: periodic user-mode task
== All results in microseconds
warming up...
RTT| 00:00:01 (periodic user-mode task, 100 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD| -5.444| -4.004| 12.728| 0| 0| -5.444| 12.728
RTD| -5.480| -3.852| 13.728| 0| 0| -5.480| 13.728
RTD| -5.476| -3.936| 13.280| 0| 0| -5.480| 13.728
RTD| -5.440| -3.936| 13.960| 0| 0| -5.480| 13.960
RTD| -5.592| -3.956| 11.608| 0| 0| -5.592| 13.960
:

と動き出せば、大丈夫である。


raspi# /opt/xenomai/bin/xeno-test

xeno-test を実行するには、login shellが bsh系(/bin/sh, bash)であった方が楽。
csh系を login shell にしている人は、

raspi% bash
raspi$ SEHLL=/bin/bash
raspi$ sh /opt/xenomai/bin/xeno-test

という風にしなければならない。
(xenomaiの shell script は、面白すぎて、ちょっと腹が立つ)

xenomai-2.6.2.1/examples/
の中に、テストに使用できる、例がある。
それらも、実行してみると良いだろう。

examplesのmakeは…
raspi$ XENO=/opt/xenomai ARCH=arm make
などとしなければならない。


AD
いいね!した人  |  コメント(3)  |  リブログ(0)

たけおかさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

最近の画像つき記事  もっと見る >>

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。