割り込みロック機能を追加

以前紹介したTipsですが、ADSP-BF533のシステムMMRの中には割り込み禁止状態で読まなければならないレジスタがあります。
http://blackfin.g.hatena.ne.jp/suikan/20040608#1086730221
割り込み許可状態で読むと投機的ロードが割り込まれる結果、空読みによって動作がおかしくなることがありえます。このため、ADSP-BF533にはNMIから安全に戻る方法がありません。
TOPPERS/JSPのアプリケーションを書く場合もこの点に配慮が必要です。そこで該当するMMRをアクセスするときにCPUロックを行いたくなるのですが、残念ながらこれがうまく機能しない場合があります。デフォルトでは大丈夫ですが、CPUロック状態用のマスクをいじって管理外割り込みを作り出した場合、CPUロックは管理外割り込みを禁止しませんのでMMRアクセスが保護されません。
TOPPERS/JSPはこのような問題に対処するため、NMIを除く管理外割り込みを禁止するための割り込みロック機能を持っています。割り込みをロックするには次のようにします。

void foo( void ){
   SIL_PRE_LOC;    /* ロック状態退避用変数確保 */

   SIL_LOC_INT();  /* 割り込みをロック */
   /* 保護すべき領域 */
   SIL_UNL_INT();  /* 割り込みロック解除 */
}

保護しなければならないMMRはわずかしかありません。UART, SPI,SPORTの受信レジスタとUARTのステータス・レジスタです。管理外割り込みを使わない場合はCPUロックでも代用できますが、再利用性のためには割り込みロックを使ったほうがいいでしょう。