嵌入式與韌體

上面的程式碼正在改寫暫存器reg中多位元的設定欄位。它做了什麼?

reg = (reg & ~(0x7 << 4)) | (5 << 4);
  1. A只將位元5設為1
  2. B先將位元4~6這3位元的欄位清為0,再把5(二進位為101)填入該處
  3. C將reg的值乘以5後再向左移4位元
查看答案與解析

正確答案:B. 先將位元4~6這3位元的欄位清為0,再把5(二進位為101)填入該處

0x7以二進位表示為111,因此「0x7 << 4」是位元4~6為1的遮罩。取其反相並做AND運算來清除欄位,再與「5 << 4」(位元4~6為101)做OR運算,就只有該欄位變成5,其他位元維持原值。這是改寫以多個位元表示一項設定(例如動作模式或除頻比)的暫存器時的基本形式。

  • A. 這是同時設定多個位元。
  • B. 正確。先清除欄位再填入新值。
  • C. 這不是乘法,而是位元操作。
練習這個領域 前往領域頁面

嵌入式與韌體的其他題目

  1. 主程式正以「reg |= mask;」(讀取、修改、寫回)操作暫存器的位元時,中斷處理常式改寫了同一暫存器的另一個位元,可能發生的問題與對策的組合,下列何者正確?
  2. 在微控制器的輸入腳位只接了開關,沒有加上上拉或下拉電阻。開關斷開時可能發生下列何種情況?
  3. 使用微控制器的GPIO(通用輸入輸出)腳位時,首先必須設定的是下列何者?
  4. 按下機械式開關時,接點細微彈跳,在短時間內反覆多次導通與斷開的現象稱為什麼?
  5. 以軟體消除開關彈跳的方法,下列何者最為適當?

這個領域的比較