C66xDSP芯片—semaphore 2 介绍
更新:HHH   时间:2023-1-7


Semaphore 2简介

多核芯片(具体参考相应的数据表文档)包含一个增强型信号量模型来管理C66xCorePacs的共享资源。Semaphore可以强制对一些芯片级的共享资源只可以执行原子操作,进而保证对其的读写的顺序。每个核在拥有资源时,Semaphore模块会对每个核提供专门的中断。

Semaphore不是和硬件资源绑定在一起,而是可以通过软件来将Semaphore灵活的配置到不同的硬件资源。

Semaphore支持8masters,且包含32个可以使用的Semaphores

Semaphore只能被pri ID0~7master访问。这就意味着,只有CorePacs0~7和被CorePacs0~7EDMA 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_semIsFreesemNum

2)获取信号量CSL_semAcquireDirectsemNum

确保该信号量的状态为不被改变,直接访问方式不更新 SEMFLAGS

3semGetFlagsmaster_id

(4) 确保当前正确获得相应信号量的使用,CSL_semIsFreesemNum


。。。。


5)经过处理后,释放信号量。CSL_semReleaseSemaphoresemNum

6)确保已经正确释放,没有产生错误。CSL_semIsFreesemNum;CSL_semGetErrorCode();


2、indirect access

1)确保信号量状态是freeCSL_semIsFreesemNum

2)确保当前的标志寄存器对应比特位不是等待状态,CSL_semGetFlags(MASTER_ID),这是跟直接访问不同的地方,直接访问不用设置和清除标志寄存器。

CSL_semGetFlagsThis 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_semAcquireIndirectsemNum


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;


返回开发技术教程...