現(xiàn)在的車(chē)載控制器,多核的MCU用的是越來(lái)越多了,對(duì)于不同核之間的共享數(shù)據(jù)保護(hù),也是必須的,其中Spinlock就是常用的一種。
01.
Spinlock介紹
Spinlock也即自旋鎖,是一種輕量級(jí)的多核間的數(shù)據(jù)同步機(jī)制。一個(gè)任務(wù)想要訪問(wèn)被Spinlock保護(hù)的共享資源,必須先得到鎖,在訪問(wèn)完共享資源后釋放鎖。如果在獲取自旋鎖時(shí),沒(méi)有任何執(zhí)行單元保持該鎖,那么將立即得到鎖;如果在獲取自旋鎖時(shí)鎖已經(jīng)有持有者, 那么需要自旋等待該鎖的保持者釋放了鎖。
在ETAS的AUTOSAR中,實(shí)現(xiàn)Spinlock的兩個(gè)基本操作獲取鎖xx_GetLockInternal()和釋放鎖xx_ReleaseLockInternal()。
對(duì)于獲取鎖接口,其內(nèi)部的實(shí)現(xiàn)原理如下:
第一步先判斷是哪個(gè)核上的任務(wù)正在使用xx_GetLockInternal();
判斷鎖是否已經(jīng)被同當(dāng)前核獲取過(guò)但沒(méi)有釋放,如果是的話(huà),就進(jìn)行鎖嵌套累加, 繼續(xù)執(zhí)行代碼,如果沒(méi)有被當(dāng)前核獲取過(guò)再進(jìn)行下一步判斷;
掛起正在使用xx_GetLockInternal()的當(dāng)前核的中斷,確保當(dāng)前任務(wù)不被切換,也就是說(shuō)不被高優(yōu)先級(jí)任務(wù)或者中斷任務(wù)打斷;
測(cè)試鎖的狀態(tài),該才做必須以原子操作訪問(wèn)Spinlock的鎖標(biāo)志。
如果鎖狀態(tài)被本核占用則進(jìn)行鎖嵌套,如果是其他核占用則首先釋放該核中斷, 然后重復(fù)執(zhí)行上面兩步測(cè)試鎖的狀態(tài),直到其他核釋放了鎖。如果鎖狀態(tài)為空閑, 則設(shè)置其為占用狀態(tài),這就成功地?fù)屨剂随i。
對(duì)于釋放鎖接口,其內(nèi)部的實(shí)現(xiàn)原理如下:
首先判斷是哪個(gè)核上的線(xiàn)程正在使用xx_ReleaseLockInternal();
判斷當(dāng)前鎖是否被該核占用,如果不是說(shuō)明接口調(diào)用不匹配則復(fù)位,如果是則進(jìn)行 下一步的判斷;
判斷鎖是否被本核嵌套, 如果是則嵌套次數(shù)減減, 如果沒(méi)有則清除鎖的狀態(tài);
釋放該核的中斷。
02.
Spinlock使用原則
所有臨界區(qū)代碼都需要加鎖保護(hù),否則就達(dá)不到保護(hù)效果。也就是,訪問(wèn)共享資源的多個(gè)任務(wù)需要協(xié)同工作共同加鎖才能保證不出錯(cuò)。在實(shí)際寫(xiě)代碼時(shí),有時(shí)會(huì)忘掉這個(gè),導(dǎo)致出現(xiàn)各種稀奇古怪的問(wèn)題,并且很難排查。
Spinlock保護(hù)的代碼執(zhí)行時(shí)間要盡量短, 因?yàn)榕R界區(qū)太大,持有時(shí)間太長(zhǎng),其他任務(wù)可能面臨長(zhǎng)時(shí)間等待,降低了系統(tǒng)性能。
Spinlock 所保護(hù)的代碼在執(zhí)行過(guò)程中不能睡眠, 任務(wù)在持有自旋鎖時(shí)如果進(jìn)入 Sleep狀態(tài),則可能導(dǎo)致死鎖。
審核編輯:劉清
-
mcu
+關(guān)注
關(guān)注
146文章
17196瀏覽量
351887 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
363瀏覽量
21639 -
車(chē)載控制系統(tǒng)
+關(guān)注
關(guān)注
0文章
6瀏覽量
8118
原文標(biāo)題:ETAS AUTOSAR中Spinlock學(xué)習(xí)筆記
文章出處:【微信號(hào):eng2mot,微信公眾號(hào):汽車(chē)ECU開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論