您好,登錄后才能下訂單哦!
Semaphore 2簡介
多核芯片(具體參考相應的數據表文檔)包含一個增強型信號量模型來管理C66xCorePacs的共享資源。Semaphore可以強制對一些芯片級的共享資源只可以執行原子操作,進而保證對其的讀寫的順序。每個核在擁有資源時,Semaphore模塊會對每個核提供專門的中斷。
Semaphore不是和硬件資源綁定在一起,而是可以通過軟件來將Semaphore靈活的配置到不同的硬件資源。
Semaphore支持8個masters,且包含32個可以使用的Semaphores。
Semaphore只能被pri ID在0~7的master訪問。這就意味著,只有CorePacs0~7和被CorePacs0~7的EDMA transaction可以使用semaphore模型。
有三種訪問semaphore資源的方法:
直接訪問:每個核直接訪問semaphore,如果可用free,則分配指定的核。否則不分配。
間接訪問:每個核通過向其中執行寫操作來間接訪問semaphore,一旦該semaphore free,會對相應核產生中斷,否則不產生中斷,而是將請求放入請求隊列。
混合訪問:是直接訪問和間接訪問的混合方式,工作方式:首先像直接訪問一樣,如果信號量free,直接或者使用權,否則要像間接訪問一樣,將請求放入隊列。簡言之,當信號量free時按直接訪問的方式,否則按間接訪問方式。
(以上摘自http://www.ti.com.cn/cn/lit/ds/symlink/tms320c6678.pdf中的semaphore部分內容,此文檔介紹不詳細。因此想要了解更多詳細內容請訪問http://www.ti.com.cn/cn/lit/ug/sprugs3a/sprugs3a.pdf。
Semaphore2 特性:
l提供對共享資源的的互斥訪問
l最多直接64個獨立的信號量
l信號量請求方式
——直接方式
——間接方式
——混合方式
l不分大小端
l信號量的原子操作
l鎖存模式(信號量被使用時)
l排隊等待信號量
l獲取信號量時產生中斷
l支持信號量狀態檢測
l錯誤檢測和錯誤中斷
理論學得再好,不會用都是白費。在安裝CCS5.4之后會提供關于semaphore的使用實例。位置是 CCS安裝路徑 \pdk6678\packages\ti\csl\examples \ sem2 \ sem2_test.c
在代碼中介紹了三種常用的semaphore的訪問方式:
1、direct access
2、indirect access
3、combined access
1、direct access
步驟:(1)保證你想使用的sem處于free狀態,使用CSL_semIsFree(semNum)
(2)獲取信號量CSL_semAcquireDirect(semNum)
確保該信號量的狀態為不被改變,直接訪問方式不更新 SEMFLAGS
(3)semGetFlags(master_id)
(4) 確保當前正確獲得相應信號量的使用,CSL_semIsFree(semNum)
。。。。
(5)經過處理后,釋放信號量。CSL_semReleaseSemaphore(semNum)
(6)確保已經正確釋放,沒有產生錯誤。CSL_semIsFree(semNum);CSL_semGetErrorCode();
2、indirect access
(1)確保信號量狀態是free,CSL_semIsFree(semNum)
(2)確保當前的標志寄存器對應比特位不是等待狀態,CSL_semGetFlags(MASTER_ID),這是跟直接訪問不同的地方,直接訪問不用設置和清除標志寄存器。
CSL_semGetFlags:This functionreturns the contents of the SEMFLAG register for a specific master. This isused in the indirect or combined access method to determine if a resource hasbeen acquired. The corresponding bit indicates that the specific resourcenumber which had been requested is now available.
(3)采用間接訪問的方法獲取信號量資源,CSL_semAcquireIndirect(semNum)
(4)判斷當前是否獲得信號量,使用while來等待資源的獲取
while (1)
{
semFlags = CSL_semGetFlags(MASTER_ID);//獲得相應信號量時,標志寄存器的相應比特位會被設置,此時只要檢測此比特是否被設置即可
if (semFlags & (1 <<semNumber))
{
/* YES. Corresponding bit was set;this implies that the resource is available. */
break;
}
}
(5)使用完信號量后要進行清除操作,流程如下
先將標志寄存器進行重置
CSL_semClearFlags(MASTER_ID, semFlags);
(6)再次檢測標志位是否重置成功
if(CSL_semGetFlags(MASTER_ID)!= 0)
(7)查看當前信號量是否是free
if (CSL_semIsFree(semNumber) == TRUE)
return -1;
(8)如果不是free狀態,釋放信號量
CSL_semReleaseSemaphore(semNumber);
(9)查看是否釋放成功
if(CSL_semIsFree (semNumber) == FALSE)
return -1;
(10)確保上述操作沒有產生
if (CSL_semGetErrorCode() != 0)
return -1;
間接訪問比直接訪問的復雜的地方主要是在于,標志寄存器的賦值和清除,間接訪問原理,是將請求放入請求隊列以等待信號量free,當不是free則等待。一旦free,則將標志寄存器置為一,并產生中斷。當使用完畢后,要記得清除標志位,否則會發生錯誤。(如果標志寄存器沒有清除,則此時master請求其他信號量時,會將其他標志位賦值,此時就會有兩個標志位被設置,函數返回會出錯)。
一句話,大家寫程序按TI提供的例子的流程來寫。
3、混合訪問
(1)確保當前信號量free
/* Get the status of the semaphore:Semaphore should *not* be acquired. */
if (CSL_semIsFree (semNumber) == FALSE)
return -1;
(2)確保當前標志寄存器
/* Make sure there are no pending flags. */
if (CSL_semGetFlags(MASTER_ID) != 0)
return -1;
(3)獲取信號量
/* Acquire the semaphore. */
if (CSL_semAcquireCombined(semNumber) == 0)
return -1;
(4)判斷獲取信號量操作是否成功
/* Get the status of the semaphore:Semaphore should *not* be free */
if (CSL_semIsFree (semNumber) == TRUE)
return -1;
(5)使用完成后,釋放信號量
/* Now we release the semaphore. */
CSL_semReleaseSemaphore (semNumber);
(6)釋放操作是否成功
/* Get the status of the semaphore:Semaphore should *not* be acquired. */
if (CSL_semIsFree (semNumber) == FALSE)
return -1;
(7)確保上述操作未出錯
/* Make sure the SEM Module has notreported any errors. */
if (CSL_semGetErrorCode() != 0)
return -1;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。