日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

浅谈单片机中变量访问的互斥

發(fā)布時(shí)間:2025/3/15 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈单片机中变量访问的互斥 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文以stm32為硬件平臺,淺談一下變量訪問的互斥。

假設(shè)是裸板,主程序和中斷服務(wù)程序都對某個(gè)變量進(jìn)行修改,那么很可能造成數(shù)據(jù)的不一致。查了一下,主要有兩種解決方法:第一種是關(guān)中斷,在訪問公共資源的時(shí)候,先把中斷關(guān)掉,等訪問完畢,再打開中斷。這樣就避免了中斷程序和主程序的競態(tài)。第二種是自己做一個(gè)互斥鎖。

怎么做互斥鎖呢?其實(shí)互斥是要依賴與硬件的,如果硬件沒有相關(guān)的指令或者機(jī)制,那就不好辦了。

在x86上,可以用匯編指令XCHG做一個(gè)互斥鎖,但是stm32上就沒有這個(gè)指令。在翻閱了《Cortex-M3權(quán)威指南》后,我有個(gè)發(fā)現(xiàn)。下面總結(jié)一下:

互斥訪問分為加載和存儲,對應(yīng)的指令對是LDREX/STREX,LDREXH/STREXH,LDREXB/STREXB,分別對應(yīng)字,半字,字節(jié)。

LDREX/STREX的語法格式為:

LDREX ? ?Rxf, ? ?[Rn, #offset] ? ?; 把 (Rn+offset)地址處的內(nèi)容加載到寄存器 Rxf里

STREX ? ?Rd, Rxf, [Rn, #offset] ;把Rxf的值存儲到(Rn+offset)地址處,這個(gè)操作是可以被駁回的(也就是不被執(zhí)行),如果駁回,Rd的值為1,如果操作成功,Rd的值為0.

在什么情況下會被駁回呢?在執(zhí)行STREX的時(shí)候,僅當(dāng)在這之前執(zhí)行過LDREX指令,且在執(zhí)行過LDREX指令之后沒有其他的STR/STREX指令執(zhí)行過的時(shí)候,才允許執(zhí)行這個(gè)指令。也就是說只有在LDREX執(zhí)行后的第一條STREX才能成功執(zhí)行。

這個(gè)道理是易于理解的,在讀,改,寫的過程中,我們希望讀的數(shù)據(jù)是最新的,也就是讀過之后,這個(gè)數(shù)據(jù)不能被別人更新,只能被我更新。如果操作被駁回,說明別人已經(jīng)修改過了,所以我讀出的數(shù)據(jù)不是最新的,已經(jīng)“臟了”。

關(guān)于例子文中有,這里就不贅述了。

用這對指令,就可以做一個(gè)互斥鎖。怎么做呢?還是以《Cortex-M3權(quán)威指南》中的一個(gè)例子來說明。

DeviceALocked是一個(gè)位于內(nèi)存中的R/W變量,用于指示設(shè)備A是否已經(jīng)在使用中。任何一個(gè)任務(wù),若欲使用設(shè)備A,都必須先檢查這個(gè)變量的值。如果它的值為零,則表示設(shè)備可以使用。在任務(wù)獲取到設(shè)備A后,它要把DeviceALocked的值改為1,表示設(shè)備A已經(jīng)被占用。在設(shè)備A使用完畢后,該任務(wù)通過重新清零DeviceALocked來釋放設(shè)備A,從而使其它任務(wù)可以使用此設(shè)備。?

TryToLockDeviceA
LDR ? R1, =DeviceALocked

LDREX?R2, [R1]

CMP ? R2, #0 ? ? ? ? ?;檢查是否已被鎖住?

BNE LockDeviceAFailed


DeviceAIsNotLocked
MOV ? R0, #1 ? ? ? ? ??;準(zhǔn)備鎖住設(shè)備A
STREX R2, R0, [R1] ? ??;互斥寫

CMP ? R2, #0
BNE LockDeviceAFailed ?;STREX失敗,設(shè)備A可能已被鎖;?準(zhǔn)備返回成功值

LockDeviceASucceed
MOV ? R0, #0

POP ? {R1, R2, PC} ? ??;子程序返回?

LockDeviceAFailed
MOV ? R0, #1

POP ? {R1, R2, PC} ? ??;子程序返回?





總結(jié)

以上是生活随笔為你收集整理的浅谈单片机中变量访问的互斥的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。