前言
通過<
問題:如何理解Spinlok自旋鎖中的”自旋“的含義?
縮略詞
簡(jiǎn)寫 | 全稱 |
PSW | Program State Word |
注:本文章引用了一些第三方工具和文檔,若有侵權(quán),請(qǐng)聯(lián)系作者刪除!
正文
LDL和STC指令可用于獲取原子讀-寫操作,用于多核系統(tǒng)對(duì)內(nèi)存更新進(jìn)行精確處理。LDL和STC指令的操作方式如下。
每個(gè)CPU只能創(chuàng)建一個(gè)Link(LLbit)。該鏈接包含關(guān)于創(chuàng)建它的地址的信息,并根據(jù)STC指令在該地址是否成功或失敗以及該鏈接是否丟失來進(jìn)行接下來的控制。該鏈接還包括創(chuàng)建鏈接時(shí)的數(shù)據(jù)大小信息,因此,數(shù)據(jù)大小與創(chuàng)建鏈接的LDL指令不同的任何STC指令總是會(huì)失敗,STC指令失敗則該鏈接被刪除。
每個(gè)CPU都能夠生成一個(gè)到Local RAM和cluster RAM的鏈接。
在目標(biāo)RAM上執(zhí)行LDL指令導(dǎo)致鏈接地址被注冊(cè),同時(shí)設(shè)置鏈接標(biāo)志,并響應(yīng)該指令讀取生成鏈接。
(a)每個(gè)CPU的Local RAM
(b)Cluster RAM
每個(gè)CPU都能夠生成一個(gè)到(a)或(b)的鏈接。
在生成Link之后,存儲(chǔ)將只響應(yīng)執(zhí)行與生成的鏈路對(duì)應(yīng)的STC指令而進(jìn)行,也就說說該存儲(chǔ)地址只能通過STC指令寫入。
如果鏈路丟失,即使處理相應(yīng)地址的STC指令,存儲(chǔ)也不會(huì)繼續(xù)。當(dāng)處理與鏈接不對(duì)應(yīng)的STC指令時(shí),也不會(huì)繼續(xù)存儲(chǔ)。
個(gè)人理解:Link是一個(gè)抽象概念,通過LDL指令能夠創(chuàng)建一個(gè)link,且每個(gè)CPU只能創(chuàng)建一個(gè)Link,通過STC指令能改寫CPU Link的RAM的值。
如果滿足以下條件,則判定STC指令為與該鏈路對(duì)應(yīng)的地址:
生成鏈接的LDL指令的地址和大小與STC指令的地址和大小相匹配。
當(dāng)滿足某些事件或地址條件時(shí),鏈接將丟失。表1顯示了Link loss情況。如果滿足此表中所示的任何條件,則一個(gè)鏈接就會(huì)丟失。
Table 1 Link Loss Conditions
?

Note: 在Local RAM中,如果執(zhí)行了除STC/CAXI指令以外的存儲(chǔ)指令,則鏈接并不總是丟失。因此,觸使Link Loss的指令程序流是可以不需要的。例如,在接下來的示例代碼中,在使用LDL指令讀取鎖變量后,只有在沒有鎖的情況下才執(zhí)行STC指令,如果鎖已經(jīng)存在(Link已經(jīng)建立)則通過Lock Release對(duì)應(yīng)的Link Loss程序流就是不需要的。也就是說,LDL指令Link成功,STC指令存儲(chǔ)成功(創(chuàng)建一個(gè)Lock),之后的ST等存儲(chǔ)指令用于Link Loss才是有意義的。也就是只有GetSpinlock成功之后才能ReleaseSpinlock.
通過使用LDL.W和STC.W指令執(zhí)行的自旋鎖的示例代碼如下所示。
?

一行一行的來分析這段匯編代碼:
MOV lock_adr, r20???? //lock_adr這個(gè)地址值賦值給r20寄存器,lock_adr可以理解為一個(gè)存在于RAM的全局變量的地址。
LDL.W [r20], r21 ????//以原子操作的方式加載r20寄存器保存的地址所在的值給r21寄存器。這個(gè)指令執(zhí)行完后,r20存儲(chǔ)lock_adr地址值(全局變量的地址),r21保存了lock_adr地址指向的具體變量值(全局變量的值)。Link Generation.


?
CMP r0, r21 ????//r0寄存器中值與r21寄存器中的值進(jìn)行比較。
Note 1: r0是Zero寄存器,其值永遠(yuǎn)為0.

?
Note 2: CMP指令的結(jié)果在程序狀態(tài)字寄存器的PSW.Z bit上體現(xiàn),比較的兩個(gè)值如果相等則PSW.Z =1;反之,比較的兩個(gè)值不相等,則PSW.Z = 0.
BNZ lock_wait ????//如果上一次的cmp結(jié)果不為0,則跳轉(zhuǎn)到lock_wait標(biāo)識(shí)符地址處往下執(zhí)行。

