破壊性読み出しレジスタと割り込み

MMRの中には一度読むと状態が変わるものがあります。多くのレジスタは読み出しても問題ありませんが、古いデバイスとの互換性を保つためにそのようなレジスタを持っているデバイスがあります。UARTがそれです。UARTの受信レジスタUART_RBRや割り込みステータス・レジスタUART_IIRは一度読むとレジスタの状態が変わってしまいます。

このようなレジスタは割り込み禁止状態で使ってください。

Blackfin コアは投機的ロードを行いますが、そのために実際のロード動作とロード命令の実行(コミット)が可分な動作として実装されています。その結果、割り込みが発生するとロードを行ったのにロード命令がキャンセルされるということが実際に起こりえます。これは上記のようなレジスタに対して致命的な打撃を与えます。そのため、この手のレジスタは必ず割り込み禁止状態で読み出すようにしてください。

    p0.L = UART_IIR;
    p0.H = UART_IIR;
    cli r0;           // 割り込み禁止
    r1 = w[p0](z);    // UART_IIRの読み出し
    sti r0;           // 割り込み禁止解除

しかしながら、このような措置をとってもNMI(マスク不能割り込み)は禁止できません。したがって、NMIはバッテリーの危機的状況のような回復できなくても仕方が無いような緊急事態でのみ使うようにしてください。

同様にエミュレーション・イベントもレジスタに回復できない変化を与えることがあります。これはステップ実行やブレークで発生します。覚えておいたほうがいいでしょう。

Blackfin空挺団 | プログラム | EZ-KIT | コア&ペリフェラル | TOPPERS/JSP | こぼれ話 | DSP掲示板