2004年12月25日
クロス開発環境の構築 for RTLinux
クロス開発とは、プログラムを開発する環境と実行する環境が
異なる場合を云います。(同じ場合はセルフ開発)
開発する環境をホスト、実行する環境をターゲットと呼びます。
今回は、図のように、
・ホスト :Window2000/XP インテル系CPU
・ターゲット:linux-2.4.20&RTLinux Pentium-M
の環境を構築します。

本説明では、「cygwin$」をホスト側のシェルプロンプト、
「linux#」をターゲット側のシェルプロンプトとします。
開発環境の構築は次の4段階で行いました。
1.cygwinのインストール
Window2000やXP上でUNIX環境を実現するツール
をインストールします。
2.Linux用、includeとlibファイルの取得
ターゲットマシンから、クロス開発に必要な、
Linux用、includeとlibファイルを集め、
ホストにインストールします。
3.RTLinux用、includeファイルの取得
ターゲットマシンから、クロス開発に必要な、
RTLinux用、includeファイルを集め、
ホストにインストールします。
4.クロス開発環境(gcc)のインストール
GNUの次のツールをcygwin上にインストールします。
1) binutils-2.13.tar.gz
2) gcc-3.2.2.tar.gz
3) gcc-g++-3.2.2.tar.gz
当初、
1) binutils-20040725-2-src.tar.bz2
2) gcc-core-3.4.1-1-src.tar.bz2
3) gcc-g++-3.4.1-1-src.tar.bz2
をインストールしましたが、RTLinuxのコードが旨く出来なかったので、
上記バージョンを使いました。
1.cygwinのインストール
1.1. cygwinのsetup.exeを
http://www.cygwin.com/setup.exe
からダウンロード
例えば、C:\tool\cygwin にダウンロードします。
1.2. setup.exeを実行
http://pcweb.mycom.co.jp/special/2002/cygwin/
の手順でインストール(次の点に注意)
1) C:\cygwinをインストールディレクトリに指定。
(説明の都合上、C:\cygwinとします。D:\cygwin
などでも問題ありません。)
2) ミラーサーバーを選ぶ。
私は、ftp://ring.aist.go.jp にしました。
3) "Devel"項目を、"Install" にする。
4) Cygwinアイコンをディスクトップに作成にする。
インストール完了で、Cygwinアイコンがディスクトップに
作成されるが、ここではまだCygwinを開かない。
1.3. パソコンの環境変数を設定
次の環境変数を設定します。
CYGWIN ntsec smbntsec glob
HOME /home/ishizumi
MAKE_MODE UNIX
SHELL /bin/bash
Windows2000の場合次の手順で設定します。
1) [マイコンピュータ]を右クリック
2) [システムのプロパティ」を起動
3) [詳細]タブをクリック
4) [環境変数(E)]ボタンを押す
5) XXXのユーザー環境変数に設定する
1.4. Cygwinを開く
ディスクトップのCygwinアイコンをダブルクリックして
Cygwinを開きます。
1回目の操作で、/home/ishizumiディレクトリに次のファイルが作成されます。
.bash_profile
.bashrc
.inputrc
1.5. cygwinの環境変数の設定
C:\cygwin\home\ishizumi\.bashrcファイルに
次の環境変数をセットします。
(この変数は、2.以下の作業を行う上で必要)
export host=i686-pc-cygwin
export build=i686-pc-cygwin
export target=i686-pc-linux-gnu
export prefix=/usr/local/linux
export src_root=/usr/local/src/gnu
export PATH=$PATH:$prefix/bin
1.6. cygwinの起動
ディスクトップに出来た、Cygwinアイコンをダブルクリック
することで、Cygwinが起動します。
cygwin$ ls
cygwin$ pwd
などと入力してみましょう。
2.Linux用、includeとlibファイルの取得とインストール
2.1. ターゲットマシンから Linux ランタイムを取得
「RTLinux/Freeのインストール」の手順でインストールした
Linux(ターゲット)側マシンからLinux用includeとlibファイルを
取得します。(ホスト側からtelnetで操作するのが楽です。)
以下の操作をLinux(ターゲット)側のroot権限で行います。
・includeファイルに関する作業
linux# mkdir -p /tmp/linux-target-runtime
linux# cd /tmp/linux-target-runtime
linux# (cd /usr; tar cf - include) | tar xf -
linux# ln -s include sys-include
linux# (cd /usr; tar cf - lib) | tar xf -
linux# (cd /; tar cf - lib) | tar xf -
linux# cd /tmp/linux-target-runtime/include
linux# rm linux asm (2005-03-03に 削除)
linux# (cd /usr/src/linux/include; tar cf - linux asm-i386) | tar xf -
linux# ln -s asm-i386 asm
・libファイルに関する作業
linux# cd /tmp/linux-target-runtime
linux# ls -F lib
linux# vi lib/libc.so ←エディタによるファイル変更
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a )
↓
GROUP ( /usr/local/linux/i686-pc-linux-gnu/lib/libc.so.6 /usr/local/linux/i686-pc-linux-gnu/lib/libc_nonshared.a )
・linux-target-runtime.tar.gzファイルの作成
linux# cd /tmp/linux-target-runtime
linux# tar -zcvf /tmp/linux-target-runtime.tar.gz .
・linux-target-runtime.tar.gzファイルの転送
linux-target-runtime.tar.gzファイルをFTPなどを使用して、
ホスト(cygwinマシン)の、C:\cygwin\tmpディレクトリに送ります。
2.2. ホスト側にインストール
以下の操作をパソコン側でCygwinを起動して行います。
cygwin$ mkdir -p $prefix/$target
cygwin$ cd $prefix/$target
cygwin$ tar zxvf /tmp/linux-target-runtime.tar.gz
3.RTLinux用、includeファイルの取得とインストール
3.1. ターゲットマシンから RTLinux用includeファイルの取得
「RTLinux/Freeのインストール」の手順でインストールした
Linux(ターゲット)側マシンからRTLinux用、includeファイルを
取得します。
以下の操作をLinux(ターゲット)側のroot権限で行います。
linux# mkdir -p /tmp/rtlinux/linux-2.4.20
linux# mkdir -p /tmp/rtlinux/rtlinux-3.2-pre3
linux# cd /tmp/rtlinux/linux-2.4.20
linux# (cd /usr/src/rtlinux/linux-2.4.20; tar cf - include) | tar xf -
linux# cd /tmp/rtlinux/rtlinux-3.2-pre3
linux# (cd /usr/src/rtlinux/rtlinux-3.2-pre3; tar cf - include) | tar xf -
linux# cd /tmp/rtlinux/rtlinux-3.2-pre3
linux# ln -s /usr/src/rtlinux/linux-2.4.20 linux
・rtlinux.tar.gzファイルの作成
linux# cd /tmp/rtlinux
linux# tar -zcvf /tmp/rtlinux.tar.gz .
・rtlinux.tar.gzファイルの転送
rtlinux.tar.gzファイルをFTPなどを使用して、
ホスト(cygwinマシン)の、C:\cygwin\tmpディレクトリに送ります。
3.2. ホスト側にインストール
以下の操作をパソコン側でCygwinを起動して行います。
cygwin$ mkdir -p /usr/src/rtlinux
cygwin$ cd /usr/src/rtlinux
cygwin$ tar zxvf /tmp/rtlinux.tar.gz .
4.クロス開発環境(gcc)のインストール
ここでの操作は全てパソコン(ホスト)側で行います。
4.1. src_root ディレクトリの作成
cygwin$ mkdir -p $src_root
4.2. gcc,g++とbinutilsの取得
次のソースをC:\cygwin\tmpディレクトリにダウンロードする。
http://ftp.gnu.org/pub/gnu/gcc/gcc-3.2.2/gcc-3.2.2.tar.gz
http://ftp.gnu.org/pub/gnu/gcc/gcc-3.2.2/gcc-g++-3.2.2.tar.gz
http://ftp.gnu.org/gnu/binutils/binutils-2.13.tar.gz
4.3. gccとbinutilsの解凍
cygwin$ cd $src_root
cygwin$ tar zxvf /tmp/gcc-3.2.2.tar.gz
cygwin$ tar zxvf /tmp/gcc-g++-3.2.2.tar.gz
cygwin$ tar zxvf /tmp/binutils-2.13.tar.gz
4.4. binutilsのビルドとインストール
cygwin$ mkdir -p $src_root/BUILD/binutils
cygwin$ cd $src_root/BUILD/binutils
cygwin$ $src_root/binutils-2.13/configure \
--with-included-gettext \
--target=$target --host=$host --build=$build \
--prefix=$prefix -v
cygwin$ make > make.log 2>&1
cygwin$ make install > install.log 2>&1
チェック
cygwin$ $target-ld --version
4.5. bccのビルドとインストール
cygwin$ mkdir -p $src_root/BUILD/gcc
cygwin$ cd $src_root/BUILD/gcc
cygwin$ $src_root/gcc-3.2.2/configure \
--enable-languages=c,c++ \
--with-included-gettext --enable-shared --enable-threads \
--target=$target --host=$host --build=$build \
--prefix=$prefix -v
cygwin$ make > make.log 2>&1
cygwin$ make install > install.log 2>&1
4.6. Linuxプログラムのコンパイルと実行
cygwin$ mkdir -p /home/ishizumi/linux/sample
cygwin$ cd /home/ishizumi/linux/sample
このディレクトリに、hello.cプログラムを入れ、
次のコマンドでコンパイルします。
cygwin$ $target-gcc -o hello hello.c
または、
cygwin$ /usr/local/linux/bin/i686-pc-linux-gnu-gcc -o hello hello.c
hello ファイルが出来るのでターゲットへダウンロード
して実行する。
linux# hello
「Hello, world!」と表示されればOK
4.7. RTLinuxプログラムのコンパイルと実行
cygwin$ mkdir -p /home/ishizumi/RTlinux/sample
cygwin$ cd /home/ishizumi/RTlinux/sample
このディレクトリに、
1) hello.c
2) Makefile
3) rtl.mk
を入れ、次のコマンドでコンパイルします。
cygwin$ make
hello.o ファイルが出来るのでターゲットへダウンロード
して実行する。
以下の操作をLinux(ターゲット)側のroot権限で行います。
linux# tail -f /var/log/messages &
linux# insmod hello.o
「Hello, world!!」と表示されればOK
linux# rmmod hello
「bye bye」と表示されればOK
参考サイト
1) http://pcweb.mycom.co.jp/special/2002/cygwin/
2) http://www.sixnine.net/cygwin/translation/devel/cygwin-to-linux-cross-howto.html
3) http://ftp.gnu.org/
4)http://yama-tabi.net/blog/archives/2004/12/rtlinuxfree_1.html
投稿者 山旅人 : 08:34 | コメント (0) | トラックバック
2004年12月18日
RTLinuxの基本構造

