組込み・ファームウェア

上のコードは、レジスタregの複数ビットの設定欄を書き換えている。何をしているか。

reg = (reg & ~(0x7 << 4)) | (5 << 4);
  1. Aビット5だけを1にする
  2. Bビット4〜6の3ビットの欄を0にしてから、そこに5(2進数で101)を入れる
  3. Cregの値を5倍してから4ビット左にずらす
答えと解説を見る

正解:B. ビット4〜6の3ビットの欄を0にしてから、そこに5(2進数で101)を入れる

0x7は2進数で111なので、「0x7 << 4」はビット4〜6が1のマスクです。その否定とANDを取って欄を0にし、「5 << 4」(ビット4〜6に101)とORを取ると、欄だけが5に変わり、ほかのビットは元のまま残ります。動作モードや分周比のように、複数ビットで1つの設定を表すレジスタを書き換えるときの基本の形です。

  • A. 複数のビットを同時に設定しています。
  • B. 正しい。欄を消してから新しい値を入れます。
  • C. 掛け算ではなく、ビットの操作です。
この分野を解く 分野ページへ

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

  1. メイン処理でレジスタのビットを「reg |= mask;」(読み出し・変更・書き込み)で操作している最中に、割り込みハンドラが同じレジスタの別のビットを書き換えると起こりうる問題と対策の組み合わせとして正しいものはどれか。
  2. マイコンの入力端子にスイッチだけをつなぎ、プルアップやプルダウンの抵抗を付けなかった。スイッチが開いているときに起こりうることはどれか。
  3. マイコンのGPIO(汎用入出力)の端子を使うときに、最初に設定する必要があることとして正しいものはどれか。
  4. 機械式のスイッチを押したときに、接点が細かく跳ねて短い時間に何度もオンとオフを繰り返す現象を何と呼ぶか。
  5. ソフトウェアでスイッチのチャタリングを取り除く方法として最も適切なものはどれか。