SHマイコンのC言語組込み関数set_imask中身は?

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なら、

知らずに同じ感覚で念のため程度でset_maskを多用していたら、知らずに性能を圧迫してしまいます。デリケートな割禁部は、後からメンテする人は恐ろしくて外せないでしょう。お困りの方はご相談ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です