首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

嵌入式 C 語言關鍵字 volatile 深度解析:修飾場景、const 組合與經典面試題

     編輯:關於C語言

嵌入式 C 語言關鍵字 volatile 深度解析:修飾場景、const 組合與經典面試題

volatile 含義

告訴編譯器:該變量可能在「意想不到」的時刻發生變化(硬件、中斷、其他線程),每次讀取必須從內存重新加載,禁止優化器將其值缓存在寄存器中。

三大典型使用場景

  1. 硬件寄存器:狀態寄存器、數據寄存器可能由外設自動更新。
  2. 中斷服務程序訪問的非自動變量:全局/靜態標誌位、緩衝區指針。
  3. 多線程共享變量:未加鎖的標誌位(注意:volatile 不保證原子性/內存屏障,僅防編譯器優化)。

const volatile 組合

合法且常見。const 表示「代碼不應修改」,volatile 表示「硬件可能修改」。典型例子:只讀狀態寄存器 const volatile uint32_t *STATUS_REG。

volatile 指針

volatile int *p:指向 volatile int 的指針(指針本身非 volatile)。
int *volatile p:指針本身是 volatile(指針值可能意外變化,如中斷修改緩衝區指針)。

經典面試題:square 函數缺陷

int square(volatile int *ptr) {
    return *ptr * *ptr;  // 錯誤:兩次讀取可能得到不同值
}

修正:

int square(volatile int *ptr) {
    int val = *ptr;      // 單次讀取
    return val * val;
}

編譯器對原代碼可能生成兩次加載指令,若 *ptr 為硬件計數器,兩次值不同導致非平方結果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved