[H8-ML(4745)] Re: if文の書き方
From: Shigeru Makino <mac@xxxxxxxxxxxxxx>
Date: 2004年05月10日(月)21時53分02秒
macです。

"ike" さん<ike@xxxxxxxxxxxxxxxxxxx> wrote:

> 考え方として、いろいろあると思いますよ。
> 仕様書の記載順
> 異常処理優先か、正常処理優先か?
> デバックの容易さ優先か?
> 処理速度優先か?
> などかな。

もうひとつ、別の「適した言語を使う」
というのもありですね。

組み込み機器は、できるだけ少ないボタンで、
たくさんの機能を操作出来るようにと、
設定モードの時にはこのキーはxxと機能し、
通常モードの時は同じキーが○○と機能する…
という局面が大抵出てきます。

力任せに、if文や、switch文を書き連ねると、
結局「誰にも読めないプログラム」になってしまいますね。

yacc, lexなどを利用できないか試みたのですが、
ばかでかいオブジェクトを生成するので没になりました。

でも、もっと見通しのよい言語を使う気持ちが残っていて、
あるひ、kermitのsource code を読んでみたら、
wartという言語で状態別の対応を記述していました。

これを参考に、自分で言語を作ることにしました。

<INIT, NORMAL,INFO,INFO1>[K_YES] {
    LcdOut(WORD(MsgBuf[(uint16_t) UsrSem.WhichItem].inst));
    BEGIN(MEAS1);
}

<INIT,NORMAL>[K_DOWN] {
    LcdOut(WORD(MsgBuf[(uint16_t) UsrSem.WhichItem].inst));
    BEGIN(INFO);
}

<INIT,NORMAL>[K_UP] {
    LcdOut(WORD(msg_inst4));
    BEGIN(INFO4);
}

<MEAS1>[K_YES] {
    Measure();
    rec_f = 1;
    meadbeep();
    BEGIN(NORMAL);
}

<NORMAL, INIT>[K_NO] {
    LcdOut(WORD(msg_no));

    if (IsPushKey(PUSH_TIME, K_NO)) {
        PowerOff();
    }
    else {
        DispInit();
        if (UsrSem.SampNum <= 0) {
            BEGIN(INIT);
        }
    }
}

のように、
<状態> [押されたキー] {
	処理をCで記述
}
と記述し、状態、押されたキーとも複数記述できます。
BEGIN(状態);
は予約語で、別の状態に遷移する時使います。

Cのソースを吐き出しますが、
#line ソースの行
を入れてあるので原始コードのバグ位置がわかります。

社内用というか、自分用に作ったので、
ドキュメントも、チュートリアルもないのですが、
使ってみたい方はいらっしゃいますでしょうか?

暇を見つけてドキュメントを揃えようかと思いつつ、
10年以上経っているので、あまり期待しない方が…

-- mac
スレッド概略
[4730(R)](起点)
 └[4744(U)]
   └[表示中]
     └[4748(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]