TOPPERS 活用アイデア・アプリケーション開発
コンテスト
部門

：活用アイデア部門

アプリケーション開発部門

作品のタイトル： Ruby 版 TOPPERS コンフィギュレータ

作成者

：

対象者

： TOPPERS ソフトウェア開発者(特にポーティングを行う方)

富士ソフト株式会社（代表：鴫原一人）

使用する開発成果物 ： ・ASP カーネル R1.9.0 (Skyeye シミュレータ簡易パッケージ)
・TTSP Release 1.1.2
・TOPPERS 新世代カーネル用コンフィギュレータ(cfg.exe)
・TOPPERS 新世代カーネル用コンフィギュレータ仕様書
・TOPPERS 新世代カーネル用コンフィギュレータ内蔵
マクロプロセッサ仕様書
目的・狙い
現在 TOPPERS カーネルで使用されている TOPPERS 新世代カーネル用コンフィギ
ュレータ(以後、現コンフィギュレータ)は、新規マイコンへのポーティングの際、独自言語であるマクロプロセッサ用言語(以後、tf)を使用する必要がある。また、現コンフィギュレータが使用する Boost ライブラリのバージョン等、環境に依存する問題も度々発生する。そこで、Ruby でコンフィギュレータを開発し、tf も Ruby で実装可能とすることで、これらの問題を解決できないかと考えた、Ruby 版 TOPPERSコンフィギュレータ(以後、新コンフィギュレータ)を試作した。

アイデア/アプリケーションの概要⚫ 現コンフィギュレータ仕様書をベースに、Ruby で新コンフィギュレータを開発する⚫ tf で実装していた処理を Ruby で書きなおす➢

通常の Ruby ファイルと区別するため拡張子を trb とする⚫ ASP カーネル及び TTSP を使用して、現コンフィギュレータとの互換性確認を行う⚫ 新コンフィギュレータのメリット、デメリットを考察する⚫ 現コンフィギュレータの trac に発行されているチケットが、新コンフィギュレータで解決可能か検討する

Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

1 現コンフィギュレータの問題点
1.1 独自言語
TOPPERS カーネル開発者(特に TOPPERS カーネルのポーティングを行う者)は、現コンフィギュレータが提供する tf を使用する必要がある。しかし、tf は TOPPERS の独自言語であり、初めて TOPPERS カーネルを開発、ポーティングする方は、まず tf を習得しなければならない。tf は、RTOS のコンフィギュレーションに特化した特殊な言語仕様であり、習得が容易とは言えず、デバッグ容易性も低い。また、独自言語がゆえ、テキストエディタによるソースコードの色分け等にもデフォルトで対応しておらず、可読性も低い。
1.2 開発言語
現コンフィギュレータは、C++で開発されており、Boost ライブラリを使用している。C++
コンパイラや Boost ライブラリのバージョンは、常にバージョンが上がっていくので、現コンフィギュレータの修正時、ビルドが正常に行えない問題が度々発生する(本資料作成時点で、現コンフィギュレータの trac にビルドに関連する 3 件のチケットが発行されている)。
また、実行モジュールも、Windows、MacOS、Linux など環境に合わせて用意する必要がある。
2 代替言語前章で述べた現コンフィギュレータの問題点を解決するには、現コンフィギュレータ及び tf の構造を抜本的に解決する必要があると考えた。
まず、多くの開発者が使用する tf は、可読性、実装容易性、習得容易性を重視する必要がある。これを実現するには、独自言語をやめ、一般的に使用されている言語を採用するのが妥当と考え、簡潔に処理を記述でき、可読性が高いことで定評がある Ruby を選定した。
Ruby は、日本発のプログラミング言語であり、世界的にも普及率が高いため、TOPPERSプロジェクトが採用する言語としても妥当である。なお、tf ファイル(tf で記述されたファイルを指す)相当のファイルを Ruby で実現したファイルの拡張子は、rb ではなく、trb とすることで明確に区別することにした。
Ruby は、実行中の Ruby ファイルから別の Ruby ファイルを呼び出して実行することができることから、コンフィギュレータ自体も Ruby で開発することにした。これにより、コンフィギュレータが解釈したコンフィギュレーション情報をそのままのデータで、trb ファイルに渡すことができる。また、Ruby は、実行時の引数オプション取得機能も豊富で、現コンフィギュレータの引数オプションを全くそのまま実現することができる。
Windows には Ruby の実行環境が標準で入っていないが、TOPPERS カーネルでは、make や perl などの GNU コマンドが揃っていることを前提とすることが多く、Ruby の実行環境を揃えることは困難ではない。インターネットから Ruby の実行環境を入手すること

