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