■ PBPのリエントラント(再入可能)について
PBPやmikroCではリエントラントでないプログラムは作成することができません。C#やC++などの言語では場合によってデリゲートやinvokeを使うことで、あるスレッドから、別の確約されないスレッドの実行を委譲できますが、PBPやmikorCではその機能はないため、リエントラントではないプログラムは実行できません。
代表的な例では、PBPの場合割込ルーチンからサブルーチンを呼び出す場合があります。割込では、いつ呼び出されるかがプログラム上では、分からずその呼び出しタイミングや、渡される変数等の内容が確約されないので、割込発生中に、別のサブルーチンに飛ぶことを許容すると、サブルーチン実行中に再度割込が発生した場合、固定された特定のメモリ領域(変数や配列)やI/Oピンを使用するような設計がなされていると、同時に実行要求が発生したときにレジスタの構造を破壊してしまうなど、正しく動作しないことがあります。
サブルーチンからサブルーチンを呼び出すことは、サブルーチン実行元が確約されているため、リエントラントですが、割込の場合にはいつ発生するかわからないため、割込先から更にサブルーチンを呼び出すことはリエントラントではありません。
PBPではリエントラントでないプログラムを記述するとその動作が保証されませんので、ご注意ください。
※割込ルーチン内からのサブルーチンの呼び出しはできないとことを意味します。例えば割込処理である変数global_varに値を代入したとします。その処理の後、サブルーチンに飛んでglobal_varに変更を加えている最中に再度割込が発生した場合、再度global_varの値は書き換えられる可能性があります。またGosubのスタックが不正になります。(Gosub後のRESUMEで戻る場所が確約されない。)
※リエントラントについての詳細は"Google"等で"リエントラント"のキーワードで検索できます。
|