嵌入式與韌體

將上面的程式啟用最佳化進行編譯後,即使發生計時器中斷,有時也不會呼叫led_on()。原因與對策的組合,下列何者正確?

int flag = 0;
void timer_isr(void) { flag = 1; }
int main(void) {
    while (flag == 0) { }
    led_on();
}
  1. A因為編譯器只讀取flag一次,不會在迴圈中重新讀取。對flag加上volatile
  2. B因為發生中斷時flag會被重設為0。將flag改為long
  3. C因為while內容為空時CPU會停止。在迴圈中加入加法運算
查看答案與解析

正確答案:A. 因為編譯器只讀取flag一次,不會在迴圈中重新讀取。對flag加上volatile

編譯器只看main中的內容,判斷「迴圈中沒有任何會改變flag的東西」,有時會產生只將flag讀入暫存器一次,然後以該值持續空轉的程式碼。即使中斷處理常式改寫了記憶體上的flag,迴圈也看不到。加上volatile後,每次存取都會從記憶體讀寫。對於多位元組的變數,還需要另外設法避免讀寫到一半被中斷。

  • A. 正確。指示每次都從記憶體重新讀取。
  • B. 處理常式寫入的是1,型別也不是原因。
  • C. 即使迴圈為空,CPU也不會停止。
練習這個領域 前往領域頁面

嵌入式與韌體的其他題目

  1. 在8位元微控制器上,計時器中斷每次將32位元變數ticks加1,主程式讀取ticks來計算經過時間。偶爾會讀到偏差很大的值,其原因下列何者正確?
  2. 關於UART序列通訊的特徵,下列何者正確?
  3. 以115200 bps的UART,用資料8位元、無同位檢查、停止位元1(8N1)的格式傳送時,每秒可傳送的位元組數最接近下列何者?
  4. UART的傳送端與接收端的鮑率若有些許偏差,可能會出現亂碼。偏差的容許範圍只限於大約數%左右,其原因下列何者正確?
  5. 關於SPI通訊的特徵,下列何者正確?

這個領域的比較