第 2章 ITRON 仕様共通規定 21
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として解釈できない記 述が含まれている場合には,エラーを報告する.
カーネルおよびソフトウェア部品のコンフィギュレータは,“#”で始まる行を 無視する.ソフトウェア部品のコンフィギュレータは,“#”で始まる行を,そ のまま次のコンフィギュレータに渡す.
【補足説明】
ソフトウェア部品のコンフィギュレータが,以降のコンフィギュレータに対す る静的APIを追加する場合には,追加する静的APIのパラメータ中に,システ
図2-1. システムコンフィギュレーションファイルの処理手順
C言語プリプロセッサ system.cfg システムコンフィギュ
レーションファイル
ソフトウェア部品の コンフィギュレータ
カーネルの コンフィギュレータ
www_id.h ID自動割付け結果
ヘッダファイル www_cfg.c ソフトウェア部品 構成・初期化ファイル
kernel_cfg.c カーネル
構成・初期化ファイル kernel_id.h ID自動割付け結果
ヘッダファイル
※ 図中のファイル名は例である.
ムコンフィギュレーションファイルまたはそこからプリプロセッサディレク ティブ(“#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)を追加し,カーネルのコンフィギュレータに渡す.
最後にカーネルのコンフィギュレータは,渡されたファイル中に含まれるすべ ての静的 API を解釈し,カーネルの構成や初期化に必要なファイル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”など)を記述して,カーネルやソフトウェア部品の構 成やオブジェクトの初期状態を条件によって変えることができる.
コンフィギュレータに“#”で始まる行を無視させるのは,プリプロセッサが ソースファイルなどに関する情報(そのような情報は,“#”で始まる行として
生成されるのが一般的である)を生成する場合に対応するためである.“#”で 始まる行を読み込み,エラーメッセージなどの生成に利用することは許され る.