- 创建信号量
任务可以通过调用OSFlagCreate()来创建一个信号量集。该函数的原型如下:
OS_FLAG_GRP *OSFlagCreate(
OS_FLAGS flags, //信号的初始值
INT8U *err
)
函数OSFlagCreate()的源码如下:
OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err)
{
OS_FLAG_GRP *pgrp;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
if OS_ARG_CHK_EN > 0
if (err == (INT8U *)0) { /* Validate 'err' */
return ((OS_FLAG_GRP *)0);
}
#endif
if (OSIntNesting > 0) { /* See if called from ISR ... */
*err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
return ((OS_FLAG_GRP *)0);
}
OS_ENTER_CRITICAL();
pgrp = OSFlagFreeList; /* Get next free event flag */
if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
/* Adjust free list */
OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
pgrp->OSFlagFlags = flags; /* Set to desired initial value */
pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
#if OS_FLAG_NAME_SIZE > 1
pgrp->OSFlagName[0] = '?';
pgrp->OSFlagName[1] = OS_ASCII_NUL;
#endif
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
} else {
OS_EXIT_CRITICAL();
*err = OS_FLAG_GRP_DEPLETED;
}
return (pgrp); /* Return pointer to event flag group */
}
从函数的源代码中可知,创建信号量集的函数主要做了两项工作:一是从空标志组链表中取下一个标志组,同时给成员OSFlagType和OSFlagFlags赋初值;二是令指向等待任务链表的指针OSFlagWaitList为空指针。
- 请求信号量
任务可以通过调用函数OSFlagPend()请求一个信号量集。函数的原型如下:
OS_FLAGS OSFlagPend(
OS_FLAG_GRP *pgrp,
OS_FLAG flag, //滤波器
INT8U wait_type, //逻辑运算类型
INT16U timeout,
INT8U *err
)
函数参数flags是用来给等待任务链表节点成员OSFlagNodeFlags赋值的;参数 wait_typde应该是表7-1所列举的常数之一。
函数调用成功后,将返回标志组成员OSFlagFlags的值。
任务可以通过调用函数OSFlagAccept()函数无等待地请求一个信号量集。该函数的原型如下:
OS_FLAGS OSFlagAccept(
OS_FLAG_GRP *pgrp,
OS_FLAGS flags,
INT8U wait_type, //逻辑运算类型
INT8U *err
)
- 向信号量集发送信号
任务可以通过调用函数OSFlagPost()向信号量集发送信号量。函数的原型如下:
OS_FLAGS OSFlagPost(
OS_FLAG_GRP *pgrp,
OS_FLAGS flag,
INT8U opt,
INT8U *err
)
所谓任务向信号量集发送信号,就是对信号量集标志组中的信号量进行置1(置位)或置0(复位)的操作。至于对信号量集中的那些信号进行操作,由函数中的参数flags来指定;对指定的信号量置1还是置0,由函数中的参数opt来指定(opt = OS_FLAG_SET为置1操作;opt=OS_FLAG_CLR为置0操作)。
- 查询信号量集的状态
调用函数OSFlagQuery()可以查询一个信号量集的状态。该函数的原型如下:
OS_FLAGS OSFlagQuery(
OS_FLAG_GRP *pgrp,
INT8U *err
)
- 删除信号量集
调用函数OSFlagDel()可以删除一个信号量集。该函数的原型如下:
OS_FLAG_GRP *OSFlagDel(
OS_FLAG_GRP *pgrp,
INT8U opt,
INTU8 *err
)