排他制御

排他制御とは

複数同時にできない処理が重ならないように実行中の処理が終わるのを待ってから実行する制御を排他制御といいます
たとえば、メモリカードのファイルに書き込みする[処理A]と[処理B]があるとして、[処理A]を実行しているときに[処理B]を実行することになったときは[処理A]の処理が終わるのを待ってから[処理B]を実行する制御方法です

サンプルプログラムの使い方

共用体
共用体はプログラム内で使用するので必ず作成してください
共用体

グローバル変数
64個の処理を排他制御するように64個の要求フラグ、実行フラグ、完了フラグを作成します
Trigger : 要求フラグ = 実行したいときにONにしてください(立上りで要求を認識)
Run : 実行フラグ = 排他制御後に実行できるタイミングでONになります(このフラグを使って処理を開始してください)
Fin : 完了フラグ = 処理が完了したらONにしてください (ONするまで他のRunフラグはONになりません)
共用体

プログラム
サンプルのプログラムSampleExlusiveControlをプログラムごとコピーして使いたいプロジェクトに貼り付けます
そのまま使えるので特に変更するところはありません

準備
排他制御したい複数の処理をそれぞれ0~63番の処理番号に被らないように割り振ります
優先順位が高い処理は大きい処理番号へ割り振るようにします

排他処理の手順
  1. 開始したい処理番号のTriggerをONにします
  2. 排他制御後に実行できる処理番号のRunがONになるのでこのフラグを使って処理を実行します
  3. 処理が終わったらFinをONにします
RunがONで処理を実行するようにします
FinをONにするとRunはOFFになります
TriggerをONしてから処理を完了する前に(RunがONでもOFFでも)FinをONにするとキャンセルされて次に待っているRunがONになります

排他処理後のRunがONするタイミング

4つの排他制御の例
ExlusiveChart
  1. Trigger[0]と[3]が同時にONします
  2. Trigger[3]のほうが優先順位が高いのでRun[3]がONします
  3. Run[3]の処理完了Fin[3]のONで待っていたRun[0]がONします
  4. Run[0]の処理中にTrigger[2]がONとなりますがRun[0]の処理中なので待ち状態になります
  5. Run[0]の処理完了Fin[0]のONで待っていたRun[2]がONします
このようにRunフラグは順番にひとつだけがONするように排他制御が行われます

ダウンロード

SampleExlusiveControl.csm2