1 什么是讀-改-寫操作
“讀-改-寫”(Read-Modify-Write,簡稱RMW)是一種常見的操作模式,它通常用于需要更新數據的場景。
這個模式包含三個基本步驟:
-
1.讀(Read):首先讀取當前的數據。
-
2.改(Modify):根據需要對數據進行修改。
-
3.寫(Write):將修改后的數據寫回原來的位置。
2 應用領域
"讀-改-寫"操作是一種基本的數據處理模式,廣泛應用于多個領域,以下是一些主要的應用領域:
-
1.計算機硬件:在硬件設計中,RMW操作常用于對寄存器或內存位置進行位級控制,比如配置I/O端口、設置中斷標志等。
-
2.嵌入式系統:在微控制器(MCU)編程中,RMW操作用于對硬件寄存器進行精確控制,以實現對硬件設備的配置和管理。
-
3.操作系統:操作系統內核中,RMW操作用于實現對共享資源的同步和互斥控制,例如,使用原子操作來更新計數器或狀態標志。
-
4.數據庫管理:在數據庫系統中,RMW操作用于事務處理,確保數據的一致性和完整性。例如,更新記錄時,數據庫引擎會先讀取舊值,修改后寫回新值。
-
5.網絡通信:在網絡協議棧中,RMW操作可能用于更新網絡設備的狀態或配置,如路由器或交換機的設置。
-
6.并發編程:在多線程或多進程編程中,RMW操作是實現線程安全的關鍵技術之一,用于避免競態條件和數據競爭。
-
7.圖形用戶界面(GUI)編程:在GUI開發中,RMW操作可能用于更新界面元素的狀態,如按鈕的啟用/禁用狀態。
-
8.游戲開發:在游戲編程中,RMW操作用于實時更新游戲狀態,如玩家的位置、得分等。
-
9.固件開發:固件是嵌入式系統中的低級軟件,RMW操作在固件中用于硬件初始化和配置。
-
10.文件系統:文件系統中,RMW操作用于更新文件元數據或目錄結構,同時保持文件系統的一致性。
-
11.內存管理:在計算機內存管理中,RMW操作用于更新內存分配表,以跟蹤內存使用情況。
-
12.硬件抽象層(HAL):在硬件抽象層編程中,RMW操作用于與硬件設備進行交互,如配置外設。
-
13.實時系統:在需要快速響應的實時系統中,RMW操作用于快速更新系統狀態,以滿足實時性要求。
-
14.分布式系統:在分布式系統中,RMW操作可能用于同步不同節點的狀態,以保持數據的一致性。
RMW操作是確保數據一致性和系統穩定性的關鍵,無論是在硬件層面還是在軟件層面,它都是實現精確控制和同步的基本手段。
3 嵌入式系統中的讀-改-寫
RMW操作在MCU中的一些應用場景:
-
1.位操作:MCU的寄存器通常具有特定的位用于控制硬件行為。
-
2.中斷標志位:在處理中斷時,MCU可能需要清除中斷標志位以防止同一中斷再次觸發。
-
3.配置寄存器:在初始化MCU時,可能需要配置多個寄存器以設置時鐘、電源管理、通信接口等。
-
4.內存映射的外設:某些外設,如LCD控制器或ADC(模擬數字轉換器),可能通過內存映射的方式與MCU交互。
-
5.臨界區保護:在多任務或中斷驅動的系統中,保護臨界區(critical section)以防止數據競爭或不一致,可能需要使用原子操作或禁用中斷來進行RMW操作。
-
6.位帶操作:一些MCU提供了位帶操作的指令,這些指令可以直接對內存或寄存器的特定位進行操作,而不需要完整的RMW周期。
3.1 配置寄存器
以配置寄存器為例子,“讀-改-寫”操作可以分解為以下步驟:
-
1.先把寄存器讀到臨時變量里
-
2.用|=、&=的操作,改變臨時變量的指定幾位
-
3.把臨時變量寫回到寄存器里
// 這是固件庫函數中設置窗口看門狗窗口時間的函數,就運用了”讀-改-寫“操作
void WWDG_SetWindowValue(uint8_t WindowValue)
{__IO uint32_t tmpreg = 0;/* Check the parameters */assert_param(IS_WWDG_WINDOW_VALUE(WindowValue));/* Clear W[6:0] bits *//* 1.把寄存器讀到臨時變量里 */tmpreg = WWDG->CFR & CFR_W_Mask;/* 2.用|=、&=的操作,改變臨時變量的指定幾位 *//* Set W[6:0] bits according to WindowValue value */tmpreg |= WindowValue & (uint32_t) BIT_Mask;/* 3.把臨時變量寫回到寄存器里 *//* Store the new value */WWDG->CFR = tmpreg;
}
優勢:
-
1.可以單獨改變寄存器的某幾位,而不影響其他位的值
-
2.如果連續更改多次不同的位,這樣操作效率比較高
-
3.所有更改的位在最終寫回到寄存器時同時生效