程序地带

C66xDSP芯片—semaphore 2 介绍


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安装路径 pdk6678packages icslexamples 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;



转载于:https://blog.51cto.com/zjd1988/1344847


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kunkliu/article/details/111246058

随机推荐

JAVA之设计模式(工厂模式+代理模式)

在面向对象编程中,最通常用的方法是一个new操作符产生一个对象实例,new操作符就是yonglai构造对象实例的.但是在一些情况下,new操作符直接生成对象会带来一些问题.举例子来说,许多类型对象的创...

图图嗨 阅读(298)

nginx 多个root_Web应用部署(bottle+uwsgi+nginx)

使用bottle框架开发了一个文档软件自助提取的网站。代码开发完成后,本地测试没有问题,但上线之后非常不稳定,网站使用一段时间后自己卡死了(多个...

weixin_39640195 阅读(537)

nginx 多个root_nginx虚拟主机配置

nginx虚拟机配置什么是虚拟主机?虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务&#x...

weixin_39705931 阅读(746)

Java 8 Stream常用方法

文章目录Stream基础概念1.分类2.常用方法2.1forEach2.2filter2.3distinct2.4Collectors-(Collector工具库)2.4....

WXF_Sir 阅读(970)

nginx 多个root_PHP-fpm和nginx的通信

php有多种运行方式,本章主要阐述php-fpm运行模式下如何与nginxweb服务器进行交互;通信方式linux中nginx服务器和php-fpm的通信方式:...

weixin_39612058 阅读(516)

linux下解决端口被占用问题

linux下解决端口被占用问题参考文章:(1)linux下解决端口被占用问题(2)https://www.cnblogs.com/...

w36680130 阅读(777)