体験!マイコンボードで組込みLinux

第9回組込みボードへのさまざまな言語の導入その1]

FORTRANの導入

今回は組込みボードに各種のインタープリタ言語を導入する方法について解説しますが、その前にC言語以外のコンパイラ言語の組込みボードへの導入について触れましょう。ここではFORTRAN言語の導入例について解説します。C言語以外のコンパイラ言語系は、FORTRAN言語以外も似たような方法での導入となります。

概要

SH7706LSRボードでは、ディストリビューションを導入をすればオンボードでコンパイル作業をしてそのまま実行することも可能ですが、ここではPCで開発をしてSH7706LSRボードで実行するというクロスコンパイル形態を考えます。

FORTRANコンパイラには、直接実行コードを生成するものと、C言語のコードを生成してそれをCコンパイラで実行コードを生成するトランスレータがあります。コンパイラは直接に実行コードを生成するものよりC言語のコードを生成するもののほうが軽量で導入がしやすいので、ここではC言語のコードを生成するFORTRANコンパイラシステムを導入します。クロスコンパイル形態なので、FORTRAN言語からC言語に変換するトランスレータは通常のPC上で実行するプログラムコードとなります。

注意が必要なのは、それぞれの言語にはそれぞれの特有の組込み関数が存在するので、トランスレータで変換されたC言語のコードはそのままではCコンパイラで実行できない点です。CコンパイラはCライブラリに存在する関数しか実行コードを生成できないので、そのままでは他の言語の組込み関数の実行コードが生成できません。

FORTRANの場合はFORTRAN特有の組込み関数は別途ライブラリとして用意しておき、C言語でクロスコンパイルするときにそのライブラリをリンクします。したがって、FORTRAN特有の組込み関数ライブラリは組込みボード向けにクロスコンパイルでライブラリを生成し、クロスコンパイラのなかにライブラリを追加します。

導入

FORTRANトランスレータ一式は以下のサイトがオリジナルです。

The Netlib
URL:http://www.netlib.org/

まとまったアーカイブf2c.tar.gzは以下でダウンロード可能です。

Using gfortran or installing f2c and fort77
URL:https://computation.llnl.gov/casc/Overture/henshaw/install/node8.html

アーカイブf2c.tar.gzを展開すると、FORTRAN特有の組込み関数ライブラリがあるlibf2cとトランスレータ本体であるsrcの2つのフォルダに展開されます。

まず、libf2cをSH3アーキテクチャ向けの実行コードにクロスコンパイルをしますが、標準ではPC向けのコードにコンパイルするようになっています。

リスト1 libf2cのmakefile
01: # Unix makefile: see README.
02: # For C++, first "make hadd".
03: # If your compiler does not recognize ANSI C, add
04: #    -DKR_headers
05: # to the CFLAGS = line below.
06: # On Sun and other BSD systems that do not provide an ANSI sprintf, add
07: #    -DUSE_STRLEN
08: # to the CFLAGS = line below.
09: # On Linux systems, add
10: #    -DNON_UNIX_STDIO
11: # to the CLFAGS = line below.
12: .SUFFIXES: .c .o
13: CC = gcc
14: SHELL = /bin/sh
15: CFLAGS = -O
16: 
17: # compile, then strip unnecessary symbols
18: .c.o:
19:     $(CC) -c -DSkip_f2c_Undefs $(CFLAGS) $*.c
20: # wdh    ld -r -x -o $*.xxx $*.o
21:     ld -r -o $*.xxx $*.o
22:     mv $*.xxx $*.o
     《以下略》

makefileであるリスト1の13行目と21行目を以下のように変更します。

CC = sh3-linux-gcc

sh3-linux-ld -r -o $*.xxx $*.o

コンパイルは以下のように行います。

 # make

できあがったライブラリは、以下のようにクロスコンパイラの中に追加をします。

 # cp libf2c.a /usr/sh3-linux/sh3-linux/lib

次に、srcフォルダ内にあるトランスレータを、通常のPC向けのプログラムコードとして同様にコンパイルします。

 # make

できあがったトランスレータは、PC上の実行ファイルがある適当なパスに以下のように追加をします。

 # cp f2c /usr/bin
 # cp xsum /usr/bin

これですべての導入が完了しました。

プログラム実行

PC上でFORTRAN言語のプログラムを作成します。

2つの変数に数値データを入力してから、その結果の四則演算結果を表示するサンプルプログラムはリスト2となり、ファイル名はsample.fとします。

リスト2 四則演算のサンプルプログラム(FORTRAN)
01: programme memain
02: 
03: write(*,*)  'Input a and b.'
04: write(*,*)  'a ='
05: read(*,*) a
06: write(*,*)  'b ='
07: read(*,*) b
08: 
09: c=a+b
10: d=a-b
11: e=a*b
12: f=a/b
13: 
14: write(*,*)  a,'+',b,'=',c
15: write(*,*)  a,'-',b,'=',d
16: write(*,*)  a,'*',b,'=',e
17: write(*,*)  a,'/',b,'=',f
18: 
19: end

