主页 文档 下载 莱特 沙龙 English

RTESM文档
RTEMS精彩应用
RTEMS版权说明
其他RTOS
ARM/DSP专区
AVR/FPGA/PCB
嵌入式文件系统
ARM AVR仿真器DIY
莱特电子工作室
联系我们
 


信号量管理函数

作者 Ray

RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray

13.4: 函数

SEMAPHORE_CREATE- 创建一个信号量

SEMAPHORE_IDENT- 拿一个信号量的 ID 标识

SEMAPHORE_DELETE- 删除一个信号量

SEMAPHORE_OBTAIN- 获得一个信号量

SEMAPHORE_RELEASE- 释放一个信号量

SEMAPHORE_FLUSH- 消除所有因某个信号量而阻塞的任务的阻塞状态函数

13.4.1: SEMAPHORE_CREATE- 创建一个信号量

函数原型 :

rtems_status_code rtems_semaphore_create(

rtems_name name,

rtems_unsigned32 count,

rtems_attribute attribute_set,

rtems_task_priority priority_ceiling,

rtems_id *id

);

返回值代表的状态 :

RTEMS_SUCCESSFUL- 成功地创建信号量

RTEMS_INVALID_NAME- 无效的任务名字

RTEMS_INVALID_ADDRESS- ID 标识是空值

RTEMS_TOO_MANY- 已经创建太多信号量

RTEMS_NOT_DEFINED- 属性集没有定义

RTEMS_INVALID_NUMBER- 二进位信号量初始化错误 ( 只能初始化为 0 和 1)

RTEMS_MP_NOT_CONFIGURED- 多处理器未配置 ( 用于全局的信号量 )

RTEMS_TOO_MANY- 太多全局对象

描述 :

该函数在本地结点创建信号量。创建的信号量名称为 name, 信号量的初始值为 count 。为了控制和维护信号量,RTEMS创建了任务控制块(SMCB)。*id是函数返回了新创建的信号量的ID。

如果attribute_set中包含了PRIORITY,那么等待该信号量的任务将按照优先级排序,如果包含了FIFO那么就会按照任务的进入次序。

注意:

优先级继承和优先级高度算法只对本地的二进制信号量才有效。

下列的信号量属性常量被 RTEMS 定义:

RTEMS_FIFO- 等待信号量的任务按照 FIFO 排序 (默认)

RTEMS_PRIORITY- 等待信号量的任务按照优先级排序

RTEMS_BINARY_SEMAPHORE- 信号量是二进制信号量

RTEMS_COUNTING_SEMAPHORE- 信号量是计数信号量(默认)

RTEMS_SIMPLE_BINARY_SEMAPHORE- 二进制信号量,并且不允许嵌套,允许对锁住的信号量进行删除操作。

RTEMS_NO_INHERIT_PRIORITY- 不使用优先级继承 (默认)

RTEMS_INHERIT_PRIORITY- 使用优先级继承

RTEMS_PRIORITY_CEILING- 使用优先级高度

RTEMS_NO_PRIORITY_CEILING- 不使用优先级高度 (默认)

RTEMS_LOCAL- 本地任务 (默认)

RTEMS_GLOBAL- 全局任务

除非远端节点参予了在本地节点创建信号量,否则信号量不能作为全局信号量。如果创建了全局的信号量,那么信号量的名称和 ID标识会传送到系统中每个结点。

全局对象的总数,包括信号量,被配置表中 maximum_global_objects字段限制。

13.4.2: SEMAPHORE_IDENT-获取信号量的 ID标识

函数原型:

rtems_status_code rtems_semaphore_ident(

rtems_name name,

rtems_unsigned32 node,

rtems_id *id

);

返回值代表的状态:

RTEMS_SUCCESSFUL- 成功地获取信号量ID

RTEMS_INVALID_NAME- 无法找到符合name的信号量

RTEMS_INVALID_NODE- 无效的结点 ID标识

描述:

该函数获得与信号量名字对应的信号量 ID标识。如果信号量名字不唯一,那么函数返回的是找到的第一个信号量 ID。

注意:

如果node是RTEMS_SEARCH_ALL_NODES,那么,首先搜寻本地节点,然后搜索其他结点。搜索其它节点的时候按照节点的编号由小到大搜索。

如果node的编号不是本地节点,那么只会在node指定的节点上搜索。

该函数不会在远程节点上创建任务,搜索只是在本地的全局对象表中进行。

13.4.3: SEMAPHORE_DELETE- 删除一个信号量

函数原型:

rtems_status_code rtems_semaphore_delete(

rtems_id id

);

返回值代表的状态:

RTEMS_SUCCESSFUL- 成功地删除信号量

RTEMS_INVALID_ID- 无效的信号量ID标识

RTEMS_ILLEGAL_ON_REMOTE_OBJECT- 不能够删除远程节点上的信号量

RTEMS_RESOURCE_IN_USE- 二进制信号量正在使用中

描述:

