VxWorks的信号量使用简介
(2011-01-01 18:34:07)
标签:
信号量优先级二进制互斥中断服务程序it |
分类: kernel |
VxWorks主要提供如下API进行信号量的创建、获取和释放:
(1)semBCreate(
):分配并初始化一个二进制信号量,函数原型为:
SEM_ID
semBCreate
(
int
options,
SEM_B_STATE
initialState
) ;
(2)semMCreate( ):分配并初始化一个互斥信号量,函数原型为:
SEM_ID
semBCreate
(
int
options,
SEM_B_STATE
initialState
);
(3)semCCreate( ):分配并初始化一个计数信号量,函数原型为:
SEM_ID
semCCreate
(
int
options,
int
initialCount
) ;
当一个信号量被创建时,它的队列(queue)类型需要被确定。等待信号量的任务队列可以以优先级顺序 (SEM_Q_PRIORITY)或者先到先得方式(SEM_Q_FIFO)排列。
SEM_ID
(
) ;
(2)semMCreate( ):分配并初始化一个互斥信号量,函数原型为:
SEM_ID
(
);
(3)semCCreate( ):分配并初始化一个计数信号量,函数原型为:
SEM_ID
(
) ;
当一个信号量被创建时,它的队列(queue)类型需要被确定。等待信号量的任务队列可以以优先级顺序 (SEM_Q_PRIORITY)或者先到先得方式(SEM_Q_FIFO)排列。
(4)semDelete( ):删除一个自由的信号量,函数原型为:
STATUS
(
);
(5)semTake( ):占有一个信号量,函数原型为:
STATUS
(
);
(6)semGive( ):释放一个信号量,函数原型为:
STATUS
(
);
(7)semFlush( ):解锁所有等待信号量的任务,函数原型为:
STATUS
(
);
二进制信号量:
semTake (semMutex, WAIT_FOREVER);
. .
semGive (semMutex);
SEM_ID syncSem;
myTask(void)
{
}
eventInterruptSvcRout(void)
{
semGive(syncSem);
...
}
{
}
互斥信号量
(1)仅仅被用做互斥,不能提供同步机制;
(2)只能被使用它的任务释放;
(3)中断服务程序(ISR)不能释放它;
(4)不能使用函数semFlush( );
(5)支持使用二进制信号量进行互斥时所不支持的优先级“翻转”。
semTake (semMutex, WAIT_FOREVER);
.
. //critical region, only accessible by a single
task at a time .
semGive (semMutex);
semGive (semMutex);
前一篇:[转]复杂的指针