組込み・ファームウェア

メイン処理でレジスタのビットを「reg |= mask;」(読み出し・変更・書き込み)で操作している最中に、割り込みハンドラが同じレジスタの別のビットを書き換えると起こりうる問題と対策の組み合わせとして正しいものはどれか。

  1. A割り込みでの変更が、メイン処理の書き戻しで消える。操作の間だけ割り込みを禁止するか、ビットごとのセット・クリア専用のレジスタを使う
  2. Bレジスタが壊れて二度と使えなくなる。マイコンを交換する
  3. C何も起こらない。対策は不要である
答えと解説を見る

正解:A. 割り込みでの変更が、メイン処理の書き戻しで消える。操作の間だけ割り込みを禁止するか、ビットごとのセット・クリア専用のレジスタを使う

「reg |= mask」は、レジスタを読み、ORを取り、書き戻す3つの操作です。読んだ直後に割り込みが入り、ハンドラが別のビットを変えても、メイン処理は割り込み前に読んだ古い値をもとに書き戻すので、ハンドラの変更が消えます。操作の間だけ割り込みを禁止するか、1を書いたビットだけが変わるセット用・クリア用のレジスタを使えば、1回の書き込みで済み、この問題は起きません。

  • A. 正しい。読んでから書くまでの間に割り込まれるのが原因です。
  • B. 回路が壊れるわけではなく、値が失われるだけです。
  • C. 値が失われる可能性があります。
この分野を解く 分野ページへ

組込み・ファームウェアのほかの問題

  1. マイコンの入力端子にスイッチだけをつなぎ、プルアップやプルダウンの抵抗を付けなかった。スイッチが開いているときに起こりうることはどれか。
  2. マイコンのGPIO(汎用入出力)の端子を使うときに、最初に設定する必要があることとして正しいものはどれか。
  3. 機械式のスイッチを押したときに、接点が細かく跳ねて短い時間に何度もオンとオフを繰り返す現象を何と呼ぶか。
  4. ソフトウェアでスイッチのチャタリングを取り除く方法として最も適切なものはどれか。
  5. 16 MHzのクロックをプリスケーラで16分周したものでタイマを数え、1000カウントごとに割り込みを起こす設定にした。割り込みの間隔はいくらか。