秋の夜長は Raspberry Pi 3 で RT-Linux ビルドに挑戦
先日は、RaspberryPi 3でKernel のセルフビルドする方法を紹介いたしました。
その続きで、本日は同様にセルフビルドで「 RT-Linux 」、 つまり、Real-Time Kernelを作る方法をご紹介いたします。
追記 => 2018年2月版はこちらです。
本格的に開発するならクロスコンパイルの方が時間的な効率もよいです。 しかし、セルフビルドだとLinuxマシンを別途用意しなくても済むというメリットがあります。 お遊び程度ならセルフもありではないでしょうか。
<<図-1 RT patch をあてたときのconfig画面>>
※) ここではリアルタイム性の評価は一切行なっていません。
機械制御など、本当にリアルタイム性が欲しいときは、ちゃんと評価してからご使用ください。 リアルタイム性を保証する記事でもございません。
下の画面は、RT patchをあてる前のconfig画面です。
Kernel Features --->
Preemption Model (Voluntary Kernel Preemption (Desktop)) --->
で該当する項目が表示できます。
<<図-2 通常のconfig画面>>
RT patchがあたると、2項目ほど増えているのが分かると思います。(図-1)
Kernelソース一式の取得方法などは、先日の記事をご覧下さい。 ここでは、既にビルドできる環境とソース一式がある状態から始めます。
ベースは、Moode Audio R2.7 です。
RT patch をあてる
Kernelソースと同じバージョンのRT patchを探して持ってきます。
最新版はこちら
https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/
少し古いものはolderから探します。
https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/older/
以下は、4.4.19で進めます。 違うバージョンのときは適時読み替えてください。
持ってくるのは patch-4.4.19-rt27.patch.gz というものです。
patches-4.4.19-rt27.tar.gzではありません。 同じサイトにあるので間違えないようにします。
スーパーユーザになってから作業します。
sudo su
cd linux
wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/older/patch-4.4.19-rt27.patch.gz
gunzip patch-4.4.19-rt27.patch.gz
cat patch-4.4.19-rt27.patch | patch -p1
沢山の文字がでますが、これで、リアルタイムパッチがあたりました。
Kernelの設定
現在のconfig設定を元に、RT patch版のKernel config設定を行ないます。
modprobe configs
zcat /proc/config.gz > .config
make oldconfig
沢山の文字がでます。。。。
Preemption Model
1. No Forced Preemption (Server) (PREEMPT_NONE)
> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT__LL)
4. Preemptible Kernel (Basic RT) (PREEMPT_RTB) (NEW)
5. Fully Preemptible Kernel (RT) (PREEMPT_RT_FULL) (NEW)
choice[1-5]:
とでるので、今回は 「5」のFully Preemtible Kernel を選択しました。
その他の問い合わせにはデフォルトで答えます(エンターだけを押す)
以上でoldconfigは完了です。
No Force Preemption (Server)
CPUの横取りをしない。
Voluntary Kernel Preemption (Desktop)
特定ポイントだけCPUの横取りを可能にする。
Preemptible Kernel (Low-Latency Desktop)
すべての処理でCPUの横取りを可能にする。
Preemptible Kernel (Basic RT)
RTカーネル(基本)
Fully Preemptible Kernel (RT)
RTカーネル(完全)
私もあまり詳しくはないのですが、Low-LatencyとBasic RTは似ているようにみえても、RTpatch版はタスク切換えが速くなっているらしいです。 Fully Preemtible Kernel で問題が起こる場合は Basic RT を使ってみるというくらいに考えてます。
次に、プリエンプションの周波数を指定します。 この設定は実動作に関わるので重要です。
make menuconfig
とコマンドを打って開いたメニューから
Kernel Features --->
Timer frequency (100 Hz) --->
プリエンプションの周波数は、高ければそれだけタスク切換え(Task dispatch)が頻繁に行なわれるようになります。 その分、オーバーヘッドがかさんできますので無駄にCPU負荷が増えますし、各タスク(プログラム)の実行速度が落ちます。 タスク・ディスパッチ時間がゼロではないことを考えると当たり前ですね。
なので、1000Hz設定は特殊な事情がなければやり過ぎです。
必要な応答速度と実用性を考慮して、100(10ms)~500(2ms)くらいがよい選択肢だと思います。
ここでは、実験的な意味もあるので、とりあえず 500Hzを選択してみます。
ここから先は、先日のビルドと同じ方法です。
カーネルビルド
====== zImge =======
time make -j6 zImage 2>&1 | tee make1.log
====== modules =======
time make -j6 modules 2>&1 | tee make2.log
====== dtbs =======
time make dtbs 2>&1 | tee make3.log
全部で2時間程度かかります。 高速なSDカードなら90分くらいで完了するらしいです。
終わるまで待てない場合は
nohup make -j6 zImage modules dtbs 2>&1 | tee make.log &
として、sshを切ってもビルドを継続させると良いです。
インストールと起動
ビルドしたカーネルをインストールして起動してみます。
モジュールのインストール
make modules_install
デバイスツリーオーバーレイのインストール
cp arch/arm/boot/dts/overlays/*.dtbo /boot/overlays/
cp arch/arm/boot/dts/overlays/README /boot/overlays/
カーネルのインストール(念のため現在のカーネルをバックアップ)
mv /boot/kernel7.img /boot/kernel7-bakup.img
cp arch/arm/boot/zImage /boot/kernel7.img
再起動します
reboot
再起動後、カーネルを確かめてみましょう。
pi@moode:~ $ uname -a
Linux moode 4.4.19-rt27-v7+ #1 SMP PREEMPT RT Sat Sep 24 08:50:48 EDT 2016 armv7l GNU/Linux
pi@moode:~ $ cat /proc/version
Linux version 4.4.19-rt27-v7+ (root@moode) (gcc version 4.9.2 (Raspbian 4.9.2-10) ) #1 SMP PREEMPT RT Sat Sep 24 08:50:48 EDT 2016
rt27と出ていますね。 無事にRT-Linuxが起動しているようです。
SabreBerry32用のドライバを入れて音楽を聴いてみる
とりあえず、Moode R2.7用でRT-Linux版のドライバを用意いたしました。
wget https://nw-electric.way-nifty.com/blog/files/moode27_RT-linux.zip
unzip -d sabreberry32 moode27_RT-linux.zip
ドライバのインストール
cd sabreberry32
sudo chmod +x sabre32_install.sh
sudo ./sabre32_install.sh
sudo cp sabre9018q2c.ko /lib/modules/4.4.19-rt27-v7+/kernel/sound/soc/codecs/sabre9018q2c.ko
sudo cp sabreberry32.ko /lib/modules/4.4.19-rt27-v7+/kernel/sound/soc/bcm/sabreberry32.ko
depmod -a
sudo cp sabreberry32.dtbo /boot/overlays/
とコマンドを打って組み込みます。 再起動したあと有効になります。
まだ長い時間検証していないですが、ちゃんと音は出ているようです。
音質的にも少し変化があるように感じますが、リアルタイムカーネルがよいのかどうかは、ご自身の耳で確認されるのがよいと思います。 マスターモードI2SがないDACの場合の方が効果が大きくでるかもしれません。
にほんブログ村
ブログランキングに参加中です。 めざせ1位!
もしよろしければ「ぽちっと」お願いします。
« 秋の夜長の Raspberry Pi 3 カーネル・セルフ・ビルド | トップページ | 一番やってはいけない? スピーカー工作で安易な方法をとってしまいました »
「Raspberry Pi」カテゴリの記事
- MotionEyeと余っているラズパイで監視カメラ(2024.11.21)
- 秋の夜長にはRaspberryPi5 RT-linux セルフビルド(2024.10.13)
- 秋の夜長にはRaspberryPi5 64bit版 Sabreberry32 ドライバコンパイル(2024.10.10)
- RaspberryPi 5 の公式OSは32bit版でも64bit?(2024.10.09)
- 秋の夜長にはRaspberry Pi5 64bit カーネル・セフル・ビルド (2024.10.07)
« 秋の夜長の Raspberry Pi 3 カーネル・セルフ・ビルド | トップページ | 一番やってはいけない? スピーカー工作で安易な方法をとってしまいました »
コメント