ロボットを作る
安曇野の森から > ロボットを作る > Linexリアルタイムカーネル
以下はRaspberry PiへのLinuxリアルタイムカーネルのインストール手順です。
カーネルのソースコードをOSADL(Open Source Automation Development Lab)から入手し、それにリアルタイムパッチをあっててビルドするという手順になります。
OSADLの以下リンクWebページからRaspberry Piで動作可能なRealtime Linuxのソースとパッチを入手し、Raspberry Pi上でビルドします。
https://www.osadl.org
「Project」→「QA Farm Realtime」
OSADL Realtime QA Farm
About - Hardware - CPUs - Benchmarks - Graphics - Benchmarks - Kernels - Boards/Distros - Latency monitoring - Latency plots - System data - Manufacturers - Profiles - Compare - Awards
カーネル: ~/robot/RPi_RT/linux-3.12.13-rt21/arch/arm/boot/zImage
モジュール:~/robot/RPi_RT/raspi-modules/lib/modules/3.12.13-rt21
以下の手順でブートローダーとユーザーランドにはRaspberry Piのものを使い、カーネルとモジュールのみを上記でビルドしたもので上書きした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回 |
以上の結果から完璧ではないにせよリアルカーネルの方がリアルタイム性能は若干良くなっていると考えられます。