安曇野の森から > ロボットを作る > Linexリアルタイムカーネル

Linuxリアルタイムカーネル

リアルタイムカーネルのインストール

以下はRaspberry PiへのLinuxリアルタイムカーネルのインストール手順です。

カーネルのソースコードをOSADL(Open Source Automation Development Lab)から入手し、それにリアルタイムパッチをあっててビルドするという手順になります。


Realtime Linuxのビルド

OSADLの以下リンクWebページからRaspberry Piで動作可能なRealtime Linuxのソースとパッチを入手し、Raspberry Pi上でビルドします。

https://www.osadl.org

  1. 上記Webページの左ペインにあるメニューから「QA Farm Realtime」を選択します。

  2. 「Project」→「QA Farm Realtime」

  3. 表示されたページ上部の以下のように表示されている部分の「Boards/Distros」をクリックします。

  4. OSADL Realtime QA Farm
    About - Hardware - CPUs - Benchmarks - Graphics - Benchmarks - Kernels - Boards/Distros - Latency monitoring - Latency plots - System data - Manufacturers - Profiles - Compare - Awards

  5. 表示されたページの一覧表「CPU board type and vendor and Linux distribution」のBoard欄から「Raspberry Pi」を見つけSystem欄のリンク(「rack7slot3」)をクリックします。

  6. 表示されたページ「Profile of system in rack #7, slot #3 (last updated on Tue Mar 25, 2014 at 01:43:12)」の一番下にある「Generate download and patch script」ボタンを押すとソースコードとパッチのダウンロード、及びパッチ修正用のスクリプトが表示されますので、これをコピーしてスクリプトファイル(例えばdl.sh等の名称をつけて)として保存します。

  7. 以下のコマンドでPCのhomeディレクトリに作業用ディレクトリ(~/robot/RPi_RT)を作成しておきます。"/robot/RPi_RT"の部分は好みで変えても問題ありません。


  8. 以下のコマンドでカーネルソースとパッチをダウンロードし、ソースコードにパッチをあてます。


  9. 以下のようなカーネルをビルドするスクリプトbuild.shを作成します。makeオプション-jの後ろの表示は並列作業するプロセスの数です。ビルドに使うPCのCPUコア数 x 2くらいの数に設定すると最大の効果がでます。


  10. 上記スクリプトbuild.shでカーネルをビルドします。以下のようにスクリプトを実行した場合、build.logファイルにビルドログが残ります。


  11. 正常にビルド出来れば以下のディレクトリにビルド結果が入ります。

  12. カーネル: ~/robot/RPi_RT/linux-3.12.13-rt21/arch/arm/boot/zImage
    モジュール:~/robot/RPi_RT/raspi-modules/lib/modules/3.12.13-rt21


Linux起動用SDカードの作成

以下の手順でブートローダーとユーザーランドにはRaspberry Piのものを使い、カーネルとモジュールのみを上記でビルドしたもので上書きしたSDカードを作成します。

  1. RASPBIANを書き込んだSDカードを用意します。

  2. 以下のコマンドで上記でビルドしたカーネルとモジュールをSDカードへ上書きします。



テストプログラム

以下はリアルタイムカーネルでレイテンシーの確認が出来るcyclictestのビルドと実行方法の 説明です。


ビルド

無線LANでインターネットに接続しているRaspberry Pi上で以下のコマンドを実行しテストツールをダウンロード・ビルドします。



実行方法

Raspberry Pi上で以下のコマンドでcyclictestを実行します。


rootで実行しない場合は99までの優先度は設定出来ないので注意が必要です。
ノンリアルタイムカーネルでは以下のような結果になります。


リアルタイムカーネルでは以下のような結果になりレイテンシーのMax値が半分以下になることがわかります。




周期起動サンプルプログラム

Realtimeパッチを適用したLinuxリアルタイムカーネルでは既存のPOSIX APIを使ってリアルタイム動作するプログラムを作成することが出来ます。
以下のサンプルコードはは以下リンクのOSDALホームページから引用したものです。

https://www.osadl.org/Cyclic-execution-of-a-user-program-funct.user-cyclic.0.html


サンプルコード

このサンプルコードでは2秒間、2ms毎に1文字出力します。(オリジナルのソフトは200us毎の出力ですが、Raspberry Piでは200usでは負荷が大き過ぎるため以下では周期を2msとしています。)
これををRaspberry Pi上にuser-cyclic.cとして保存します。V



コンパイル

Raspberry Pi上で以下コマンドでサンプルコードをコンパイルします。



テストプログラムの実行

作成したプログラムをリアルタイムカーネルで実行すると1000文字出力されたことが分かります。



hackbenchを使ってCPU負荷を上げ、通常のプライオリティで実行すると出力される文字数が少なくなります。


プライオリティを最高にしてプログラムを実行すると1000文字出力されることが分かります。

上記で使っているchrtプログラムはutil-linuxパッケージに入っています。


ノンリアルタイムカーネルとリアルタイムカーネルの性能比較

ノンリアルタイムカーネルで実験した結果と上記でリアルタイムカーネルを使って実験した結果をまとめると以下のようになります。

◆ノンリアルタイムカーネル実験結果

負荷がない状態では1000回実行可能ですが、負荷を大きくすると384回まで実行回数が落ちます。
負荷を大きい場合でもプロセスプライオリティを最大にすると1000回実行出来るようになります。

負荷 プロセスプライオリティ 実行回数
なし 通常 1000回
通常 384回
最大 1000回

◆リアルタイムカーネル実験結果

負荷を大きくすると633回まで実行回数が落ちますが、ノンリアルタイムカーネルよりは実行回数が増えます。
当然のことながら負荷を大きい場合でもプロセスプライオリティを最大にすると1000回実行出来ます。

負荷 プロセスプライオリティ 実行回数
通常 633回
最大 1000回

以上の結果から完璧ではないにせよリアルカーネルの方がリアルタイム性能は若干良くなっていると考えられます。




inserted by FC2 system