?
MOV 1, r21 ????//將1賦值給r21寄存器。r21寄存器中保存的值為1.
STC.W r21, [r20] ????//將r21寄存器保存的值(1)賦值給r20保存的地址指向的變量。Success in storing.
CMP r0, r21 ????//比較r0(always retains 0)和r21寄存器中保存的值(也就是比較0和1)。
BNZ lock_success ????//如果上一次的cmp結(jié)果不為0,則跳轉(zhuǎn)到lock_success標(biāo)識(shí)符地址處往下執(zhí)行。
Lock_wait: SNOOZE
Note: SNOOZE指令是一種在自旋鎖期間減少總線帶寬使用的指令。該指令完成后,CPU核心進(jìn)入臨時(shí)停止?fàn)顟B(tài),以限制后續(xù)指令的執(zhí)行。程序員可以通過將此指令插入到一個(gè)自旋鎖循環(huán)中,從而避免由于短期重復(fù)鎖定過程而導(dǎo)致的不必要的總線帶寬的使用。

?
BR Lock ???? //無條件跳轉(zhuǎn)到Lock標(biāo)識(shí)符處
Lock_success: ????//一個(gè)標(biāo)識(shí)符,運(yùn)行到這里表明get spinlock成功,繼續(xù)往下執(zhí)行。
ST.W r0, 0[r21] ????//王r21寄存器保存的地址值指向的變量寫入0值。Release spinlock.
?
?


?

準(zhǔn)備獲取Spinlock的時(shí)候,外部就是一個(gè)While循環(huán),直到成功獲取到Spinlock,否則就會(huì)“自旋”。



?

釋放Spinlock對(duì)應(yīng)的C代碼,只需將標(biāo)識(shí)Spinlock的全局變量賦值為0即可(對(duì)應(yīng)ST.W r0, 0[r21]的匯編代碼)。
本文詳細(xì)分析了Spinlock在RH850U2A芯片平臺(tái)上的底層實(shí)現(xiàn),著重需要理解RH850U2A芯片架構(gòu)中的Link概念。Spinlock對(duì)應(yīng)的底層兩個(gè)特殊的匯編指令:LDL.W和STC.W. 在C語言環(huán)境下調(diào)用GetSpinlock()的具體實(shí)現(xiàn)也就是調(diào)用OS_LDLW()和STC_STCW()。值得注意的是,Spinlock的底層實(shí)現(xiàn)和具體芯片特性相關(guān),其他芯片平臺(tái)(比如Tricore芯片)的底層具體實(shí)現(xiàn)可能就不一樣了,需要具體分析。
問題:如何理解Spinlok自旋鎖中的”自旋“的含義?
答:“自旋”對(duì)應(yīng)底層的SNOOZE指令。當(dāng)前CPU(Core x)執(zhí)行LDL.W沒有建立Link后,CPU執(zhí)行SNOOZE指令暫停一個(gè)機(jī)器周期,隨后再次嘗試去執(zhí)行LDL.W指令,直到建立Link成功(其他CPU釋放Spinlock),這個(gè)過程對(duì)應(yīng)“自旋”的含義。
參考文檔:
1.RH850/U2A-EVA Group:?User’s Manual: Hardware
2.RH850G4MH: User’s Manual: Software
3.MULTI: Building Applications for Embedded V850 and RH850
End
「汽車電子嵌入式在CSDN上同步推出AUTOSAR精進(jìn)之路專欄,本專欄每個(gè)模塊完全按實(shí)際項(xiàng)目中開發(fā)及維護(hù)過程來詳細(xì)介紹。模塊核心概念介紹、實(shí)際需求描述、實(shí)際工程配置、特殊需求介紹及背后原理、實(shí)際工程使用經(jīng)驗(yàn)總結(jié)。目的是讓讀者看完每一個(gè)章節(jié)后能理解原理后根據(jù)需求完成一個(gè)模塊的配置或者解決一個(gè)問題。」
點(diǎn)擊文章最后左下角的閱讀原文可以獲取更多信息
或者復(fù)制如下鏈接到瀏覽器獲取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.為便于技術(shù)交流,創(chuàng)建了汽車電子嵌入式技術(shù)交流群,可盡情探討AP,CP,DDS,SOME/IP等前沿?zé)狳c(diǎn)話題,后臺(tái)回復(fù)“加群”即可加入;
注:本文引用了一些第三方工具和文檔,若有侵權(quán),請(qǐng)聯(lián)系作者刪除!
推薦閱讀
汽車電子嵌入式精彩文章匯總第一期:20210530-20230703
AUTOSAR 架構(gòu)下EcuM喚醒源事件詳解
AUTOSAR架構(gòu)下NVM Block連續(xù)寫及Default Value問題分析
AUTOSAR架構(gòu)下NvM模塊詳細(xì)分析
AUTOSAR架構(gòu)下報(bào)文掉線超時(shí)不上報(bào)問題分析
Classic Autosar下的以太網(wǎng)通訊架構(gòu)概覽
通信中間件Someip服務(wù)化通信
AUTOSAR架構(gòu)下Fee詳細(xì)分析
TC37x芯片F(xiàn)LASH基本概念介紹
AUTOSAR架構(gòu)下Fls詳細(xì)分析
TC3xx芯片DMU介紹
TC3xx芯片MPU介紹
TC3xx芯片的Trap詳解
AUTOSAR架構(gòu)下的OS錯(cuò)誤處理
AUTOSAR架構(gòu)下QM Application如何訪問ASIL Application
AUTOSAR架構(gòu)下多核啟動(dòng)
TC3xx芯片的Trap詳解(二)
AUTOSAR架構(gòu)下多核Shutdown
AUTOSAR架構(gòu)下多核通信
End
歡迎點(diǎn)贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵(lì),都是我最大的動(dòng)力!
汽車電子嵌入式
微信掃描二維碼,關(guān)注我的公眾號(hào)