1
Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

も容易である。
3 Ruby でのコンフィギュレータ実装
3.1 文字列＋数値
tf では、ユーザがシステムコンフィギュレーションファイル(以後、cfg ファイル)に記述した文字列と、その文字列をコンパイラを用いて評価した数値の 2 つのデータを 1 つの変数として保持する。これにより、出力するファイルには、ユーザが書いたままの文字列を使用し、エラーチェック等の演算処理では数値を使用する、といった使い方ができる。これはコンフィギュレータの機能として有用であるので、新コンフィギュレータでも同等の機能を実装した。具体的には、Ruby で標準的に用意されている文字列クラス(String クラス)を継承した StrVal クラスを用意し、数値データも保持するようにした。tf 同様、”+”や”-“などの演算子と組み合わせて使用した場合は、数値側で評価するように、String クラスの演算子をオーバーライドした。なお、明示的に数値を取り出したい場合、tf では”+”などの演算子を変数名に付加していたが、trb では、より明示的になるよう変数名に”.val”を付加することにした。
3.2 ファイル出力
tf は、テンプレートファイルの名前の通り、基本的には tf ファイルに書いた内容を、ファイルに出力する前提となっており、出力内容を演算結果によって変更したい箇所にのみ$で囲んだマクロ命令を記述する形式となっている。しかし、現状の tf ファイルは、演算処理の実装の方が多くなり、テンプレートファイルという形式を取るメリットは小さくなっている。そこで、新コンフィギュレータでは、テンプレートファイル形式ではなく、ファイル出力クラスを用意し、出力する文字列をインスタンスに追加していき、最後にファイル出力を行うメソッドを呼び出す形式とした。
なお、Ruby はヒアドキュメントを使用できるので、まとまった固定的な文字列は tf 同様に、そのまま記述することができる。tf のように改行($NL$)を明示的に記述する必要がないため、tf より可読性、実装容易性が高い。
3.3 syms ファイル、srec ファイル処理
Ruby には強力なテキスト処理クラス群が用意されているため、syms ファイルや srec フ
ァイルに対する処理は簡潔に実装することができた。syms ファイルは、シンボルをキー、アドレスを値とするハッシュに保持する。srec は、srec データ内のデータ列を 1 つの文字列で丸ごと保持するクラスを用意し、指定したアドレスとサイズのデータを返すメソッドを用意した。また、エンディアンと符号の有無も加えることで、指定したデータの値を返すメソッドを用意した。これらの実装により、SYMBOL、BCOPY、PEEK といった関数

2
Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

は数行で実現することができた。
3.4 値取得シンボルテーブル
値取得シンボルテーブルで指定された値は、trb 内でグローバル変数として扱えるようにした。Ruby のグローバル変数は先頭に”$”が付与されるので、tf で値取得シンボルテーブルの名称のまま使用していた処理に関しては、”$”を付与する必要がある。
3.5 trb に渡されるコンフィギュレーション情報
現コンフィギュレータでは、静的 API テーブルに記述された識別子をベースに、リスト形式でコンフィギュレーション情報が tf に渡される。新コンフィギュレータでは、静的 API
テーブルに記述された識別子をベースに、ハッシュ形式で trb へコンフィギュレーション情報を渡すことにした。これにより、インデックス管理が不要となり、直感的にコンフィギュレーション情報を把握することが可能となった。

cfg ファイル

ハッシュデータ(pp による表示)

静的 API テーブル

図 1 trb に渡されるハッシュデータの例(CRE_TSK)

3
Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

