第 2 章 ITRON仕様共通規定 23
2.1.10 システムコンフィギュレーションファイル
カーネルやソフトウェア部品の構成やオブジェクトの初期状態を定義するた めのファイルを,システムコンフィギュレーションファイルと呼ぶ.システム コンフィギュレーションファイルには,カーネルやソフトウェア部品の静的 APIと ITRON仕様共通静的 API(以下,単に共通静的 APIと呼ぶ)に加えて, C 言語処理系のプリプロセッサディレクティブを記述することができる.システ ムコンフィギュレーションファイル中の静的 APIを解釈して,カーネルやソフ トウェア部品を構成するためのツールを,コンフィギュレータと呼ぶ.
システムコンフィギュレーションファイルの処理手順は次の通りである(図 2-1).システムコンフィギュレーションファイルは,まず, C言語のプリプロ セッサに通される.次にソフトウェア部品のコンフィギュレータによって順に 処理され,最後にカーネルのコンフィギュレータによって処理される.
ソフトウェア部品のコンフィギュレータは,渡されたファイル中に含まれる自
分自身に対する静的 APIと共通静的 APIを解釈し,自分自身の構成や初期化に 必要なファイルを C言語のソースファイルの形で, ID自動割付け結果ヘッダ ファイルを C言語のヘッダファイルの形で生成する.また,渡されたファイル から自分自身に対する静的 APIを取り除き,以降のコンフィギュレータに対す る静的 APIを追加し(必要な場合のみ),次のコンフィギュレータに渡す.
カーネルのコンフィギュレータは,渡されたファイル中のすべての静的 APIを 解釈し,自分自身の構成や初期化に必要なファイルを C言語のソースファイル の形で, ID自動割付け結果ヘッダファイルを C言語のヘッダファイルの形で生 成する.自分自身に対する静的 APIまたは共通静的 APIとして解釈できない記 述が含まれている場合には,エラーを報告する.
カーネルおよびソフトウェア部品のコンフィギュレータは, “#”で始まる行を 無視する.ソフトウェア部品のコンフィギュレータは, “#”で始まる行を,そ のまま次のコンフィギュレータに渡す.
【補足説明】
ソフトウェア部品のコンフィギュレータが,以降のコンフィギュレータに対す 図 2-1. システムコンフィギュレーションファイルの処理手順
C言語プリプロセッサ system.cfg システムコンフィギュ
レーションファイル
ソフトウェア部品の コンフィギュレータ
カーネルの コンフィギュレータ
www_id.h ID自動割付け結果
ヘッダファイル www_cfg.c ソフトウェア部品 構成・初期化ファイル
kernel_cfg.c カーネル
構成・初期化ファイル kernel_id.h ID自動割付け結果
ヘッダファイル
※ 図中のファイル名は例である.
る静的 APIを追加する場合には,追加する静的 APIのパラメータ中に,システ ムコンフィギュレーションファイルまたはそこからプリプロセッサディレク ティブ( “#include”)を用いてインクルードされるファイル中で定義されたプ リプロセッサマクロを用いてはならない.これは,それらのプリプロセッサマ クロは,最初に C言語プリプロセッサに通された時点で展開されるためである.
システムコンフィギュレーションファイルの処理手順を,図 2-2 の例を用いて 説明する.なお,ID 番号の自動割付けについては2.1.11節を,共通静的 APIに ついては2.3.4節を,それぞれ参照すること.
図 2-2. システムコンフィギュレーションファイルの処理例 tcpip_cfg.c
#include <itron.h>
TCP受付口の初期化情報 system.cfg
#include "rep_id.h"
INCLUDE("<itron.h>");
TCP_CRE_REP(REP_HTTP, { ....
CRE_TSK(TSK_A, { TA_HLNG, ..
CRE_SEM(SEM_A, { TA_TPRI, ..
C言語プリプロセッサ
TCP/IPプロトコルスタックの コンフィギュレータ
カーネルの コンフィギュレータ
rep_id.h
#define REP_HTTP 1
INCLUDE("<itron.h>");
TCP_CRE_REP(1, { ...
CRE_TSK(TSK_A, { TA_HLNG, ..
CRE_SEM(SEM_A, { TA_TPRI, ..
INCLUDE("<itron.h>");
CRE_TSK(TSK_TCPIP, { ...
CRE_MBX(MBX_REP_HTTP, ...
CRE_TSK(TSK_A, { TA_HLNG, ..
CRE_SEM(SEM_A, { TA_TPRI, ..
kernel_id.h
#define TSK_TCPIP 1
#define MBX_REP_HTTP 1
#define TSK_A 2
#define SEM_A 1
kernel_cfg.c
#include <itron.h>
タスク,セマフォ,メール ボックスの初期化情報
最初に,システムコンフィギュレーションファイルがC言語のプリプロセッサ に通されると,プリプロセッサディレクティブ( “#include”)によるインクー ルード処理が行われ,プリプロセッサマクロ(この例では, REP_HTTP)が展 開される.
次に,ソフトウェア部品の一つである TCP/IP プロトコルスタックのコンフィ ギュレータは,渡されたファイル中に含まれる自分自身に対する静的API(こ の例では, TCP_CRE_REP)と共通静的 API( INCLUDE)を解釈し,TCP/IP プロトコルスタックの構成や初期化に必要なファイル tcpip_cfg.cを生成する.
ここで,tcpip_cfg.cの中の #includeは,共通静的APIの INCLUDEから生成し たものである.この例では,解釈された静的APIに ID番号自動割付けの対象と なる識別子が含まれていないため,ID番号自動割付け結果ファイルは生成しな い(空のID 番号自動割付け結果ファイルを生成してもよい).また,TCP/IPプ ロトコルスタックのコンフィギュレータは,自分自身の構成に必要なカーネル の静的API(この例では, TSK_TCPIPに対する CRE_TSKと MBX_REP_HTTP
に対する CRE_MBX)を追加し,カーネルのコンフィギュレータに渡す.
最後にカーネルのコンフィギュレータは,渡されたファイル中に含まれるすべ ての静的 A P I を解釈し,カ ーネルの構 成や初期化 に必要なフ ァイル kernel_cfg.cを生成する.ここで, kernel_cfg.cの中の #includeは,共通静的 APIの INCLUDEから生成したものである.また,静的 APIに含まれる ID番号 自動割付けの対象となる識別子(この例では,TSK_TCPIP,MBX_REP_HTTP, TSK_A, SEM_A)に整数値を割り付け,その結果を ID番号自動割付け結果ファ イル kernel_id.hとして生成する.
【仕様決定の理由】
システムコンフィギュレーションファイルの処理手順を標準化したのは,カー ネルとソフトウェア部品が独立に開発された場合に対応するためである.
システムコンフィギュレーションファイルを最初に C言語プリプロセッサに通 すのは,次のようなことが可能になるためである.
• プリプロセッサのインクルードディレクティブを用いて,システムコンフィ ギュレーションファイルを複数のファイルに分割することができる.例え ば,ソフトウェア部品を組み込む場合に,それに必要な静的 APIを独立した ファイルに記述しておき,そのファイルをシステムコンフィギュレーション ファイルからインクルードするといった使い方が考えられる.
• オブジェクトの ID番号やオブジェクト番号を,直接整数値で記述する代わ りに,整数値に展開されるプリプロセッサマクロを用いて記述することがで きる.
• システムコンフィギュレーションファイル中にプリプロセッサの条件ディ レクティブ( “#ifdef”など)を記述して,カーネルやソフトウェア部品の構 成やオブジェクトの初期状態を条件によって変えることができる.
コンフィギュレータに “#”で始まる行を無視させるのは,プリプロセッサが ソースファイルなどに関する情報(そのような情報は, “#”で始まる行として
生成されるのが一般的である)を生成する場合に対応するためである. “#”で 始まる行を読み込み,エラーメッセージなどの生成に利用することは許され る.