RTAIの使い方

  1. サンプルプログラム(showroom)のインストール
    本来,CVS を使ってコマンドラインで
    # cvs -d:pserver:anonymous@cvs.gna.org:/cvs/rtai co showroom
    としてインストールするが,proxy サーバ経由では CVS が使えないようだ.
    そこで,スナップショット http://cvs.gna.org/daily/rtai-snapshot.tar.gz を持ってくる.
    
    1. /usr/src に rtai-snapshot.tar.gz を展開.
    2. shared memory のサンプルプログラムを編集する(そのままコンパイル・実行するとハングアップするので注意):
            # cd /usr/src/rtai/showroom/v3.x/kern/shm
         * モジュール(カーネル空間のプログラム) shm.c: 編集前 → 編集後
         * アプリケーション(ユーザ空間のプログラム) display.c: 編集前 → 編集後 
  3. コンパイル・実行(事前に .cshrc 等で PATH に /usr/realtime/bin を追加しておく)
     # make
     # ../ldmod
     # insmod shm_rt.ko
     # ./display
     (数字が変化する様子が表示される)
     (ctrl-C で止める)
     # rmmod shm_rt
     # ../remod
     [root@aoi shm]# ../remod
     ERROR: Module rtai_lxrt does not exist in /proc/modules
     ERROR: Module rtai_smp does not exist in /proc/modules
     ERROR: Module rtai_mup does not exist in /proc/modules
     ERROR: Module rtai_up does not exist in /proc/modules
     ERROR: Module rtai_hal is in use by rtai_sched
     何故かエラー.
     # lsmod
     Module                  Size  Used by
     rtai_sched             75432  0
     rtai_hal               31696  1 rtai_sched
     (略)
     手動で外す:
     # rmmod rtai_sched
     # rmmod rtai_hal

# 実験用プログラムの作成 shm をベースにして,実行周期を記録するプログラム(period*)を作る.

# cd /usr/src/rtai/showroom/v3.x/kern

# cp -a shm period (とりあえずコピーしてから編集する)

# cd period

# mv display.c period_app.c

# mv shm.c period_module.c

Makefile, GNUmakefile 中,shm → period_module,display → period_app に修正

作業後のディレクトリ/usr/src/rtai/showroom/v3.x/kern/period/

実行例:

# cd /usr/src/rtai/showroom/v3.x/kern/period

# make

# ../ldmod

# /sbin/insmod period_da_module_rt.ko

# ./period_app > foo.dat

# /sbin/rmmod period_da_module_rt

↓foo.dat をグラフ表示したところ

時間が経過するに従いジッタが生じているのは,USBコントローラを on にしているためと思われる. (使用した PC は Dell Dimension E521 で,USB キーボード・マウス搭載のため USBコントローラを off できない.インストールのページで使用した PC は PS2 キーボード・マウス搭載のもので USB はoff していた) USB は下記参考資料のユーザマニュアル(RTAI3.4 User Manual rev 0.3)で,"latency killer" としてできるだけ off することが推奨されている.

# 矩形波を出力するプログラム period_da* (period* に D/A 出力を追加したもの)

   * モジュールのプログラム period_module.c に D/A 出力を追加したものを period_da_module.c とする.後は上記と同じ.
   * D/A 出力を追加するために,adc.c, adc.h を追加する.使用している D/A, A/D ボードは CONTEC のもの.
   * adc.h にはボードの I/O ベースアドレスを記載する.調査方法は以下の通り:
     # /sbin/lspci -v
     (略)
     04:08.0 Multimedia controller: Contec Co., Ltd Unknown device 8183
             Subsystem: Contec Co., Ltd Unknown device 8183
             Flags: medium devsel, IRQ 11
             I/O ports at 9c00 [size=32]
     04:09.0 Multimedia controller: Contec Co., Ltd Unknown device 8153
             Subsystem: Contec Co., Ltd Unknown device 8153
             Flags: medium devsel, IRQ 10
             I/O ports at 9800 [size=32]
     id=8183 は D/A12-4(PCI), id=8153 は AD12-16(PCI).
     I/Oポートアドレスはそれぞれ 0x9c00 と 0x9800 の二つ. 

作業後のディレクトリ/usr/src/rtai/showroom/v3.x/kern/period_da/ 実行方法は上記 period* の場合と同様. 実行時,D/A 変換ボードの出力 0ch をオシロで見ると, 50μsec で 0[V] と 1[V] が切り替わる矩形波が観測できる.

# 周波数応答実験用プログラム freqresp* 作業後のディレクトリ/usr/src/rtai/showroom/v3.x/kern/freqresp/

sin 等数学関数を使っていて,libm を static リンクする必要があるため, /usr/src/rtai/showroom/v3.x/kern/fp/ を参考にして GNUmakefile, Makefile を編集した.

実行方法:

# cd /usr/src/rtai/showroom/v3.x/kern/freqresp

# mkdir data

# make clean

# make

# ../ldmod insmod: error inserting '/usr/realtime/modules/rtai_mq.ko': -1 Unknown symbol in module

# /sbin/insmod freqresp_module_rt.ko

# ./freqresp_app (略) 1905.460718[Hz] 0.000077 -46.710920[deg] 0.000014 -43.897886[deg] sampling_period=0.00017095, resolution=3, recording_samples=2499, canceling_samples=2924 Starting real time task ... done. done.ng for record ... 1949.844600[Hz] 0.000202 -140.362597[deg] 0.000045 -218.565118[deg] sampling_period=0.00016706, resolution=3, recording_samples=2499, canceling_samples=2992 Starting real time task ... done. done.ng for record ... 1995.262315[Hz] 0.000154 -72.083142[deg] 0.000026 -104.920862[deg]

# /sbin/rmmod _freqresp_module_rt

# ../remod ERROR: Module rtai_mq does not exist in /proc/modules ERROR: Module rtai_lxrt does not exist in /proc/modules ERROR: Module rtai_smp does not exist in /proc/modules ERROR: Module rtai_mup does not exist in /proc/modules ERROR: Module rtai_up does not exist in /proc/modules (insmod していない module を rmmod しようとしてエラーになってるだけなので問題なし)

(毎回 remod でモジュールを外した方がハングアップしにくいようだ.ただし,remod に rtai_sched の記載がないので,これを追加しておく.(rtai_hal を rmmod する直前に追記)

# 編集例(RTLinux版とRTAI版の比較):

	RTLinux 版	RTAI版

period(実行周期を記録する) period.h period.h

	period_module.c	period_module.c
	period_app.c	period_app.c

period_da(DAボードから矩形波を出力する) period.h(同上) period.h(同上)

	period_da_module.c	period_da_module.c
	period_app.c(同上)	period_app.c(同上)
	adc.h	adc.h
	adc.c	adc.c

freqresp(周波数応答実験) freqresp.h freqresp.h

	freqresp_module.c	freqresp_module.c
	freqresp_app.c	freqresp_app.c

# プログラム作成の参考資料:

   * RTAI3.4 User Manual rev 0.3
   * RTAI API Documentation

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS