- 追加された行はこの色です。
- 削除された行はこの色です。
[[RTAIの使い方]]
+ サンプルプログラム(showroom)のインストール
本来,CVS を使ってコマンドラインで
本来,CVS を使ってコマンドラインで
# cvs -d:pserver:anonymous@cvs.gna.org:/cvs/rtai co showroom
としてインストールするが,proxy サーバ経由では CVS が使えないようだ.
そこで,スナップショット http://cvs.gna.org/daily/rtai-snapshot.tar.gz を持ってくる.
としてインストールするが,proxy サーバ経由では CVS が使えないようだ.&br;
そこで,スナップショット http://cvs.gna.org/daily/rtai-snapshot.tar.gz を持ってくる.
++ /usr/src に rtai-snapshot.tar.gz を展開.
++ shared memory のサンプルプログラムを編集する(そのままコンパイル・実行するとハングアップするので注意):
# cd /usr/src/rtai/showroom/v3.x/kern/shm
* モジュール(カーネル空間のプログラム) shm.c: 編集前 → 編集後
* アプリケーション(ユーザ空間のプログラム) display.c: 編集前 → 編集後
3. コンパイル・実行(事前に .cshrc 等で PATH に /usr/realtime/bin を追加しておく)
# tar zxvf rtai-snapshot.tar.gz
# 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
# 実験用プログラムの作成
++ shared memory のサンプルプログラムを編集する(そのままコンパイル・実行するとハングアップするので注意):
# cd rtai/showroom/v3.x/kern/shm
--- モジュール(カーネル空間のプログラム) shm.c: [[編集前>/:RTAI/shm/shm.c.org]] → [[編集後>/:RTAI/shm/shm.c]]
--- アプリケーション(ユーザ空間のプログラム) display.c: [[編集前>/:RTAI/shm/display.c.org]] → [[編集後>/:RTAI/shm/display.c]]
--- コンパイル・実行(事前に .cshrc 等で PATH に /usr/realtime/bin を追加しておく)
# make
gcc -I. -I/usr/realtime/include -O2 -I/usr/src/linux/include -Wall -Wstrict-prototypes -pipe -o display display.c
make -C /usr/src/linux CC=gcc SUBDIRS=$PWD V= modules
make[1]: Entering directory `/usr/src/linux-2.6.20.21'
CC [M] /usr/src/rtai/showroom/v3.x/kern/shm/shm.o
LD [M] /usr/src/rtai/showroom/v3.x/kern/shm/shm_rt.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: vmlinux - Section mismatch: reference to .init.data:boot_params from .text between '_text' (at offset 0xc1000029) and 'checkCPUtype'
(略)
WARNING: "rt_busy_sleep" [/usr/src/rtai/showroom/v3.x/kern/shm/shm_rt.ko] undefined!
WARNING: "rt_get_time" [/usr/src/rtai/showroom/v3.x/kern/shm/shm_rt.ko] undefined!
WARNING: "nano2count" [/usr/src/rtai/showroom/v3.x/kern/shm/shm_rt.ko] undefined!
CC /usr/src/rtai/showroom/v3.x/kern/shm/shm_rt.mod.o
LD [M] /usr/src/rtai/showroom/v3.x/kern/shm/shm_rt.ko
make[1]: Leaving directory `/usr/src/linux-2.6.20.21'
undefined! とたくさん出るのは無視
# ../ldmod
# insmod shm_rt.ko
# ./display
(数字が変化する様子が表示される)
(ctrl-C で止める)
# rmmod shm_rt
# ../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 80424 0
rtai_hal 32340 1 rtai_sched
(略)
手動で外す:
# rmmod rtai_sched
# rmmod rtai_hal
+ 実験用プログラム period の作成&br;
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
# 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 に修正&br;
作業後のディレクトリ [[/usr/src/rtai/showroom/v3.x/kern/period/>/:RTAI/period/]]
実行例:
# make
gcc -I. -I/usr/realtime/include -O2 -I/usr/src/linux/include -Wall -Wstrict-prototypes -pipe -o period_app period_app.c
make -C /usr/src/linux CC=gcc SUBDIRS=$PWD V= modules
make[1]: Entering directory `/usr/src/linux-2.6.20.21'
CC [M] /usr/src/rtai/showroom/v3.x/kern/period/period_module.o
/usr/src/rtai/showroom/v3.x/kern/period/period_module.c: In function ‘fun’:
/usr/src/rtai/showroom/v3.x/kern/period/period_module.c:27: 警告: ‘t0’ may be used uninitialized in this function
/usr/src/rtai/showroom/v3.x/kern/period/period_module.c:26: 警告: ‘s_time’ may be used uninitialized in this function
LD [M] /usr/src/rtai/showroom/v3.x/kern/period/period_module_rt.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: vmlinux - Section mismatch: reference to .init.data:boot_params from .text between '_text' (at offset 0xc1000029) and 'checkCPUtype'
WARNING: vmlinux - Section mismatch: reference to .init.data:boot_params from .text between '_text' (at offset 0xc1000037) and 'checkCPUtype'
(略)
[/usr/src/rtai/showroom/v3.x/kern/period/period_module_rt.ko] undefined!
WARNING: "rt_get_time" [/usr/src/rtai/showroom/v3.x/kern/period/period_module_rt.ko] undefined!
WARNING: "nano2count" [/usr/src/rtai/showroom/v3.x/kern/period/period_module_rt.ko] undefined!
CC /usr/src/rtai/showroom/v3.x/kern/period/period_module_rt.mod.o
LD [M] /usr/src/rtai/showroom/v3.x/kern/period/period_module_rt.ko
make[1]: Leaving directory `/usr/src/linux-2.6.20.21'
# ../ldmod
# insmod period_module_rt.ko
# ./period_app > foo.dat
# rmmod period_module_rt
# ../remod
# rmmod rtai_sched
# rmmod rtai_hal
# 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* の場合と同様.
↓foo.datをグラフ表示したところ
&ref([[/:RTAI/period/foo.png]])
時間が経過するに従いジッタが生じている.余分なモジュールを削除する等して,要改善.
+ 矩形波を出力するプログラム 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 のもの.
--- Makefile に,adc.o をリンクするように記述
--- adc.h にはボードの I/O ベースアドレスを記載する.調査方法は以下の通り:
# lspci -v
(略)
03:01.0 Multimedia controller: Contec Co., Ltd Unknown device 8183
Subsystem: Contec Co., Ltd Unknown device 8183
Flags: medium devsel, IRQ 10
I/O ports at ece0 [size=32]
03:02.0 Multimedia controller: Contec Co., Ltd Unknown device 8153
Subsystem: Contec Co., Ltd Unknown device 8153
Flags: medium devsel, IRQ 6
I/O ports at ecc0 [size=32]
id=8183 は D/A12-4(PCI), id=8153 は AD12-16(PCI).&br;
上記の場合,I/Oポートアドレスはそれぞれ 0xece0 と 0xecc0 の二つ.
作業後のディレクトリ: [[/usr/src/rtai/showroom/v3.x/kern/period_da/>/:RTAI/period_da/]]
実行方法は上記 period* の場合と同様.&br;
実行時,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 を編集した.
+ 周波数応答実験用プログラム freqresp
-- 作業後のディレクトリ: [[/usr/src/rtai/showroom/v3.x/kern/freqresp/>/:RTAI/freqresp/]]
-- sin 等数学関数を使っていて,libm を static リンクする必要があるため, /usr/src/rtai/showroom/v3.x/kern/fp/ を参考にして GNUmakefile, Makefile を編集した.
-- FFTを計算するライブラリを /usr/local/lib/librealfft.a, libfft.a に用意
実行方法:
# 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
# cd /usr/src/rtai/showroom/v3.x/kern/freqresp
# mkdir data
# make clean
# make
# ../ldmod
# /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
# 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 しようとしてエラーになってるだけなので問題なし)
# rmmod rtai_sched
# rmmod rtai_hal
(毎回 remod でモジュールを外した方がハングアップしにくいようだ.ただし,remod に rtai_sched の記載がないので,これを追加しておく.(rtai_hal を rmmod する直前に追記)
# 編集例(RTLinux版とRTAI版の比較):
- 編集例(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