コイデマサヒロ
前回は、Raspberry Pi 3(以下RPi3)にRT Preemptカーネルを導入しました。今回は Xenomai カーネルを導入してみます。Xenomaiもリアルタイムカーネルの一種ですが、よりリアルタイム性の高い性能が特徴です。通常はノーマルなカーネルと互換的に動作しますが、専用のライブラリ(API)類を利用すれば、よりリアルタイム性が高いアプリケーションを作ることもできます。
組み込み向けなCNC機器やロボットの制御では、Xenomaiを採用している場合が多いようです(LinuxCNCが有名)。音楽系ではあまり使われていませんが、Beaglebone Black用の音楽系の開発環境BelaはXenomaiを採用しています。
専用のライブラリを利用しないとXenomaiの良さを十分に引き出すことができないとも言えますが、Xenomai KernelをRPi3向けにビルドして、実際に試してみたいと思います。
Xenomaiについて
Xenomaiの現行のバージョンには、2系列と3系列があります。3系列が最新ではありますが、2系列とは異なる部分も多いようで、安定性を求める場合は2系列を利用することが多いようです。3系列は、ノーマルカーネル4 系列に対応しており、RPi3で利用するにはそのほうが問題が少ないと思われるため、今回は、Xenomai3を試します。(Xenomai2系列はノーマルカーネル3系列までの対応のようです)
また、Xenomai3は、2種類あります。
- Cobalt = Dual Kernel用のカーネル。ノーマルカーネル等と切り替えて利用できる。
- Mercury = 単一カーネル用のもの。ノーマルカーネル等を完全に置き換えて利用する場合。
という切り分けです。今回はCobaltを利用します。
Xenomaiはこの記事を書いている時点で最新安定版のバージョン3.0.2を利用します。ノーマルカーネルのバージョンは、4.1.21を利用します。
準備
Xenomaiもノーマルのカーネルにパッチをあてる形式ですので、RT Preemptの場合と同様の方法でビルドします。Xenomaiはフレームワークでもあるので、カーネルに加えてライブラリ類のビルドも行います。
カーネル本体のビルドは、Linuxを使いクロスコンパイルしますのでLinux環境が必要です。仮想環境で構いません。私はWindowsでは、VirtualBoxを、Mac上ではParallelsを利用し、Debian系のディストリビューションを使っています。
Xenomaiを導入するRPi3用に、新規にSDカードにRaspbianを書き込み、ネットワークの設定も行い、
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get dist-upgrade
を実行し最新状態にしておきます。
また、
$ sudo apt-get install raspberrypi-bootloader
も実行しておきましょう。Raspbianは通常版でもLITE版でもどちらでも構いません。
Linux上での作業
Linux上で作業を行います。
ユーザーフォームを基準の位置として作業を行います。
$ cd
ビルド用のツール類をダウンロードします。
$ git clone https://github.com/raspberrypi/tools.git -depth 1
Xenomaiのパッチ類をダウンロードし、展開します
$ wget http://xenomai.org/downloads/xenomai/stable/xenomai-3.0.2.tar.bz2 $ tar xjf xenomai-3.0.2.tar.bz2
ノーマルカーネルのソースをダウンロードします。ダウンロード時間の短縮のためターゲットバージョンのソースだけダウンロードします。
$ git clone https://github.com/raspberrypi/linux.git -b rpi-4.1.y
ダウンロードして、
$ cd linux $ head -3 Makefile
とすると
$ VERSION = 4 $ PATCHLEVEL = 1 $ SUBLEVEL = 21
と表示されるか確認しておきましょう。
以下のどちらかから、パッチをダウンロードします。内容は同じもののようです。
$ wget http://www.blaess.fr/christophe/files/article-2016-05-22/patch-xenomai-3-on-bcm-2709.patch $ wget http://wiki.csie.ncku.edu.tw/_showraw/patch-xenomai-3-on-bcm-2709.patch
どなたかが作ってくれたラズパイ向けの修正のようです。
パッチをあてる
ノーマルカーネルにXenomaiのパッチを当てます。
$ cd xenomai-3.0.2 $ scripts/prepare-kernel.sh --linux=../linux/ --ipipe=kernel/cobalt/arch/arm/patches/ipipe-core-4.1.18-arm-4.patch --arch=arm
別途ダウンロードしたラズパイ向けのパッチを当てます。
$ cd .. $ cd linux $ cat ../patch-xenomai-3-on-bcm-2709.patch | patch -p1
カーネル類のビルド
つぎにビルド用に環境変数をセットします。これらは、一時的な設定ですので再起動/再ログイン等で元に戻ります。作業中は再起動しないでください。
ユーザーホームに戻ります。
$cd ..
arm用バイナリの作成を指定します。
$ export ARCH=arm
<username>のところは各環境に合わせて変えてください。
Linuxが32bit版の場合;
$ export CROSS_COMPILE=/home/<username>/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
Linuxが64bit版場合;
$ export CROSS_COMPILE=/home/<username>/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
こちらも<username>のところは環境にあわせて変えてください。
ビルドしたものを入れる仮想のインストールフォルダの指定です。
$ export INSTALL_MOD_PATH=/home/<username>/xenkernel $ mkdir xenkernel
linuxフォルダに戻りビルド設定を行います。
$ cd linux
まずはRPi用の設定。
$ make bcm2709_defconfig
これで自動的に設定が書き込まれます。
これ以外の項目を設定するため設定ツールをビルド&起動します。
$ make menuconfig
ビルドが正常終了すれば、自動的にツールが起動します。ツール中で以下の項目を設定します。[ ]はチェック無し(チェックを外す)、[x]チェック有り(チェックを付ける)です。
CPU Power Management ---->
CPU Frequency scaling ---->
[ ] CPU Frequency scaling
CPU idle ---->
[ ] CPU idle PM support
Kernel Features ---->
[ ] Contiguous Memory Allocator
[ ] Allow for memory compaction
Kernel Hacking ---->
[ ] KGDB: kernel debugger
Boot options ---->
Kernel command line type ---->
[x] Extend bootloader kernel arguments
設定を変更したら[Save]を選択して保存します。各項目ごとに[Save]しておいたほうが安全です。[Save]画面では、ファイル名を変更せず、そのままOKを押します。
設定が完了したら、いよいよカーネル類をビルドしましょう。
$ make zImage modules dtbs
マルチコアCPUの場合は、-j2 などのオプションを付けるとビルドが早くなります。数字はコア数です。
作成したモジュール類を仮想のインストールフォルダに移動させます。
$ make modules_install
ビルドしたカーネル類をまとめます。
$ mkdir $INSTALL_MOD_PATH/boot $ ./scripts/mkknlimg ./arch/arm/boot/zImage $INSTALL_MOD_PATH/boot/zIimage $ cp ./arch/arm/boot/dts/*.dtb $INSTALL_MOD_PATH/boot/ $ cp ./arch/arm/boot/dts/overlays/*.dtb* $INSTALL_MOD_PATH/bootoverlays/
$ cd $INSTALL_MOD_PATH $ tar czf /tmp/kernel-4.1.21-xenomai3.tgz *
これでビルドしたファイルは一つのファイルになりました。
ファイルをRPi3に転送します。
$ scp /tmp/kernel-4.1.21-xenomai3.tgz pi@raspberrypi.local:/tmp
raspberrypi.localは、RPi3のIPアドレスでも良いです。パスワードを聞かれるので、変えていなければraspberryと入力します。
カーネル類のインストール
ここからは、RPi側の作業です。RT Preemptと同じです。
$ cd /tmp $ tar xzf kernel-4.1.21-v7-xenomai3.tgz $ sudo rm -r /lib/firmware/ $ sudo rm -r /boot/overlays/ $ cd boot $ sudo cp -rd * /boot/ $ cd ../lib $ sudo cp -dr * /lib/
設定ファイルを編集します。
$ sudo nano /boot/config.txt
最後に以下の2行を追加します。利用するカーネルとデバイスツリーの指定です。
kernel=zImage device_tree=bcm2710-rpi-3-b.dtb
ここで再起動すれば、Xenomaiカーネルで起動しますが、ユーザーホームに戻りライブラリ類を作成しますので、そのまま続行します。
ライブラリ類のビルドとインストール
必要なライブラリやツール、デモツール等を作成します。参考にしたサイトではクロスコンパイル環境でLinuxでビルドしていましたが、RPi3上でビルドしたほうが簡単だと思います。
ユーザーホームに戻ります。
$ cd
こちらでもXenomaiのパッチ類をダウンロードします。この中にライブラリ郡のソースも入っています。ダウンロードしたら展開します。
$ wget http://xenomai.org/downloads/xenomai/stable/xenomai-3.0.2.tar.bz2 $ tar xjf xenomai-3.0.2.tar.bz2
展開したフォルダに移動します。
$ cd xenomai-3.0.3
ビルドの設定を行います。
$ ./scripts/bootstrap $ ./configure CFLAGS="-march=armv7-a -mtune=cortex-a8 -mfloat-abi=hard -mfpu=neon -ffast-math" --enable-smp --with-core=cobalt
ビルドします。
$ make -j2
完了したらインストールします。
$ sudo make install
これで必要なファイル類のインストールは完了です。
補足設定とインストールの確認
作成したモジュール類のインストール時に、Wifiのモジュールが削除されています。システム的にはインストールされていることになっているので、一旦削除し再度インストールします。
$ sudo apt-get autoremove firmware-brcm80211 $ sudo apt-get install firmware-brcm80211
rootアカウントのパスワードを設定します。
$ sudo passwd root
で適当なパスワードを決めてください。
Xenomaiは基本的にRootアカウントで動作する前提になっていますので、利用する場合はRootでログインしてしまったほうが簡単です。スタンドアロンで利用するのであれば大きな問題ないと思いますが、セキュリティ的な懸念がありますので、理解の上ご利用ください。
$ sudo raspi-config
boot optionで自動ログインをオフにします。
これで全て作業完了しましたので、再起動します。
$ sudo reboot
起動時にユーザー名が聞かれるようになりますので、rootアカウトでログインします。
$ cat /proc/xenomai/version 3.0.2 $ cat /proc/ipipe/version 4
と表示されば、おそらくインストールはOKです。
さらに、
$ /usr/xenomai/bin/latency
でテストが走れば、ライブラリ類の動作やインストール問題無いでしょう。 このツールはCtl+Cで停止します。
最後に
これでXenomai3のビルド&導入が完了しました。
いくつか注意点があります。ノーマルのRaspbianは、CPU Governor の変更ができるようになっています(CPUのクロック数が可変ということ)が、Xenomaiではリアルタイム性に影響がでるため使えないようになっています。オーバークロックは試していませんが、おそらくはできると思います。
コイデマサヒロ
ディレクター、プロデューサー、ギタリスト。mimiCopyをはじめ弊社リリースの全てソフトウェア製品の企画を担当。ネイティブアプリ開発がメインでOS問わず対応可。dubバンドのギタリストとしても活動中。