FORTRAN言語のソースのコンパイルは以下のようにします。

 # f2c sample.f
 # sh3-linux-gcc -o sample sample.c -lf2c

できあがったSH3アーキテクチャー向けの実行ファイルである sample をSH7706LSRボード向けのファイルシステムの適当な場所にコピーをします。SH7706LSRボードでLinuxを起動し、SH7706LSRボード上のプロンプト上で以下のように実行をします。

~ # ./sample      
 Input a and b.   
 a = 23       
 b = 15        
  23.+  15.=  38. 
  23.-  15.=  8.  
  23.*  15.=  345.
  23./  15.=  1.5333333
~ #

awkインタープリタの導入

awk言語はデータ処理志向のプログラミング言語で、データの行ごとに処理コードがイベント駆動されるようになっています。何も条件指定がなければ各行ごとに無条件で処理コードがイベント駆動されますが、条件を指定すれば、その条件に合致した行のみ処理コードがイベント駆動されます。また、データ処理を行う際の前処理と後処理のコードも記述することができます。

awk言語はデータ処理志向のプログラミング言語ではありますが、前処理または後処理のコードのみを記述すれば、データ処理なしで通常のプログラミングを行うこともできます。

導入

SH7706LSRのサイトで標準公開しているファイルシステムは、そのままでawkコマンドが使えるようになっています。もし、BusyBoxでawkコマンドが含まれていなければ図1のトップメニューで「Editors」を選択し、図2のメニューで「awk」を選択します。その設定を保存してからBusyBoxを再コンパイルをしてSH7706LSRボード向けのファイルシステムにインストールします。

図1 BusyBoxトップでEditorsを選択
図1 BusyBoxトップでEditorsを選択
図2 awkを選択
図2 awkを選択

実行

まず、コマンド上で以下のような簡単な演算結果を表示するプログラムを実行してみます。

~ # awk 'BEGIN {a=20;b=30;printf("[%d]\n", a*b)}'
[600]
~ #

次に、リスト4のような品名と単価と個数のデータを読み込んで価格や総額を含んだ簡単な経理処理プログラムリスト3を実行してみます。

リスト3 総額計算サンプルプログラム
01: BEGIN {
02:     printf("Parts\t   Unit price\tNumber\tPrices\n");
03:     total = 0;
04: }
05: {
06:     printf("%s\t%d\t%d\t%d\n", $1, $2, $3, $2 * $3);
07:     total = total + $2 * $3;
08: }
09: END {
10:     printf("Total prices\t%d\n", total);
11: }
リスト4 計算用サンプルデータ
Processor 4600 120
Memory/SDRAM 980 240
Crystal-Unit 120 360
Capacitor 10 12000
Resistor 5 24000
~ # awk -f calc.awk data.dat
Parts      Unit price   Number  Prices
Processor       4600    120     552000
Memory/SDRAM    980     240     235200
Crystal-Unit    120     360     43200
Capacitor       10      12000   120000
Resistor        5       24000   120000
Total prices    1070400
~ #

Perlインタープリタの導入

概要

PerlはWebサーバにおけるCGIプログラムのインタープリタ言語として定番ですが、フルセットのPerlでは組込みボードであまり使わないような機能も多く、フルセットではシンプルな組込みボードには向いていません。

実は現在のPerlの標準ソースパッケージではBusyBoxのようなコンパクトでシンプルな組込みボード向けの構築もできるようになっています。そのようにして構築したPerlは特にmicroperlという名称になっています。

microperlはフルセットではないですが、その分贅肉も少なく組込みボードに適したPerlといえるでしょう。

導入

microperlはBusyBoxにも組込み可能なようになってはいますが、今回は単体のコマンドとして導入します。最新版の標準Perlソースパッケージを適当なフォルダにコピーして展開します。

コンパイルは以下のようにします。

 # CC=sh3-linux-gcc make -f Makefile.micro

できあがった実行ファイルであるmicroperlは、SH7706LSRボードのLinuxファイルシステムの/usr/binなどの実行ファイルがある場所にコピーをします。

実行

SH7706LSRのLinux上でsample.plという名称のサンプルプログラムリスト5を作成し、実行属性を付与します。

リスト5 Perlサンプル(sample.pl)
01: #!/usr/bin/microperl
02: 
03: print "Content-type: text/plain\n\n";
04: print "Sample program written by perl.\n";

ためしに、以下のようにコマンド上でサンプルプログラムを実行してみます。

~ # ./sample.pl
Content-type: text/plain
Sample program written by perl.
~ #

そして、Webサーバのパスの/cgi-bin/以下にサンプルプログラムをコピーします。SH7706LSRでWebサーバを起動した状態で、外部からSH7706LSRをブラウザで/cgi-bin/sample.plにアクセスすると、図3のようにPerl記述したCGIプログラムが起動します。

図3 サンプルをCGI実行したところ
図3 サンプルをCGI実行したところ

次回は、さらにtcl言語インタープリタとlua言語インタープリタを組込みボードに導入をしてみます。

おすすめ記事

記事・ニュース一覧