組込み・ファームウェア
メイン処理でレジスタのビットを「reg |= mask;」(読み出し・変更・書き込み)で操作している最中に、割り込みハンドラが同じレジスタの別のビットを書き換えると起こりうる問題と対策の組み合わせとして正しいものはどれか。
- A割り込みでの変更が、メイン処理の書き戻しで消える。操作の間だけ割り込みを禁止するか、ビットごとのセット・クリア専用のレジスタを使う
- Bレジスタが壊れて二度と使えなくなる。マイコンを交換する
- C何も起こらない。対策は不要である
答えと解説を見る
正解:A. 割り込みでの変更が、メイン処理の書き戻しで消える。操作の間だけ割り込みを禁止するか、ビットごとのセット・クリア専用のレジスタを使う
「reg |= mask」は、レジスタを読み、ORを取り、書き戻す3つの操作です。読んだ直後に割り込みが入り、ハンドラが別のビットを変えても、メイン処理は割り込み前に読んだ古い値をもとに書き戻すので、ハンドラの変更が消えます。操作の間だけ割り込みを禁止するか、1を書いたビットだけが変わるセット用・クリア用のレジスタを使えば、1回の書き込みで済み、この問題は起きません。
- A. 正しい。読んでから書くまでの間に割り込まれるのが原因です。
- B. 回路が壊れるわけではなく、値が失われるだけです。
- C. 値が失われる可能性があります。