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