RasPiでRT-Linux


Raspberry PiでRT-Linux
       @azarashi55
0. 今日の内容
 自己紹介
 Raspberry Pi(RasPi)について

 RTLinuxに挑戦したきっかけ

 RasPiでRTLinuxカーネル動作

 まとめ
1. 自己紹介
 GVC開発(現在三名体制)の一人
 本業はとある中小企業のシステム

  管理者(と言う名の何でも屋)
 GVC開発は趣味(キリッ
2.Raspberry Pi
   名刺サイズのシングルボードコンピュータ
    ($35)
2-1. 別角度から見てみる
   気になる端子群がありますね~
3. Raspberry Piについて
   コンピュータ科学教育を促進するため
    に開発された
   CPUプロセッサコアとして
    BCM2835(ARM1176JZF-S 700 MHz
    +GPU)
   メインメモリーは256MB
   OSはLinux(Raspbian,Fedoraなど)
   入出力端子が豊富(GPIOポートなど)
4. 入出力端子について
 電源端子はmicroUSB
 →電源スイッチはありません
 HDMI端子がありフルHDでの出力が可能

  →と言いつつCUI環境でしか使っていなかっ
  たり・・・
 GPIO(General Purpose Input/Output)

 →CPU直結、3.3Vでの入力(Arduinoと一部
  異なるので注意)
5. RasPiでRTLinuxのきっかけ
 Arduinoの赤外線リモコン受信スケッチ
  をRas Piに移植しようと思った
 すでにwiringPiというライブラリーがリ

  リースされていた
→これを使えば簡単に移植できる!
 で、移植してみました(いろいろ込み

  で実質数時間)
5-1-1. RasPiでRTLinuxのきっかけ
   移植方法を簡単に大雑把に説明します
Arduinoでのスケッチはこんな感じ
void setup(){
// セットアップ処理(ピンのアサインなどいろいろ)
}


void loop(){
// 実際の処理
}
5-1-2. RasPiでRTLinuxのきっかけ
    wiringPiを使ったC,C++でのコーディング
#include <wiringPi.h> ←wiringPiを使う
#include <stdio.h>
#include <stdlib.h>

/* プロトタイプ宣言 */

void loop(void);


int main()
{
int wiringPiSetup();
loop();
exit(0);
}
void loop(){


}
5-2. Ras PiでRTLinuxのきっか
け
 移植自体は問題なし、コンパイルもOK
→やっほーい!ということで実行
 撃沈

→うまくデコードできない
 原因

→100μs単位でのデータ取得部分に問題
  があり、赤外線受信データを取りこぼ
  していた
5-3. RasPiでRTLinuxのきっかけ
 wiringPiのソースを見てみると
→delayMicroseconds()関数を
  nanosleep()で実装していた
→nanosleep()は名前に偽りありで、実
  際にタイマー割り込みは10ms単位でし
  かこない
 つまり

→100μs単位でのデータ取得は到底無理
6. RasPiでRTLinuxに挑戦

RTLinuxの実装にはいくつか種類があ
 る
→Xenomai,RTAI,Real-Time Linuxパッ
 チなど
一番無難そうなReal-Time Linuxパッチ
 で挑戦
 
7. RasPiでRTLinux

   Linux kernel ソース(rpi-3.2.27)の
    取得
    https://github.com/raspberrypi/linux
   Real Time Linuxパッチの取得
http://www.kernel.org/pub/linux/kernel/pr
  ojects/rt/3.2/older/patch-3.2.27-
  rt40.patch.bz2
7-1. RasPiでRTLinux

 Real Time Linuxパッチを当てる
 母艦のクロスコンパイル環境でコンパ

  イル
→RasPi上でコンパイルすると5,6時間
  かかる
 RasPiに転送、カーネル入れ替え、カー

  ネルモジュールインストール
8. RasPiでRTLinux
   できあがったカーネルはこんな感じ
$ uname -a
Linux raspberrypi 3.2.27-rt40 #1 PREEMPT RT Thu
   Aug 23 23:55:37 JST 2012 armv6l GNU/Linux 
   早速テスト(裏でstressというソフトで負荷をかけてま
    す)
$ sudo ./cyclictest -t1 -p 80 -n -i 10000 -l 10000
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.83 0.89 0.59 1/132 1746


T: 0 ( 1746) P:80 I:10000 C: 10000 Min:       27 Act:
  40 Avg: 42 Max:       66
8-1. Ras PiでRTLinux
   テスト結果を見て・・・
policy: fifo: loadavg: 0.83 0.89 0.59 1/132 1746
T: 0 ( 1746) P:80 I:10000 C: 10000 Min:      27 Act:   40
    Avg:   42 Max:   66    
→おおっ66ns!と思ったら勘違いで66μsでした
   ちなみに、標準のカーネルだと2桁ぐ
    らい違う
policy: fifo: loadavg: 0.21 0.30 0.14 2/122 1566
T: 0 ( 1566) P:80 I:10000 C: 10000 Min:      28 Act:   46
   Avg: 49 Max: 4143
9. まとめ
 wiringPi+RT-Linuxである程度ま
  ではArduinoのソフトウェア資産を
  流用できる目処が付いた
→例えば、Arduinoと異なりアナロ
  グ入力ができないので、この部分
  は別回路でA/D変換が必要
 きっかけであった赤外線受信につ

  いても目処が立った
RasPiでRT-Linux
     終わり

ありがとうございました
     @azarashi55

Ras piでrt linux

  • 1.
  • 2.
    0. 今日の内容  自己紹介 Raspberry Pi(RasPi)について  RTLinuxに挑戦したきっかけ  RasPiでRTLinuxカーネル動作  まとめ
  • 3.
    1. 自己紹介  GVC開発(現在三名体制)の一人 本業はとある中小企業のシステム 管理者(と言う名の何でも屋)  GVC開発は趣味(キリッ
  • 4.
    2.Raspberry Pi  名刺サイズのシングルボードコンピュータ ($35)
  • 5.
    2-1. 別角度から見てみる  気になる端子群がありますね~
  • 6.
    3. Raspberry Piについて  コンピュータ科学教育を促進するため に開発された  CPUプロセッサコアとして BCM2835(ARM1176JZF-S 700 MHz +GPU)  メインメモリーは256MB  OSはLinux(Raspbian,Fedoraなど)  入出力端子が豊富(GPIOポートなど)
  • 7.
    4. 入出力端子について  電源端子はmicroUSB  →電源スイッチはありません HDMI端子がありフルHDでの出力が可能 →と言いつつCUI環境でしか使っていなかっ たり・・・  GPIO(General Purpose Input/Output)  →CPU直結、3.3Vでの入力(Arduinoと一部 異なるので注意)
  • 8.
    5. RasPiでRTLinuxのきっかけ  Arduinoの赤外線リモコン受信スケッチ をRas Piに移植しようと思った  すでにwiringPiというライブラリーがリ リースされていた →これを使えば簡単に移植できる!  で、移植してみました(いろいろ込み で実質数時間)
  • 9.
    5-1-1. RasPiでRTLinuxのきっかけ  移植方法を簡単に大雑把に説明します Arduinoでのスケッチはこんな感じ void setup(){ // セットアップ処理(ピンのアサインなどいろいろ) } void loop(){ // 実際の処理 }
  • 10.
    5-1-2. RasPiでRTLinuxのきっかけ  wiringPiを使ったC,C++でのコーディング #include <wiringPi.h> ←wiringPiを使う #include <stdio.h> #include <stdlib.h> /* プロトタイプ宣言 */ void loop(void); int main() { int wiringPiSetup(); loop(); exit(0); } void loop(){ }
  • 11.
    5-2. Ras PiでRTLinuxのきっか け 移植自体は問題なし、コンパイルもOK →やっほーい!ということで実行  撃沈 →うまくデコードできない  原因 →100μs単位でのデータ取得部分に問題 があり、赤外線受信データを取りこぼ していた
  • 12.
    5-3. RasPiでRTLinuxのきっかけ  wiringPiのソースを見てみると →delayMicroseconds()関数を nanosleep()で実装していた →nanosleep()は名前に偽りありで、実 際にタイマー割り込みは10ms単位でし かこない  つまり →100μs単位でのデータ取得は到底無理
  • 13.
    6. RasPiでRTLinuxに挑戦 RTLinuxの実装にはいくつか種類があ る →Xenomai,RTAI,Real-TimeLinuxパッ チなど 一番無難そうなReal-Time Linuxパッチ で挑戦  
  • 14.
    7. RasPiでRTLinux  Linux kernel ソース(rpi-3.2.27)の 取得 https://github.com/raspberrypi/linux  Real Time Linuxパッチの取得 http://www.kernel.org/pub/linux/kernel/pr ojects/rt/3.2/older/patch-3.2.27- rt40.patch.bz2
  • 15.
    7-1. RasPiでRTLinux  RealTime Linuxパッチを当てる  母艦のクロスコンパイル環境でコンパ イル →RasPi上でコンパイルすると5,6時間 かかる  RasPiに転送、カーネル入れ替え、カー ネルモジュールインストール
  • 16.
    8. RasPiでRTLinux  できあがったカーネルはこんな感じ $ uname -a Linux raspberrypi 3.2.27-rt40 #1 PREEMPT RT Thu Aug 23 23:55:37 JST 2012 armv6l GNU/Linux   早速テスト(裏でstressというソフトで負荷をかけてま す) $ sudo ./cyclictest -t1 -p 80 -n -i 10000 -l 10000 # /dev/cpu_dma_latency set to 0us policy: fifo: loadavg: 0.83 0.89 0.59 1/132 1746 T: 0 ( 1746) P:80 I:10000 C: 10000 Min: 27 Act: 40 Avg: 42 Max: 66
  • 17.
    8-1. Ras PiでRTLinux  テスト結果を見て・・・ policy: fifo: loadavg: 0.83 0.89 0.59 1/132 1746 T: 0 ( 1746) P:80 I:10000 C: 10000 Min: 27 Act: 40 Avg: 42 Max: 66   →おおっ66ns!と思ったら勘違いで66μsでした  ちなみに、標準のカーネルだと2桁ぐ らい違う policy: fifo: loadavg: 0.21 0.30 0.14 2/122 1566 T: 0 ( 1566) P:80 I:10000 C: 10000 Min: 28 Act: 46 Avg: 49 Max: 4143
  • 18.
    9. まとめ  wiringPi+RT-Linuxである程度ま ではArduinoのソフトウェア資産を 流用できる目処が付いた →例えば、Arduinoと異なりアナロ グ入力ができないので、この部分 は別回路でA/D変換が必要  きっかけであった赤外線受信につ いても目処が立った
  • 19.
    RasPiでRT-Linux 終わり ありがとうございました @azarashi55