嵌入式系統開發學習:16 ARM信號量指令
目標:
學習掌握ARM的SWP/SWPB寄存器和內存數據交換指令。
ARM 信號量指令概述:
ARM經典微處理器有兩條信號量指令(單條指令完成ARM通用寄存器與內存交換指令)。
一個關於C語言的問題:
int i;
i = 5;
請問在ARM這類精簡指令集的微處理器上執行i=5的代碼是原子的嗎?
根據學習的ARM體系結構和ARM彙編指令可以知道,執行給變數i賦值5的動作不是原子的。它至少需要執行如下指令:
1、 獲得內存中變數i的地址(把變數i的地址存儲存入寄存器)
2、 把數值5載入的ARM的通用寄存器中
3、 使用存儲器指令STM將ARM寄存器中的數據(5)存入i變數中(根據地址)
要完成如上指令至少需要3條ARM指令,所以C語言的i=5被執行時,不是原子的(多條指令執行過程可能被打斷)。
ARM處理器設計了一條可以原子的完成內存和ARM通用寄存器交換數據的指令:
SWP(字交換指令)/SWPB(位元組交換指令)
信號量指令(SWP/SWPB)
語法:
圖:ARM 信號量指令
cond:可選,條件助記符,如:EQ,NE
B:可選,位元組,如果有就表示交換一個位元組數據,ARM寄存器的低8位
Rd:目標寄存器,內存中的數將被載入到本寄存器
Rm:源寄存器,被寫到內存中的數
Rn:地址寄存器,內存數據所在的地址
指令執行動作說明:
該指令一條指令完成兩個動作:
1、 Rm寄存器內容寫入Rn寄存器指定的內存地址單元中
2、 Rn寄存器指定的內存單元的數據載入到寄存器Rd中
註:
1、 完成如上操作需要藉助中間存儲單元(ARM處理器自動完成)。
2、 如果Rd和Rm相同則實現寄存器內容和內存內容互換。
3、 R15不能出現在Rd,Rm,Rn中,出現結果不可預知。
4、 Rd,Rn不能相同,否則結果不可預知。
5、 Rm,Rn不能相同,否則結果不可預知。
SWP指令執行動作的偽代碼:
SWPB指令執行操作的偽代碼:
指令示例:
; load R12 from address R9 and store R10 to address R9
SWP R12, R10, [R9]
; load byte to R3 from address R8 and store byte from R4 to address R8
SWPB R3, R4, [R8]
; Exchange value in R1 and address in R2
SWP R1, R1, [R2]
指令示例2
圖:SWP指令示例


※用doxygen為C/C十十程序自動生成文檔《1、簡介及安裝》
TAG:邦氪 |