4 TTSP による現コンフィギュレータとの互換性確認
TTSP Release 1.1.2 を用いて、API テスト、SIL テストを実施し、全件パスすることを確認した。特に静的 API テストでは、tf から trb への変更ミス等を的確に検出でき、TTSPの有用性も確認できた。
また、新コンフィギュレータ開発において、現コンフィギュレータおよび ASP の tf ファ
イルにおける問題点をいくつか検出し、現コンフィギュレータのチケットを 3 件(#150～#152)、ASP カーネルのチケットを 2 件(#348、#349)を発行した。新コンフィギュレータ
では、これらの問題を解決済みである。
5 現コンフィギュレータとの比較
5.1 メリット
5.1.1 冗長コードの削減
全コンフィギュレーション情報が 1 つのハッシュで渡されるため、各オブジェクトに共通な処理をまとめることができる。

図 2 冗長コード削減の例(オブジェクト ID 定義)
5.1.2 break、continue(next)
tf では、ループ内で break や continue といった制御文が使用できず、別途変数を用意するなどして、同等の処理を実現しているが、Ruby ではこれらの制御文を使用できるので、

4
Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

処理を簡潔に記述でき、可読性も高い。

図 3 break の使用例(DEFINE_BIT 関数)

5.1.3 複数行コメントアウト
tf では、C 言語の/**/のように行単位でのコメントアウトができず、まとまった処理を一括してコメントアウトできない。Ruby では、=begin/=end によって、行単位のコメントアウトが可能であるので、デバッグ時に便利である。
5.1.4 カバレッジ取得
Ruby R1.9 系であれば、simplecov というライブラリを用いて容易にカバレッジを取得することができる。TTSP 実行時に、新コンフィギュレータ(cfg.rb)と、各 trb ファイルのカバレッジを測定したところ、テスト時に実行されていないコードが明確になった。現コンフィギュレータの trac でも tf のカバレッジ取得に対する要望のチケット(#27)が発行されている。

5Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

図 4 TTSP 実行時のカバレッジ取得結果
5.1.5 Ruby による実装
Ruby を用いて実装できることで、Ruby が提供する強力なテキスト処理を使用することができ、trb 側でクラスを定義することもできる。ASP カーネル用の各オブジェクト処理クラスを定義して、FMP カーネルや HRP2 カーネルでは、ASP カーネルのクラスを継承して実装する、といった開発も可能になる等、今後、より利便性を高めるための取り組みに対して、大きな可能性が提供される。また、Ruby に関する情報はインターネット上に豊富にあるため、trb ファイル開発工数の削減も期待できる。
なお、新コンフィギュレータの開発は約 5 人日、ASP カーネル内の tf ファイルを trb フ
ァイルに書き換えるのは約 1 人日で完了したことからも、Ruby による開発効率の高さが確認できた。無論、現コンフィギュレータと Ruby に関して一定の知識があることが前提であるが、現コンフィギュレータの対象 C++ソースコードが約 15,000 行であるのに対し、新コンフィギュレータの Ruby ソースコードは、1,500 行程度であることからも、開発規模は劇的に小さくなっている。
5.2 デメリット
5.2.1 JOINEACH
現コンフィギュレータには、構造体定義等を行う際に最後の要素だけ”,”を付けない、といったループ処理を行う JOINEACH という制御文がある。Ruby にはこの制御文が存在しないため、一旦","を付与して、最後に”,”を削除するメソッド(chop_comma)を用意することで対応した。tf では記述した文字列がそのままファイルに出力されるので、一旦記述したコ

6
Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

ードを取り消すことはできないが、trb では、ファイル出力クラスで保持しているデータを修正可能であるので、本対応が可能となる。

図 5 JOINEACH と chop_comma の例
5.2.2 変数を使った条件式判定
Ruby は真偽の判定に 1 と 0 を使用することはできない。つまり、1 か 0 が代入されている変数をそのまま if 文の条件式に使用することができないため、明示的に一致するべき値との等式を記述する必要がある(図 6 左)。一方で、Ruby では、未定義のグローバル変数を参照すると nil が返り、nil を数値と比較すると偽と判定されるため、ALT 関数による変数定義チェックはしなくてもよいことになる(図 6 右)。

図 6 変数による条件式の例

7Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

6 現コンフィギュレータ trac のチケット
本資料作成時点で、4 章で述べたチケットを除いて、16 件のチケットが発行されていた。
これらのチケットを分類し、新コンフィギュレータでの対応について検討する。
6.1 C++に依存する問題
Boost ライブラリの問題をはじめ、C++による開発に依存したチケットが 5 件である。これらは新コンフィギュレータを使用することで、すべて解決される。
※対象チケット：#135、#141、#146、#148、#149
6.2 Ruby であれば容易に解決可能な問題
Ruby であれば対応が容易なチケットが 3 件ある。#27 のカバレッジに関しては前述の通り、取得できることを確認済みである。#78 の GNU NM 以外のシンボルテーブル対応に関しても、Ruby によるシンボルテーブルパーサ部分を抜き出せば、ユーザが修正することが容易である。#119 の浮動小数点も、Ruby は標準でサポートしているので問題ない。文字列＋数値という形式で浮動小数点もサポートする場合、srec ファイルから読み込む処理が必要になるが、これも大きな問題ではない。
※対象チケット：#27、#78、#119
6.3 その他の問題
現コンフィギュレータ、新コンフィギュレータに関係なく対応が必要なもの、あるいは対応が容易なもの、仕様レベルで検討が必要なものが 8 件あった。いずれも新コンフィギ
ュレータで対応が困難であるものは存在しない。
※対象チケット：#4、#5、#9、#25、#117、#123、#128、#147
7 現コンフィギュレータとの共存
Ruby による新コンフィギュレータのメリットが大きいことは確認できたが、既存の tfファイルを trb ファイルに書き換えなければならない問題がある。また、TOPPERS カーネル開発者が、tf と trb を選択できるようにすることで、現コンフィギュレータとの振る舞いの違い等を確認し、新コンフィギュレータの評価を行えることも重要である。そこで、現コンフィギュレータと新コンフィギュレータを共存する方法について検討した。
結果、以下に挙げる 3 項目の修正のみで、対応可能であり、TTSP も configure スクリプ
トの引数に-R を与えるだけで、新コンフィギュレータによるテストが可能となった。

8Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

7.1 configure スクリプト
configure スクリプトには、”-R”オプションを新設し、このオプションを付与すると、cfg.exe ではなく、cfg.rb が Makefile の$(CFG)に設定されるようにする。

図 7 configure スクリプトの修正箇所
7.2 共通 Makefile
ベースとする Makefile には、$(CFG)の拡張子が”.rb”かどうかに応じて、テンプレー
トファイルの拡張子を trb か tf かに切り替える。また、tf 固定としていたテンプレートファイルの拡張子を環境変数$(TF_EXT)に置き換える。

図 8 共通 Makefile の修正箇所

9Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.

7.3 依存部 Makefile
アーキテクチャ依存部、ターゲット依存部の Makefile では、tf 固定としていたテンプレートファイルの拡張子を環境変数$(TF_EXT)に置き換える。

図 9 依存部 Makefile の修正箇所
8 今後の展望新コンフィギュレータの開発により、tf の利便性を損なうこと無く、Ruby 版のコンフィギュレータへ移行できることを確認できた。また、現コンフィギュレータと共存可能であることも確認できた。TOPPERS ソフトウェア開発者の中で、新コンフィギュレータに対するニーズがあれば、TOPPERS 運営委員の活動の一環として、新コンフィギュレータの開発を行いたいと考えている。必要に応じて、tf を trb へ変換するスクリプトの開発等も検討したい。
第 3 世代カーネルである ASP3 カーネルから、現コンフィギュレータと新コンフィギュレータを共存し、開発者が tf と trb を選択できる運用として頂けると幸いである。今後、
FMP3 カーネル、HRP3 カーネル開発の際にはそれぞれのカーネルにも対応していきたい。
以上

10
Copyright ©2015 FUJI SOFT INCORPORATED, All rights reserved.