RTLinux(RealTime Linux)とは、Linuxでリアルタイム処理を可能にするOSです。
RTLinuxにもいくつかの種類があるのですが、ここで扱うRTLinuxは
FSMLabs社のRTLinux/Freeとします。
図1Linuxの基本構造、図2RTLinuxの基本構造に示すとおり、RTLinuxは
ハードウェアとLinuxカーネルの間に、RTLinuxカーネルを置くことでリアルタイム
性能を実現します。
このRTLinuxカーネルが、プライオリティスケジューリング機能を持っており、
リアルタイムスレッドに対して、高優先順位でCPUの割り当てを行います。
また、標準のLinuxは、このスケジューラが最も低いプライオリティーを与える
ことで動作します。
このような仕組みにより、RTLinuxでは、リアルタイムスレッドと通常のLinux
プロセスが動作することが可能となります。
RTLinuxカーネルは、全てのハードウェア割り込みをインターセプトし、必要に応じて、
リアルタイムインタラプトサービスルーチンを起動するか、ソフトウェア割り込みとして、
Linuxカーネルに渡します。
図1 Linuxの基本構造

図2 RTLinuxの基本構造

投稿者 山旅人 : 13:37 | コメント (5) | トラックバック
2004年12月14日
USBエラー
RTlinux起動時にUSB関係のエラーが表示されるので、
このエラー表示が出ないようにしてみました。
USBを使おうとしているところをコメントアウトしただけなので、
この方法では、エラー表示は出ませんがUSBは使えません。
/etc/rc.d/rc.sysinit ファイルに次の太字の部分を追加。
# Initialize USB controller and HID devices
usb=0
if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && ! LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
aliases=`/sbin/modprobe -c | awk '/^alias usb-controller/ { print $3 }'`
if [ -n "$aliases" -a "$aliases" != "off" ]; then
modprobe usbcore
for alias in $aliases ; do
[ "$alias" != "off" ] && action $"Initializing USB controller ($alias): " modprobe $alias
done
[ $? -eq 0 -a -n "$aliases" ] && usb=1
fi
fi
if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
usb=1
fi
usb=0 ←これを追加
if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then
action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /proc/bus/usb
fi
・
・
投稿者 山旅人 : 07:45 | コメント (2) | トラックバック
2004年12月11日
RTLinux/Freeのインストール
RTLinux/Free(rtlinux-3.2-pre3)と云うOSをPentium Mの
パソコンに入れてみました。
これでちゃんと動いてますが、起動時にUSB関係のエラー
が出るので、この解決が今後の課題です。
RTLinux公式サイト
http://www.fsmlabs.com/
RTLinux-gpl FTP repository
http://www.rtlinux-gpl.org/
Linuxカーネルのダウンロードサイト
http://www.kernel.org/
kgccのダウンロードサイト
http://rpm.pbone.net/index.php3/stat/4/idpl/12210/com/kgcc-1.1.2-40.i386.rpm.html
RTLinuxインストール参考サイト
http://daq.rikkyo.ac.jp/rtlinux/installation-ver32.html
http://www-arailab.sys.es.osaka-u.ac.jp/~takubo/howto_rtlv3_install_2.html
1.Redhat9のインストール
RTLinuxをインストールするには、Linuxカーネルの再構築(コンパイル)
を行う開発環境が必要です。
今回は、Redhat9を開発環境にしたので、Redhat9をインストールする必要
があります。
(Redhat9はlinux-2.4.20系を使用しており、rtlinux-3.2-pre3にも
linux-2.4.20系のパッチが含まれているので、Redhat9を使用)
1) ファイルシステムは、ext2 を使用
2) ネットワーク関係はDHCPを使用せず手動で設定
今回は次のように設定
・ ホストIPアドレス 192.168.20.236
・ ホスト名 mckinley
・ デフォルトゲートウェイ 192.168.20.254
・ プライマリDNSサーバ 192.168.10.240
・ セカンダリDNSサーバ 192.168.30.240
3) カスタムセットアップで、
・X Window環境 2005-03-01 削除
・telnetサーバ
・ftpサーバ
・開発ツール
・カーネル開発
を含んでインストール
(不必要なものはできるだけインストールしない。)
4) rootとishizumi ユーザーを登録
2.ファイルの転送
Redhat9のインストールが終わったら次のファイルをFTPで
/home/ishizumi/rtlinuxに転送します。
1) kgcc-1.1.2-40.i386.rpm (Redhat用コンパイラ)
2) rtlinux-3.2-pre3.tar.bz2 (リアルタイムリナックス)
3) linux-2.4.20.tar.gz (リナックス 2.4.20)
3.kgccのインストール
Redhat9の場合、gccでのカーネルの再構築がうまく出来ないため、
kgccを使用します。
ルート権限で次の手順でインストール
# cd /home/ishizumi/rtlinux/
# rpm -ivh kgcc-1.1.2-40.i386.rpm
# rpm -q kgcc (インストール出来たかの確認)
4. RTLinuxのインストール (Kernleの構築)
・/usr/src に移動して,RTlinux用のディレクトリを作り,その中で、
ソースを展開します。
# cd /usr/src
# mkdir /usr/src/rtlinux
# cd /usr/src/rtlinux
# tar xzf /home/ishizumi/rtlinux/linux-2.4.20.tar.gz
# tar --bzip2 -xvf /home/ishizumi/rtlinux/rtlinux-3.2-pre3.tar.bz2
・展開したrtlinuxのディレクトリからリンクをはります。
# cd /usr/src
# ln -sf rtlinux/linux-2.4.20 linux
・/usr/src/rtlinux/linux-2.4.20 に移動して、パッチをあてます。
# cd /usr/src/rtlinux/linux-2.4.20
# patch -p1 < ../rtlinux-3.2-pre3/patches/kernel_patch-2.4.20-rtl3.2-pre3
・カーネルの再構築を行う。
# cd /usr/src/rtlinux/linux-2.4.20
# vi Makefile (kgccを使うように変更する。)
CC = $(CROSS_COMPILE)gcc
↓
CC = $(CROSS_COMPILE)kgcc
# make menuconfig
ここで、自分の使っているパソコンの環境に合わせて設定する。
(今回はデフォルト値を使用)
X Window環境が無い場合
「make menuconfig」 もしくは、
「make config」
# make dep
# make bzImage
# make modules
# make modules_install
# depmod -a
・カーネルイメージを起動するローダの設定。
# cd /boot
# cp /usr/src/rtlinux/linux-2.4.20/arch/i386/boot/bzImage /boot/rtlinuz
# cd /boot/grub
# cp grub.conf grub.conf.org
# vi grub.conf (grub.confファイルを次のように変更)
####### ここから ########
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda2
# initrd /initrd-version.img
#boot=/dev/hdd
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
initrd /initrd-2.4.20-8.img
title RTLinux V3.2
root (hd0,0)
kernel /rtlinuz ro root=/dev/hda2
####### ここまで ########
・再起動
# reboot
5. RTLinuxモジュールなどのインストール
・RTLinuxのモジュールの作成
# cd /usr/src/rtlinux/rtlinux-3.2-pre3
# ln -s /usr/src/rtlinux/linux-2.4.20 linux
# make xconfig
# make menuconfig
# make
# make devices
# make install
・RTLinuxのモジュールのインストール
# cd /usr/src/rtlinux/rtlinux-3.2-pre3
# sh scripts/insrtl
# lsmod (インストールの確認)
・RTLinuxのモジュールの自動起動の設定
# cd /etc/rc.d/rc3.d
# ln -s ../init.d/rtlinux S99rtlinux
# cd /etc/rc.d/rc5.d
# ln -s ../init.d/rtlinux S99rtlinux
・サンプルの実行
# cd /usr/src/rtlinux/rtlinux-3.2-pre3/examples/frank
# insmod frank_module.o
# ./frank_app
投稿者 山旅人 : 08:19 | コメント (0) | トラックバック


