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

Trigger : 要求フラグ = 実行したいときにONにしてください(立上りで要求を認識)
Run : 実行フラグ = 排他制御後に実行できるタイミングでONになります(このフラグを使って処理を開始してください)
Fin : 完了フラグ = 処理が完了したらONにしてください (ONするまで他のRunフラグはONになりません)

そのまま使えるので特に変更するところはありません
優先順位が高い処理は大きい処理番号へ割り振るようにします
- 開始したい処理番号のTriggerをONにします
- 排他制御後に実行できる処理番号のRunがONになるのでこのフラグを使って処理を実行します
- 処理が終わったらFinをONにします
FinをONにするとRunはOFFになります
TriggerをONしてから処理を完了する前に(RunがONでもOFFでも)FinをONにするとキャンセルされて次に待っているRunがONになります
排他処理後のRunがONするタイミング
- 4つの排他制御の例
-
- Trigger[0]と[3]が同時にONします
- Trigger[3]のほうが優先順位が高いのでRun[3]がONします
- Run[3]の処理完了Fin[3]のONで待っていたRun[0]がONします
- Run[0]の処理中にTrigger[2]がONとなりますがRun[0]の処理中なので待ち状態になります
- Run[0]の処理完了Fin[0]のONで待っていたRun[2]がONします
- このようにRunフラグは順番にひとつだけがONするように排他制御が行われます