64bit長bit論理演算

ADSP-BF533は、内蔵ペリフェラルが少なく、SIC_IMASKのうち、24bitしか使っていませんでした。ADSP-BF537は32bitすべてを使い切りました。ADSP-BF538はさらに内蔵ペリフェラルの数が増えたため、SIC_IMASKのビットに複数のペリフェラルからの割り込み要求をORして多重化していました。私はこの方式が嫌いです。多重化した割り込み源をポーリングしろというのなら、はなからSIC_IMASKなど不要です。IMASKだけで十分です。
ADSP-BF51xはSIC_IMASK0とSIC_IMASK1の2本のレジスタを持つことで多数の割り込み源を多重化せずに扱うことが出来ます。その代わりに、割り込み処理は少し面倒になりました。
TOPPERS/JSP for Blackfinは、要求されている割り込みの一覧*1と、現在の割り込みレベル*2の二つの情報から、現在実行中の割り込みハンドラが処理すべき割り込みのリストを簡単に割り出せるようpriority_maskという配列を用意しています。この配列は長さが16((イベントの数))であり、要素はそのイベント優先順位に割り当てられている割り込みのビットマスクです。
ADSP-BF533とADSP-BF537では、priority_mask
はunsigned int型で十分でした。ADSP-BF51xの実装を進める上で悩んだのは、この型をどうするかです。一つの方策はunsigned long long intとして64bit処理をすること。もう一つの方策は32bit型の二つの配列priority_mask0とpriority_mask1を用意することです。
結果的には64bit型の配列にしました。この方が見た目がシンプルです。64bitのbit論理演算やシフト演算が正しく処理されるか心配でしたが、杞憂でした。コンパイラの出力はgccもVisualDSP++も期待通りです。

*1:SIC_ISR & SIC_IMASKでわかる

*2:IPENDでわかる