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