SHでC言語で作る場合の割り込み禁止は、set_imask関数 です。最近の他ルネサスマイコンでの _EI( )、_DI( ) のように気軽に呼出してよいのでしょうか? アセンブラならシステムレジスタの 割込マスクBit 3つを立てるだけなので、一行で済むはずですが、、、
set_imask() のアセンブラ展開は、
むろん set_imask() はライブラリではなく、直接アセンブラにインライン展開されています。SHは、システムレジスタを直接更新しないポリシーみたいですね。
「SH-2A、SH2A-FPUユーザーズマニュアル ソフトウェア編」によりますと、
命令 | ステート数 |
システムレジスタ読出し | 2 |
20bitデータ転送 | 1 |
マスク値(レジスタ同士の)の加算 | 1 |
システムレジスタ書込み | 3 |
計 | 7 |
所要時間は、7ステート × クロック分解能 。100MHzだと、0.07usec。アプリケーションにもよりますが、負荷を気にして使う必要はなさそうです。
しかしながら実際のところ1usオーダーで消費しているように見受けられます。SHの5段パイプラインがこの場合止まってしまうとすると、0.07 x 5 = 0.35usec、もろもろでざっくり 0.5usec。msecオーダーの制御周期であればよいですが、100usec、50us制御周期の場合は厳しくなりそうですね。
他マイコンですと、メインコントロールレジスタに1bit割禁フラグがあって、アセンブラ一行でビット操作命令で割禁フラグを上げ下げできます。RL78なら、
SET1 MK0L.5 // 割込み禁止
CLR1 MK0L.5 // 割込み解除
知らずに同じ感覚で念のため程度でset_maskを多用していたら、知らずに性能を圧迫してしまいます。デリケートな割禁部は、後からメンテする人は恐ろしくて外せないでしょう。お困りの方はご相談ください。