UCOS-II API 鍙傝冩墜鍐?- 鐧惧害鏂囧簱 下载本文

参考手册

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; . . } } . . } }