• 締切済み

タイマーをつかったリアルタイム性の実現

組込みソフトウェアにおける、タイマーを使ったリアルタイム性を実現したソースコードとはどのような感じになるのでしょうか?サンプルコードなどあれば載せていただきたいです。できればjavaで記述されたものだと自分も理解しやすいです。おねがいします。

みんなの回答

回答No.1

タイマーで行う場合は、以下のようにします。 ・「状態を保存しておくメモリ」を「1つ前の状態」と「最新の状態」の2つ用意します。 ・初期化ルーチンで、初期化時のハードウェアの状態を取り込んで、2つとも「今の最新の状態」にします。 ・タイマーで起動されたイベントプロシージャで「最新の状態メモリ」を「1つ前の状態メモリ」にコピーしてから「最新の状態メモリ」に、今のハードウェアの状態を取り込みます。 ・次に「最新の状態メモリ」と「1つ前の状態メモリ」を比較していって、違いがあったら(変化があったら)、違う部分をディスプレイ機器に出力します。 ただし、この方法では「タイマー間隔より短いワンショットトリガを検知出来ない」ので、普通は、こういう書き方はしません。 例えば、次のタイマーイベントが来る前に「0⇒1、1⇒0」と言う連続した変化があると、結果的に「前回は0、今回も0」になって、変化したのを検知出来ません。 だたし「一定の長さより短い状態変化はノイズとして無視する必要がある」って場合は「タイマー間隔より短い変化は検知できない」ってのを利用して、上記のようにタイマーで処理します。 リアルタイム性を重視して、タイマーで処理しない場合は、以下のようにします。 ・「状態を保存しておくメモリ」を「1つ前の状態」と「最新の状態」の2つ用意します。 ・初期化ルーチンで、初期化時のハードウェアの状態を取り込んで、2つとも「今の最新の状態」にします。 ・次に「ハードウェアに変化があったら割り込みが入る」ように割り込みを設定します。 ・割り込みで起動されたイベントプロシージャで「最新の状態メモリ」を「1つ前の状態メモリ」にコピーしてから「最新の状態メモリ」に、今のハードウェアの状態を取り込みます。 ・次に「最新の状態メモリ」と「1つ前の状態メモリ」を比較していって、違いがあったら(変化があったら)、違う部分をディスプレイ機器に出力します。 この方法では「ハードウェアが変化して割り込みが来たら、最新のハードウェアの状態を取り込む」ので「割り込み発生から状態取り込みまでの非常に短い間」だけが「盲点」になるので、それより長いワンショットトリガを見落とす事はありません。 通常、組み込みソフトウェアでタイマーを使うのは「ウォッチドックタイマー」のみで、たいていは割り込みで処理します。 ウォッチドックタイマーは「正常にプログラムが動作している場合には、一定期間内に必ず通る場所」で「タイマーの初期化」をして、正常時にはタイマー割り込みが来ないようにします。 タイマー割り込みが来た場合は「プログラムがどこかでハングアップしている」などで異常な状態なので、ソフトウェアを再起動(リセット)します。

すると、全ての回答が全文表示されます。

関連するQ&A