先日の B-Free のミーティングに出た BTRON のマネージャの
main.c についてです。
ディレクトリについては、ミーティングの時に決めたように
次のようにしたいと思います。
btron-pc/kernel/BTRON/manager ---- main.c,manager.h
|
-- FM
|
-- PM
|
-- MM
ここで、manager.h はマネージャが受けとりメッセージの形式を
定義するファイルです。
メッセージの形式については、今のところ各機能がどのような
情報が必要なのか明確に決まっていないので、データの中身に
ついては決めません。情報として必須であろうと思われるヘッダ
部分のみ決めています。
メッセージの形式 ------------------------------------------
/* メッセージに入る各機能(PM や MM など)が
* 自由に使えるデータのサイズ
* メッセージの最後に入る領域。
*/
#define MAX_PRIVATE_SIZE 1024
/*
* マネージャが受けとるメッセージ形式
*/
struct manager_request
{
UW command; /* コマンド */
B data[MAX_PRIVATE_SIZE];
};
/*
* マネージャが返すメッセージの形式
*/
struct manager_response
{
UW result; /* 結果 */
B data[MAX_PRIVATE_SIZE];
};
struct manager_message
{
ID caller_port; /* メッセージの返答用のポート */
ID caller_task; /* メッセージの送り手の task ID */
W length; /* メッセージの最大サイズ */
union
{
struct manager_request request;
struct manager_response response;
} body;
};
typedef struct manager_message MANAGER_MSG;
------------------------------------------------------------
main.c の中身は次のようになります。
ミーティングでは、メッセージの種類ごとに switch 文で振り分けて
各機能の関数に飛ぶようにしようという話になっていましたが、
ここでは、メッセージの ID から各機能単位に振り分けています。
メッセージは各機能ごとに更に振り分けられます。
main.c --------------------------------------------------------
/*
* BTRON マネージャの main 関数
*
*/
void
main (void)
{
/* メッセージポートの登録
*/
recvport = get_port (sizeof (MANAGER_MSG), sizeof (MANAGER_MSG));
if (recvport <= 0)
{
dbg_printf ("manager: cannot make receive port.\n");
slp_tsk ();
/* メッセージバッファ生成に失敗 */
}
error = regist_port (MANAGER, recvport);
if (error != E_OK)
{
dbg_printf ("manager: cannot regist port (error = %d)\n", error);
}
/* マネージャの初期化
*
* ファイル管理部分
* メモリ管理部分
* プロセス管理部分
*
*/
fm_init ();
pm_init ();
mm_init ();
/* メッセージ取り出し - 処理ループ
*/
for (;;)
{
W rsize;
/* 要求の受信 */
rsize = sizeof (req);
get_req (recvport, &req, &rsize);
switch (sys_errno)
{
case E_OK:
/* 正常ケース */
doit (&req);
break;
default:
/* Unknown error */
dbg_printf ("CONSOLE: get_req() Unknown error(error = %d)\n", err);
break;
}
}
/* NOT REACHED */
}
/* doit --- 各機能別のモジュールへ処理を分岐する
*
*/
static void
doit (MANAGER_MSG *request)
{
switch ((request->req.cmd) & 0xff00)
{
case PM_MASK: /* PM_MSK == 0x0100 */
pm_receive (request);
break;
case FM_MASK: /* FM_MSK == 0x0100 */
pm_receive (request);
break;
case MM_MASK: /* MM_MSK == 0x0100 */
pm_receive (request);
break;
default: /* 理解できないメッセージを受けとった */
unknown_error (request);
break;
}
}
-----------------------------------------------------------------
--- B-Free プロジェクト実行中! 詳細はこの Web ページへ (http://www.b-free.orient.co.jp/)内藤隆一 (ggc00661@niftyserve.or.jp/night@bfree.rim.or.jp)