(toppers-users 1555) Re: タスクの二重起動防止

ktakahashi @ vesta.ocn.ne.jp ktakahashi @ vesta.ocn.ne.jp
2004年 7月 22日 (木) 15:39:00 JST


こんにちは、アライブビジョンソフトウエアの高橋と申します。

向学のために一連のスレッドを読ませていただいて
ましたが、やっと要求事項が見えてきたかなと思っています。


> これだと,たぶん dly_tsk(10)のところで,自分より優先度
> の低い他のタスクが実行されてしまうようです。(この場合,
> 本当は実行して欲しくない)
> 
> tslp_tsk(10)なら他のタスクが実行されるのは分かるのです
> が, dly_tsk()でも仕方ないのでしょうか?自タスクを待ち
> 状態に移行させることなく時間を稼ぐには,皆様どんな風に
> されていらっしゃいますか?


私なら以下のように組立を考えます。

周期ハンドラルーチンで、10msecに1回呼び出しをする
緊急SW用ハンドラを定義します。

そのハンドラは、
現在のボタンの状態の保持する変数、
どれだけの時間ボタンの状態が変わっていないかの変数、
その他カウンタ、
および以下の状態を持つ状態変数を
持つようにします。
phase00 標準状態 ボタン押されていない。緊急処理中でもない。
phase01 ボタンが押された。 緊急処理呼び出し済み 一定時間待ち
phase02 一定時間経過済み、ボタンOFF待ち

phase01に遷移する時に、故障リセット処理を呼び出します。
呼び出し方はいろいろあり、好き嫌いもあるかもしれませんが、
故障リセットタスクは、バイナリーセマフォー待ちのタスクとして
おいて、バイナリーセマフォーをセットするものにします。
phase01では、一定時間連続して故障リセット処理が呼び出されない
ように1秒程度待ちます。これは単にカウンタが100になるのを待つ
処理です。
カウンタが100回カウントした場合に、それまで、ボタンが押し続けられて
いた場合は、ボタンがOFFになるのを待ちます。
OFFになったら、phase00になります。これの繰り返しになります。
さらに故障リセット処理の処理に時間がかかるような場合は、外部変数にて
処理済みフラグにて確認できるといいでしょう。

もっとも、ボタンに関して、押されていきなり故障リセット処理よりも、
一定時間連続して押されてからか、一定時間押されてから立ち下がりで
動作するような仕様にすることを検討したいところですが。

---
アライブビジョンソフトウエア株式会社
高橋和浩
650-0045 神戸市中央区港島9-1
神戸インキュベーションオフィス117号室
Email:ktakahashi @ vesta.ocn.ne.jp
http://homepage3.nifty.com/ALVS/