该函数删除被ID标识指定的信号量。因为该信号量而阻塞的任务将会变为就绪状态,信号量的SMCB将会被RTEMS回收。

注意:

调用该函数的任务可能被抢占,这是因为删除信号量后产生的就绪任务优先级高而。如果就绪的任务是远程任务,那么就不会发生抢占。

调用删除函数的可以不是创建信号量的任务,只要是在本地节点上知道信号量ID的任务都可以调用该函数。

当一个全局信号量被删除,信号量的ID标识将会传递给系统中的每一个节点。

信号量必须驻扎在本地节点上,即使信号量使用RTEMS_GLOBAL参数创建。

用于代表远程任务的代理,在信号量删除后会被删除。

13.4.4: SEMAPHORE_OBTAIN-获取一个信号量

函数原型:

rtems_status_code rtems_semaphore_obtain(

rtems_id id,

rtems_unsigned32 option_set,

rtems_interval timeout

);

返回值代表的状态:

RTEMS_SUCCESSFUL- 成功地获得信号量

RTEMS_UNSATISFIED- 信号量无法获取

RTEMS_TIMEOUT- 信号量的计时器超时

RTEMS_OBJECT_WAS_DELETED- 信号量已经被删

RTEMS_INVALID_ID- 无效信号量 ID标识

描述:

该函数获得ID标识指定的信号量。 如果信号量被占用,option_set中的RTEMS_WAIT 和RTEMS_NO_WAIT 分量表明获取函数是否愿意等待。

如果任务选择立即返回,并且当前的信号量是0或者负数,那么返回值表明信号量不可用,如果调用任务选择等待且信号量被占用,那么函数将信号量的值再减去一,任务进入该信号量的等待队列。队列的排队规则由信号量创建时的属性集合决定,可以按照FIFO或者优先级排列。如果二进位的信号量使用 RTEMS_INHERIT_PRIORITY 属性创建, 那么就必须保证得到信号量的任务优先级比任意一个阻塞任务的优先级高。如果二进制信号量使用RTEMS_PRIORITY_CEILING属性创建,那么获取信号量的任务优先级必须比指定的优先级高度高。

timeout参数指定了任务愿意阻塞等待的最长时间。时间到达后,函数返回,如果timeout被设置成RTEMS_NO_TIMEOUT,那么任务将一直等待。如果设置了RTEMS_NO_WAIT,那么timeout分量将会被忽略。

注意:

下面是信号量获取选项定义:

RTEMS_WAIT- 任务将会等候信号量 (默认)

RTEMS_NO_WAIT- 任务不会等候

尝试获得一个远程的全局信号量会向远端节点发出请求,如果信号量被占用,而且没有指定 RTEMS_NO_WAIT,那么任务会被阻塞,直到信号量被释放。此时会在遥远的结点上建立代理代表发出请求的任务,直到信号量被释放。

如果要使用定时,必须要有时钟支持。

13.4.5: SEMAPHORE_RELEASE- 释放一个信号量

函数原型:

rtems_status_code rtems_semaphore_release(

rtems_id id

);

返回值代表的状态:

RTEMS_SUCCESSFUL- 信号量成功释放

RTEMS_INVALID_ID- 无效的信号量ID标识

RTEMS_NOT_OWNER_OF_RESOURCE- 调用者并不拥有信号量

描述:

该函数释放被 ID标识指定的信号量。信号量计数随之增加。如果计数是零或负数,那么在该信号量的等待队列上的第一个任务被解除阻塞。如果当前任务允许抢占,而且新的就绪任务优先级较高,可能会剥夺当前任务的CPU。

注意:

释放一个远端结点上的全局信号量将会对远端节点产生一个释放信号量的请求。

如果被解除阻塞的任务处于远程节点,那么信号量的也会传递给远程节点,任务解除阻塞时,代表该任务的代理也会被删除。

对于本地的二进制信号量来说,如果使用了优先级继承或优先级最高级算法,那么在对信号量最外层的引用被释放时,任务的优先级也会降低。

13.4.6: SEMAPHORE_FLUSH-消除所有因某个信号量而阻塞的任务的阻塞状态函数原型:

rtems_status_code rtems_semaphore_flush(

rtems_id id

);

返回值代表的状态:

RTEMS_SUCCESSFUL- 消除成功

RTEMS_INVALID_ID- 无效信号量 ID 标识

RTEMS_ILLEGAL_ON_REMOTE_OBJECT- 不支持对远端节点的操作

描述:

该函数解除因为ID标识指定的信号量而阻塞的所有任务的阻塞状态。 信号量的计数值不会改变,因为该操作而返回的任务获取到的返回状态是RTEMS_UNSATISFIED。

被解除阻塞的任务可能会抢占调用者任务。

如果解除阻塞的任务来自一个不同的结点上,那么任务解除阻塞的同时,任务在远端节点上的代理也会被删除。

 

 
嵌入式软硬件设计咨询 • 8位 16位 32位 64位 RISC DSP
主页文章 方案 产品 下载反馈
 
2004 RTEMS.NET 版权所有