参考手册
OSSemPost( )
INT8U OSSemPost(OS_EVENT *pevent);
所属文件 调用者 开关量 OS_SEM_EN 任务或中断 OSSemPost()函数置起指定的信号量。如果指定的信号量是零或大于零,OSSemPost()函数递增该信号量并返回。如果有任何任务在等待信号量,最高优先级的任务将得到信号量并进入就绪状态。任务调度函数将进行任务调度,决定当前运行的任务是否仍然为最高优先级的就绪状态的任务。
OS_SEM.C 参数
pevent 是指向信号量的指针。该指针的值在建立该信号量时可以得到。(参考OSSemCreate()函数)。
返回值
OSSemPost()函数的返回值为下述之一: ? OS_NO_ERR :信号量成功的置起 ? OS_SEM_OVF :信号量的值溢出
? OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针。
注意/警告
必须先建立信号量,然后使用。
范例:
OS_EVENT *DispSem;
void TaskX(void *pdata) {
INT8U err;
pdata = pdata; for (;;) { . .
err = OSSemPost(DispSem); if (err == OS_NO_ERR) {
. /* 信号量置起 */ . } else {
. /* 信号量溢出 */
μC/OS-II:实时操作系统内核
. } . . } }
参考手册
OSSemQuery( )
INT8U OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata);
所属文件 调用者 开关量 OS_SEM.C 任务或中断 OS_SEM_EN OSSemQuery()函数用于获取某个信号量的信息。使用OSSemQuery()之前,应用程序需要
先创立类型为OS_SEM_DATA的数据结构,用来保存从信号量的事件控制块中取得的数据。使用OSSemQuery()可以得知是否有,以及有多少任务位于信号量的任务等待队列中(通过查询.OSEventTbl [ ]域),还可以获取信号量的标识号码。OSEventTbl [ ]域的大小由语句:#define constant OS_ENENT_TBL_ SIZE定义(参阅文件uCOS_II.H)。
参数
pevent是一个指向信号量的指针。该指针在信号量建立后返回调用程序[参见OSSemCreat()函数]。
Pdata是一个指向数据结构OS_SEM_DATA的指针,该数据结构包含下述域:
INT16U OSCnt; /* 当前信号量标识号码 */ INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /*信号量等待队列*/ INT8U OSEventGrp;
返回值
OSSemQuery()函数有下述两个返回值: ? OS_NO_ERR 表示调用成功。
? OS_ERR_EVENT_TYPE 表示未向信号量传递指针。
注意/警告
被操作的信号量必须是已经建立了的。
范例:
在本例中,应用程序检查信号量,查找等待队列中优先级最高的任务。
OS_EVENT *DispSem;
void Task (void *pdata) {
OS_SEM_DATA sem_data; INT8U err;
INT8U highest; /* 在信号量中等待的优先级最高的任务 */
μC/OS-II:实时操作系统内核
INT8U x; INT8U y;
pdata = pdata; for (;;) { . .
err = OSSemQuery(DispSem, &sem_data); if (err == OS_NO_ERR) {
if (sem_data.OSEventGrp != 0x00) {
y = OSUnMapTbl[sem_data.OSEventGrp]; x = OSUnMapTbl[sem_data.OSEventTbl[y]]; highest = (y << 3) + x; . . } } . . } }