利用者に直接接している処理がフォアグラウンド処理、その裏で利用者と直接接しておらずに動いている処理がバックグラウンド処理です。リアルタイム制御ではここを明確にして設計することが求められます。
◀ この記事の前に: リアルタイム制御の時間感覚
▶ この記事の次に: バックグラウンド処理で行う処理
お願い・見解の相違がある場合があります
冒頭に「利用者に直接接している処理がフォアグラウンド処理、その裏で利用者と直接接しておらずに動いている処理がバックグラウンド処理」と書きましたが、では具体的に何がフォアグラウンド処理で、何がバックグラウンド処理については見解が分かれる場合があります。ここでは Qumcum Lab.に限ってのフォアグラウンド処理と、バックグラウンド処理として書きます。あらかじめご了承くださいますようお願いします。
スマートフォンやPCの場合
スマートフォンでソーシャルメディア( LINEなどのSNS )を操作する場合や、PCで Excelなどで計算をする場合に優先して処理するものは利用者とのやりとりです。プリンタの印刷は一度指示をするとあとは自動的に印刷を進めてくれます。スマートフォンやPCなどの場合、前者をフォアグラウンド処理、後者をバックグラウンド処理と言うことが多いと思います。比較すると以下のとおりです。
項 目 | フォアグラウンド処理 | バックグラウンド処理 |
---|---|---|
ユーザー操作 | ユーザーが直接操作し、結果を確認できる | ユーザー操作なしでシステムが裏で処理する |
優先度 | 高い | 低い |
リアルタイム性 | 必要 | 低い |
例 | アプリの操作、ゲームプレイ | データ同期、ログ記録 |
フォアグラウンド処理とバックグラウンド処理の特徴は、優先度はフォアグラウンド処理がバックグラウンド処理より高くなっています。リアルタイム性はフォアグラウンド処理で必要とされ、バックグラウンド処理ではフォアグラウンドよりも低いことが多いと思います。
フォアグラウンド処理とバックグラウンド処理をどう捉えるか。ここでは言葉から考えます。フォアグラウンド( foreground )の意味は最前面や前景です。バックグラウンド( background )の意味は後景や背後です。利用者が試用するスマートフォンやPCなどは、利用者に接している部分がフォアグラウンドで、裏方の部分がバックグラウンドということになります。これは前項の例を見ても理解できます。
ヒューマノイドの場合
ヒューマノイドは人間の形や特徴に似せて設計・作成したロボットです。Human(人間)という単語に「~oid(というようなもの)」という接尾語を付けた単語です。
人にとって、フォアグラウンドとは何か、バックグラウンドとは何かを考えます。人と話したり食事をしたり随意的な活動がフォアグラウンド、呼吸をしたり心臓を動かしたり自律的な活動がバックグラウンドだと思います。こう考えると前項の表の特徴と異なります。
人の場合、呼吸したり心臓を動かしたり自律的な活動は、生命の維持にとって必要不可欠であり優先度やリアルタイム性は高い必要があります。もちろん、食事をしたり人と話すことも大切ですが、呼吸などと比較するといかがでしょうか。このように考えると人の場合のフォアグラウンド処理とバックグラウンド処理に求められるものは、前項の表の特徴と異なります。
ヒューマノイドの場合は以下のとおりです。
項 目 | フォアグラウンド処理 | バックグラウンド処理 |
---|---|---|
周囲との関係 | 周囲と直接関係しない | 周囲の状況に関係する |
優先度 | 低い | 高い |
リアルタイム性 | なるべく早く | 必要 |
動 作 | 随意的 | 自律的 |
時 間 | 数 100 ms ~ 数 s | 数10 ns ~ |
同期性 | 非同期 | 同期 |
例 | リモコン操作、発音発声、表示 | 電源電圧検出、測距、サーボモータ制御 |
Qumcum Lab. はヒューマノイドです。
ここでのフォアグラウンド処理とバックグラウンド処理は、その言葉から周囲との関係性で決めました。
本質的には周囲からの働きかけにより応答する随意的な処理をフォアグラウンド処理として、リアルタイム性が強く求められるロボット内部の自律的な処理をバックグラウンドとします。
バックグラウンド処理
リアルタイム性が強く求められるロボット内部の自律的な処理です。
電源電圧(電池容量)の検出や、測距など、定期的に周囲の状況を検知する必要性がある場合や、サーボモータ制御のように正確なタイミングで制御を必要とする処理がバックグラウンド処理になります。
フォアグラウンド処理
ロボットとその周囲とのやりとりを中心とした随意的な処理です。
リモコン操作を受け取って動作をする場合や、その反応として発音発声や表示で外部に情報を伝える場合が当てはまります。もちろん、早い反応が求められますがサーボモータ制御のように、常に数 ms単位での制御が必須な処理ではありません。
時間との関係
バックグラウンド処理は常に時間を意識したリアルタイム制御です。
それをプログラムで実現するために、MCUのタイマ割り込みを使用します。MCUに組み込まれているタイマを使用することによりプログラムの負荷を減らすことができ、正確な時間を管理することができます。Qumcum Lab.では複数のタイマを使用して時間の管理を行っています。
フォアグラウンド処理とバックグラウンド処理の連携
フォアグラウンド処理とバックグラウンド処理は以下の機能で連携します。
- 割り込み: タイマ割り込みによる処理の遷移( 処理が切り替わること )
- 変 数: 処理(関数)間で変数を共有して、状態を相互に伝える
- 関数の呼び出し: 処理の開始など動作のきっかけを作る
注意が必要
フォアグラウンド処理とバックグラウンド処理を連携するときに注意が必要です。
フォアグラウンド処理とバックグラウンド処理には異なる時間が流れています。フォアグラウンド処理の開始は、リモコン操作のように外部からの働きかけが多くなります。外部の状況に依存しますので非同期と言えます。バックグラウンド処理はおもにタイミングで処理を開始します。タイマ割り込みにより動作タイミングを管理しますので同期とも言えます。フォアグラウンド処理とバックグラウンド処理は時間軸が異なります。
時間軸が異なるとお互いに不意な処理で影響を与えたり、変数(状態)に矛盾を生じることがあります。
例えば、フォアグラウンド処理を行っているときにタイマ割り込みが発生すると、フォアグラウンド処理が中断されてタイマ割り込み処理に処理が移ります。この時、フォアグラウンド処理が遅れるのと同時に、フォアグラウンド処理で使用していた変数が割り込み処理(バックグラウンド処理)により変わる場合があります。バックグラウンド処理が終了してフォアグラウンドに処理が戻ったときに、フォアグラウンド処理で使用していた変数が変わっていると、フォアグラウンド処理中で無断で変数が変わったことにより問題を生じる場合があります。
注意することは以下のとおりです。
- 割り込み禁止期間の設定:
リアルタイム制御では時間を重視しますが、割り込みを禁止すべき期間があります。割り込み処理の初期化や、割り込み発生時の変数の確保時などです。 - 共用する変数の保証:
処理などの状態を保存している変数など、フォアグラウンド処理とバックグラウンド処理で共用している変数は、同じ機能のフォアグラウンド処理中にバックグラウンド処理が入ると変わってしまうことがあります。このような状況になっても変数や処理に矛盾が生じないしくみにしておくことが必要です。 - バックグラウンド処理時間:
タイマ割り込み処理が長時間になると、次のタイマ割り込みが発生します。これを二重割り込みと言います。割り込み処理は二重割り込みにならないように処理時間を短くする必要があります。また、バックグラウンド処理の時間が長くなるとフォアグラウンド処理に回せる時間が少なくなります。バックグラウンド処理の時間は処理の分散化や MCUリソースの活用によりできるだけ短くすることが必要です。 - アイドル命令の使用禁止:
delay 命令などコード中に一定時間待つ命令を使用することを避けます。delay 命令は処理を停止することでありその間は何もしない(できない)時間となります。待ち時間は delay 命令を使用しないで、タイマ割り込みや MCUリソースを使用して管理することが望まれます。
しかし、全く delay 命令が良くないということではありません。周辺回路を微小な時間で制御( 出力を変化させる )場合は delay 命令が望ましい場合があります。他の方法( 割り込みでの時間制御 )ではオーバーヘッドが大きくなるからです。この判断は状況によりますので個々の状況で検討して決めることが望ましいです。
参考情報
参考になる情報は以下のとおりです。
このホームページ内
- 複数のMCUをつなぐ: このロボットには複数の MCUが搭載されています。その MCU間の接続の概要です。
他のWebサイト
- SN74LVC1G3157 SPDT アナログスイッチ Datasheet