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;