资源描述
参考手册UCOS-II API 参考手册本章提供了C/OS-的用户指南。每一个用户可以调用的内核函数都按字母顺序加以说明,包括:l 函数的功能描述l 函数原型l 函数名称及源代码l 函数使用到的常量l 函数参数l 函数返回值l 特殊说明和注意点OSInit( )Void OSInit(void);所属文件调用者开关量OS_CORE.C启动代码无OSinit()初始化C/OS-,对这个函数的调用必须在调用OSStart()函数之前,而OSStart()函数真正开始运行多任务。参数无返回值无注意/警告必须先于OSStart()函数的调用范例:void main (void) . OSInit(); /* 初始化 uC/OS-II */ . OSStart(); /*启动多任务内核 */OSIntEnter( )Void OSIntEnter(void);所属文件调用者开关量OS_CORE.C中断无OSIntEnter()通知C/OS-一个中断处理函数正在执行,这有助于C/OS-掌握中断嵌套的情况。OSIntEnter()函数通常和OSIntExit()函数联合使用。参数无返回值无注意/警告在任务级不能调用该函数。如果系统使用的处理器能够执行自动的独立执行读取-修改-写入的操作,那么就可以直接递增中断嵌套层数(OSIntNesting),这样可以避免调用函数所带来的额外的开销。范例一:(Intel 80x86的实模式, 在大模式下编译,real mode,large model) ISRx PROC FAR PUSHA ; 保存中断现场 PUSH ES PUSH DS; MOV AX, DGROUP ; 读入数据段 MOV DS, AX; CALL FAR PTR _OSIntEnter ; 通知内核进入中断 . . POP DS ; 恢复中断现场 POP ES POPA IRET ; 中断返回 ISRx ENDP范例二:(Intel 80x86的实模式, 在大模式下编译,, real mode , large model) ISRx PROC FAR PUSHA ; 保存中断现场 PUSH ES PUSH DS; MOV AX, DGROUP ; 读入数据段 MOV DS, AX; INC BYTE PTR _OSIntNesting ; 通知内核进入中断 . . . POP DS ; 恢复中断现场 POP ES POPA IRET ; 中断返回 ISRx ENDPOSIntExit( )Void OSIntExit(void);所属文件调用者开关量OS_CORE.C中断无OSIntExit()通知C/OS-一个中断服务已执行完毕,这有助于C/OS-掌握中断嵌套的情况。通常OSIntExit()和OSIntEnter()联合使用。当最后一层嵌套的中断执行完毕后,如果有更高优先级的任务准备就绪,C/OS-会调用任务调度函数,在这种情况下,中断返回到更高优先级的任务而不是被中断了的任务。参数无返回值无注意/警告在任务级不能调用该函数。并且即使没有调用OSIntEnter()而是使用直接递增OSIntNesting的方法,也必须调用OSIntExit()函数。范例:(Intel 80x86 的实模式, 在大模式下编译, real mode , large model) ISRx PROC FAR PUSHA ; 保存中断现场 PUSH ES PUSH DS . . CALL FAR PTR _OSIntExit ; 通知内核进入中断 POP DS ; 恢复中断现场 POP ES POPA IRET ; 中断返回 ISRx ENDPOSMboxAccept( )Void *OSMboxAccept(OS_EVENT *pevent);所属文件调用者开关量OS_MBOX.C任务或中断OS_MBOX_ENOSMboxAccept()函数查看指定的消息邮箱是否有需要的消息。不同于OSMboxPend()函数,如果没有需要的消息,OSMboxAccept()函数并不挂起任务。如果消息已经到达,该消息被传递到用户任务并且从消息邮箱中清除。通常中断调用该函数,因为中断不允许挂起等待消息。参数pevent 是指向需要查看的消息邮箱的指针。当建立消息邮箱时,该指针返回到用户程序。(参考OSMboxCreate()函数)。返回值如果消息已经到达,返回指向该消息的指针;如果消息邮箱没有消息,返回空指针。注意/警告必须先建立消息邮箱,然后使用。范例:OS_EVENT *CommMbox;void Task (void *pdata) void *msg; pdata = pdata; for (;) msg = OSMboxAccept(CommMbox); /* 检查消息邮箱是否有消息*/ if (msg != (void *)0) . /* 处理消息*/ . else . /*没有消息*/ . . . OSMboxCreate( )OS_EVENT *OSMboxCreate(void *msg);所属文件调用者开关量OS_MBOX.C任务或启动代码OS_MBOX_ENOSMboxCreate()建立并初始化一个消息邮箱。消息邮箱允许任务或中断向其他一个或几个任务发送消息。参数msg 参数用来初始化建立的消息邮箱。如果该指针不为空,建立的消息邮箱将含有消息。返回值指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,返回空指针。注意/警告必须先建立消息邮箱,然后使用。范例:OS_EVENT *CommMbox; void main(void) . . OSInit(); /* 初始化C/OS- */ . . CommMbox = OSMboxCreate(void *)0); /* 建立消息邮箱 */ OSStart(); /* 启动多任务内核 */OSMboxPend( )Void *OSMboxPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );所属文件调用者开关量OS_MBOX.C任务OS_MBOX_ENOSMboxPend()用于任务等待消息。消息通过中断或另外的任务发送给需要的任务。消息是一个以指针定义的变量,在不同的程序中消息的使用也可能不同。如果调用OSMboxPend()函数时消息邮箱已经存在需要的消息,那么该消息被返回给OSMboxPend()的调用者,消息邮箱中清除该消息。如果调用OSMboxPend()函数时消息邮箱中没有需要的消息,OSMboxPend()函数挂起当前任务直到得到需要的消息或超出定义等待超时的时间。如果同时有多个任务等待同一个消息,C/OS-默认最高优先级的任务取得消息并且任务恢复执行。一个由OSTaskSuspend()函数挂起的任务也可以接受消息,但这个任务将一直保持挂起状态直到通过调用OSTaskResume()函数恢复任务的运行。参数pevent 是指向即将接受消息的消息邮箱的指针。该指针的值在建立该消息邮箱时可以得到。(参考OSMboxCreate()函数)。Timeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的消息时恢复运行。如果该值为零表示任务将持续的等待消息。最大的等待时间为65,535个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差,因为只有在一个时钟节拍结束后才会减少定义的等待超时时钟节拍。Err 是指向包含错误码的变量的指针。OSMboxPend()函数返回的错误码可能为下述几种:l OS_NO_ERR :消息被正确的接受。l OS_TIMEOUT :消息没有在指定的周期数内送到。l OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但C/OS-仍然包含了检测这种情况的功能。l OS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针。返回值OSMboxPend()函数返回接受的消息并将 *err置为OS_NO_ERR。如果没有在指定数目的时钟节拍内接受到需要的消息,OSMboxPend()函数返回空指针并且将 *err设置为OS_TIMEOUT。注意/警告必须先建立消息邮箱,然后使用。不允许从中断调用该函数。范例:OS_EVENT *CommMbox;void CommTask(void *pdata) INT8U err; void *msg; pdata = pdata; for (;) . . msg = OSMboxPend(CommMbox, 10, &err); if (err = OS_NO_ERR) . . /* 消息正确的接受 */ . else . . /* 在指定时间内没有接受到消息*/ . . . OSMboxPost( )INT8U OSMboxPost(OS_EVENT *pevent, void *msg);所属文件调用者开关量OS_MBOX.C任务或中断OS_MBOX_ENOSMboxPost()函数通过消息邮箱向任务发送消息。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。如果消息邮箱中已经存在消息,返回错误码说明消息邮箱已满。OSMboxPost()函数立即返回调用者,消息也没有能够发到消息邮箱。如果有任何任务在等待消息邮箱的消息,最高优先级的任务将得到这个消息。如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务将得到消息而恢复执行,也就是说,发生了一次任务切换。参数pevent 是指向即将接受消息的消息邮箱的指针。该指针的值在建立该消息邮箱时可以得到。(参考OSMboxCreate()函数)。Msg 是即将实际发送给任务的消息。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。不允许传递一个空指针,因为这意味着消息邮箱为空。返回值OSMboxPost()函数的返回值为下述之一:l OS_NO_ERR :消息成功的放到消息邮箱中。l OS_MBOX_FULL :消息邮箱已经包含了其他消息,不空。l OS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针。注意/警告必须先建立消息邮箱,然后使用。不允许传递一个空指针,因为这意味着消息邮箱为空。范例:OS_EVENT *CommMbox;INT8U CommRxBuf100;void CommTaskRx(void *pdata) INT8U err; pdata = pdata; for (;) . err = OSMboxPost(CommMbox, (void *)&CommRxBuf0); . OSMboxQuery( )INT8U OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *pdata);所属文件调用者开关量OS_MBOX.C任务或中断OS_MBOX_ENOSMboxQuery()函数用来取得消息邮箱的信息。用户程序必须分配一个OS_MBOX_DATA的数据结构,该结构用来从消息邮箱的事件控制块接受数据。通过调用OSMboxQuery()函数可以知道任务是否在等待消息以及有多少个任务在等待消息,还可以检查消息邮箱现在的消息。参数pevent 是指向即将接受消息的消息邮箱的指针。该指针的值在建立该消息邮箱时可以得到。(参考OSMboxCreate()函数)。Pdata 是指向OS_MBOX_DATA数据结构的指针,该数据结构包含下述成员:Void *OSMsg;/* 消息邮箱中消息的复制 */INT8U OSEventTblOS_EVENT_TBL_SIZE;/*消息邮箱等待队列的复制*/INT8U OSEventGrp;返回值OSMboxQuery()函数的返回值为下述之一:l OS_NO_ERR :调用成功l OS_ERR_EVENT_TYPE :pevent 不是指向消息邮箱的指针。注意/警告必须先建立消息邮箱,然后使用。范例:OS_EVENT *CommMbox;void Task (void *pdata) OS_MBOXDATA mbox_data; INT8U err; pdata = pdata; for (;) . err = OSMboxQuery(CommMbox, &mbox_data); if (err = OS_NO_ERR) . /* 如果mbox_data.OSMsg为非空指针,说明消息邮箱非空*/ . OSMemCreate( )OS_MEM *OSMemCreate( void *addr, INT32U nblks ,INT32U blksize, INT8U *err);所属文件调用者开关量OS_MEM.C任务或初始代码OS_/MEM_ENOSMemCreate()函数建立并初始化一块内存区。一块内存区包含指定数目的大小确定的内存块。程序可以包含这些内存块并在用完后释放回内存区。参数addr 建立的内存区的起始地址。内存区可以使用静态数组或在初始化时使用malloc()函数建立。Nblks 需要的内存块的数目。每一个内存区最少需要定义两个内存块。Blksize 每个内存块的大小,最少应该能够容纳一个指针。Err 是指向包含错误码的变量的指针。OSMemCreate()函数返回的错误码可能为下述几种:OS_NO_ERR :成功建立内存区。OS_MEM_INVALID_PART :没有空闲的内存区。OS_MEM_INVALID_BLKS :没有为每一个内存区建立至少两个内存块。OS_MEM_INVALID_SIZE :内存块大小不足以容纳一个指针变量。返回值OSMemCreate()函数返回指向内存区控制块的指针。如果没有剩余内存区,OSMemCreate()函数返回空指针。注意/警告必须首先建立内存区,然后使用。范例:OS_MEM *CommMem;INT8U CommBuf16128;void main(void) INT8U err; OSInit(); /* 初始化C/OS- */ . CommMem = OSMemCreate(&CommBuf00, 16, 128, &err); . OSStart(); /* 启动多任务内核 */OSMemGet( )Void *OSMemGet(OS_MEM *pmem, INT8U *err);所属文件调用者开关量OS_MEM.C任务或中断OS_MEM_ENOSMemGet()函数用于从内存区分配一个内存块。用户程序必须知道所建立的内存块的大小,同时用户程序必须在使用完内存块后释放内存块。可以多次调用OSMemGet()函数。参数pmem 是指向内存区控制块的指针,可以从OSMemCreate()函数返回得到。Err 是指向包含错误码的变量的指针。OSMemGet(函数返回的错误码可能为下述几种:l OS_NO_ERR :成功得到一个内存块。l OS_MEM_NO_FREE_BLKS :内存区已经没有空间分配给内存块。返回值OSMemGet()函数返回指向内存区块的指针。如果没有空间分配给内存块,OSMemGet()函数返回空指针。注意/警告必须首先建立内存区,然后使用。范例:OS_MEM *CommMem;void Task (void *pdata) INT8U *msg; pdata = pdata; for (;) msg = OSMemGet(CommMem, &err); if (msg != (INT8U *)0) . /* 内存块已经分配 */ . . OSMemPut( )INT8U OSMemPut( OS_MEM *pmem, void *pblk);所属文件调用者开关量OS_MEM.C任务或中断OS_MEM_ENOSMemPut()函数释放一个内存块,内存块必须释放回原先申请的内存区。参数pmem 是指向内存区控制块的指针,可以从OSMemCreate()函数 返回得到。Pblk 是指向将被释放的内存块的指针。返回值OSMemPut()函数的返回值为下述之一:OS_NO_ERR :成功释放内存块OS_MEM_FULL :内存区已经不能再接受更多释放的内存块。这种情况说明用户程序出现了错误,释放了多于用OSMemGet()函数得到的内存块。注意/警告必须首先建立内存区,然后使用。内存块必须释放回原先申请的内存区。范例:OS_MEM *CommMem;INT8U *CommMsg;void Task (void *pdata) INT8U err; pdata = pdata; for (;) err = OSMemPut(CommMem, (void *)CommMsg); if (err = OS_NO_ERR) . /* 释放内存块 */ . OSMemQuery( )INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);所属文件调用者开关量OS_MEM.C任务或中断OS_MEM_ENOSMemQuery()函数得到内存区的信息。该函数返回OS_MEM结构包含的信息,但使用了一个新的OS_MEM_DATA的数据结构。OS_MEM_DATA数据结构还包含了正被使用的内存块数目的域。参数pmem 是指向内存区控制块的指针,可以从OSMemCreate()函数 返回得到。Pdata 是指向OS_MEM_DATA数据结构的指针,该数据结构包含了以下的域:Void OSAddr;/*指向内存区起始地址的指针*/VoidOSFreeList;/*指向空闲内存块列表起始地址的指针*/INT32UOSBlkSize;/*每个内存块的大小*/INT32UOSNBlks;/*该内存区的内存块总数*/INT32UOSNFree;/*空闲的内存块数目*/INT32UOSNUsed; /*使用的内存块数目*/返回值OSMemQuery()函数返回值总是OS_NO_ERR。注意/警告必须首先建立内存区,然后使用。范例:OS_MEM *CommMem;void Task (void *pdata) INT8U err; OS_MEM_DATA mem_data; pdata = pdata; for (;) . err = OSMemQuery(CommMem, &mem_data); . OSQAccept( )Void *OSQAccept(OS_EVENT *pevent);所属文件调用者开关量OS_Q.C任务或中断OS_Q_ENOSQAccept()函数检查消息队列中是否已经有需要的消息。不同于OSQPend()函数,如果没有需要的消息,OSQAccept()函数并不挂起任务。如果消息已经到达,该消息被传递到用户任务。通常中断调用该函数,因为中断不允许挂起等待消息。参数pevent 是指向需要查看的消息队列的指针。当建立消息队列时,该指针返回到用户程序。(参考OSMboxCreate()函数)。返回值如果消息已经到达,返回指向该消息的指针;如果消息队列没有消息,返回空指针。注意/警告必须先建立消息队列,然后使用。范例:OS_EVENT *CommQ;void Task (void *pdata) void *msg; pdata = pdata; for (;) msg = OSQAccept(CommQ); /* 检查消息队列 */ if (msg != (void *)0) . /* 处理接受的消息 */ . else . /* 没有消息 */ . OSQCreate( )OS_EVENT *OSQCreate( void *start, INT8U size);所属文件调用者开关量OS_Q.C任务或启动代码OS_Q_ENOSQCreate()函数建立一个消息队列。任务或中断可以通过消息队列向其他一个或多个任务发送消息。消息的含义是和具体的应用密切相关的。参数start 是消息内存区的基地址,消息内存区是一个指针数组。Size 是消息内存区的大小。返回值OSQCreate()函数返回一个指向消息队列事件控制块的指针。如果没有空余的事件空闲块,OSQCreate()函数返回空指针。注意/警告必须先建立消息队列,然后使用。范例:OS_EVENT *CommQ;void *CommMsg10;void main(void) OSInit(); /* 初始化C/OS- */ . . CommQ = OSQCreate(&CommMsg0, 10); /*建立消息队列 */ . OSStart(); /* 启动多任务内核 */OSQFlush( )INT8U *SOQFlush(OS_EVENT *pevent);所属文件调用者开关量OS_Q.C任务或中断OS_Q_ENOSQFlush()函数清空消息队列并且忽略发送往队列的所有消息。不管队列中是否有消息,这个函数的执行时间都是相同的。参数pevent 是指向消息队列的指针。该指针的值在建立该队列时可以得到。(参考OSQCreate()函数)。返回值OSQFlush()函数的返回值为下述之一:l OS_NO_ERR :消息队列被成功清空l OS_ERR_EVENT_TYPE :试图清除不是消息队列的对象注意/警告必须先建立消息队列,然后使用。范例:OS_EVENT *CommQ;void main(void) INT8U err; OSInit(); /* 初始化C/OS- */ . err = OSQFlush(CommQ); . OSStart(); /* 启动多任务内核 */OSQPend( )Void *OSQPend( OS_EVENT *pevent, INT16U timeout, INT8U *err);所属文件调用者开关量OS_Q.C任务OS_Q_ENOSQPend()函数用于任务等待消息。消息通过中断或另外的任务发送给需要的任务。消息是一个以指针定义的变量,在不同的程序中消息的使用也可能不同。如果调用OSQPend()函数时队列中已经存在需要的消息,那么该消息被返回给OSQPend()函数的调用者,队列中清除该消息。如果调用OSQPend()函数时队列中没有需要的消息,OSQPend()函数挂起当前任务直到得到需要的消息或超出定义的超时时间。如果同时有多个任务等待同一个消息,C/OS-默认最高优先级的任务取得消息并且任务恢复执行。一个由OSTaskSuspend()函数挂起的任务也可以接受消息,但这个任务将一直保持挂起状态直到通过调用OSTaskResume()函数恢复任务的运行。参数pevent 是指向即将接受消息的队列的指针。该指针的值在建立该队列时可以得到。(参考OSMboxCreate()函数)。Timeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的消息时恢复运行状态。如果该值为零表示任务将持续的等待消息。最大的等待时间为65535个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差,因为只有在一个时钟节拍结束后才会减少定义的等待超时时钟节拍。Err 是指向包含错误码的变量的指针。OSQPend()函数返回的错误码可能为下述几种:l OS_NO_ERR :消息被正确的接受。l OS_TIMEOUT :消息没有在指定的周期数内送到。l OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但C/OS-仍然包含了检测这种情况的功能。l OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。返回值OSQPend()函数返回接受的消息并将 *err置为OS_NO_ERR。如果没有在指定数目的时钟节拍内接受到需要的消息,OSQPend()函数返回空指针并且将 *err设置为OS_TIMEOUT。注意/警告必须先建立消息邮箱,然后使用。不允许从中断调用该函数。范例:OS_EVENT *CommQ;void CommTask(void *data) INT8U err; void *msg; pdata = pdata; for (;) . . msg = OSQPend(CommQ, 100, &err); if (err = OS_NO_ERR) . . /* 在指定时间内接受到消息 */ . else . . /* 在指定的时间内没有接受到指定的消息 */ . OSQPost( )INT8U OSQPost(OS_EVENT *pevent, void *msg);所属文件调用者开关量OS_Q.C任务或中断OS_Q_ENOSQPost()函数通过消息队列向任务发送消息。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。如果队列中已经存满消息,返回错误码。OSQPost()函数立即返回调用者,消息也没有能够发到队列。如果有任何任务在等待队列中的消息,最高优先级的任务将得到这个消息。如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务将得到消息而恢复执行,也就是说,发生了一次任务切换。消息队列是先入先出(FIFO)机制的,先进入队列的消息先被传递给任务。参数pevent 是指向即将接受消息的消息队列的指针。该指针的值在建立该队列时可以得到。(参考OSQCreate()函数)。Msg 是即将实际发送给任务的消息。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。不允许传递一个空指针。返回值OSQPost()函数的返回值为下述之一:l OS_NO_ERR :消息成功的放到消息队列中。l OS_MBOX_FULL :消息队列已满。l OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。注意/警告必须先建立消息队列,然后使用。不允许传递一个空指针。范例:OS_EVENT *CommQ;INT8U CommRxBuf100;void CommTaskRx(void *pdata) INT8U err; pdata = pdata; for (;) . . err = OSQPost(CommQ, (void *)&CommRxBuf0); if (err = OS_NO_ERR) . /* 将消息放入消息队列 */ . else . /* 消息队列已满 */ . . . OSQPostFront( )INT8U OSQPostFront(OS_EVENT *pevent, void *msg);所属文件调用者开关量OS_Q.C任务或中断OS_Q_ENOSQPostFront()函数通过消息队列向任务发送消息。OSQPostFront()函数和OSQPost()函数非常相似,不同之处在于OSQPostFront()函数将发送的消息插到消息队列的最前端。也就是说,OSQPostFront()函数使得消息队列按照后入先出(LIFO)的方式工作,而不是先入先出(FIFO)。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。如果队列中已经存满消息,返回错误码。OSQPost()函数立即返回调用者,消息也没能发到队列。如果有任何任务在等待队列中的消息,最高优先级的任务将得到这个消息。如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务将得到消息而恢复执行,也就是说,发生了一次任务切换参数pevent 是指向即将接受消息的消息队列的指针。该指针的值在建立该队列时可以得到。(参考OSQCreate()函数)。Msg 是即将实际发送给任务的消息。消息是一个指针长度的变量,在不同的程序中消息的使用也可能不同。不允许传递一个空指针。返回值OSQPost()函数的返回值为下述之一:l OS_NO_ERR :消息成功的放到消息队列中。l OS_MBOX_FULL :消息队列已满。l OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。注意/警告必须先建立消息队列,然后使用。不允许传递一个空指针。范例:OS_EVENT *CommQ;INT8U CommRxBuf100;void CommTaskRx(void *pdata) INT8U err; pdata = pdata; for (;) . err = OSQPostFront(CommQ, (void *)&CommRxBuf0); if (err = OS_NO_ERR) . /* 将消息放入消息队列 */ else . /* 消息队列已满 */ . . OSQQuery( )INT8U OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata);所属文件调用者开关量OS_Q.C任务或中断OS_Q_ENOSQQuery()函数用来取得消息队列的信息。用户程序必须建立一个OS_Q_DATA的数据结构,该结构用来保存从消息队列的事件控制块得到的数据。通过调用OSQQuery()函数可以知道任务是否在等待消息、有多少个任务在等待消息、队列中有多少消息以及消息队列可以容纳的消息数。OSQQuery()函数还可以得到即将被传递给任务的消息的信息。参数pevent 是指向即将接受消息的消息邮箱的指针。该指针的值在建立该消息邮箱时可以得到。(参考OSQCreate()函数)。Pdata 是指向OS_Q_DATA数据结构的指针,该数据结构包含下述成员:Void *OSMsg;/* 下一个可用的消息*/INT16U OSNMsgs;/* 队列中的消息数目*/INT16UOSQSize;/* 消息队列的大小 */INT8U OSEventTblOS_EVENT_TBL_SIZE;/* 消息队列的等待队列*/INT8U OSEventGrp;返回值OSQQuery()函数的返回值为下述之一:l OS_NO_ERR :调用成功l OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。注意/警告必须先建立消息队列,然后使用。范例:OS_EVENT *CommQ;void Task (void *pdata) OS_Q_DATA qdata; INT8U err; pdata = pdata; for (;) . . err = OSQQuery(CommQ, &qdata); if (err = OS_NO_ERR) . /* 取得消息队列的信息 */ . . OSSchedLock( )Void OSSchedLock(void);所属文件调用者开关量OS_CORE.C任务或中断N/AOSSchedLock()函数停止任务调度,只有使用配对的函数OSSchedUnlock()才能重新开始内核的任务调度。调用OSSchedLock()函数的任务独占CPU,不管有没有其他高优先级的就绪任务。在这种情况下,中断仍然可以被接受和执行(中断必须允许)。OSSchedLock()函数和OSSchedUnlock()函数必须配对使用。C/OS-可以支持多达254层的OSSchedLock()函数嵌套,必须调用同样次数的OSSchedUnlock()函数才能恢复任务调度。参数无返回值无注意/警告任务调用了OSSchedLock()函数后,决不能再调用可能导致当前任务挂起的系统函数:OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因为任务调度已经被禁止,其他任务不能运行,这会导致系统死锁。范例:void TaskX(void *pdata) pdata = pdata; for (;) . OSSchedLock(); /* 停止任务调度 */ . . /* 不允许被打断的执行代码 */ . OSSchedUnlock(); /* 恢复任务调度 */ . OSSchedUnlock( )Void OSSchedUnlock(void);所属文件调用者开关量OS_CORE.C任务或中断N/A在调用了OSSchedLock()函数后,OSSchedUnlock()函数恢复任务调度。参数无返回值无注意/警告任务调用了OSSchedLock()函数后,决不能再调用可能导致当前任务挂起的系统函数:OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因为任务调度已经被禁止,其他任务不能运行,这会导致系统死锁。范例:void TaskX(void *pdata) pdata = pdata; for (;) . OSSchedLock(); /* 停止任务调度 */ . . /* 不允许被打断的执行代码 */ . OSSchedUnlock(); /* 恢复任务调度 */ . OSSemAccept( )INT16U *OSSemAccept(OS_EVENT *pevent);所属文件调用者开关量OS_SEM.C任务或中断OS_SEM_ENOSSemAccept()函数查看设备是否就绪或事件是否发生。不同于OSSemPend()函数,如果设备没有就绪,OSSemAccept()函数并不挂起任务。中断调用该函数来查询信号量。参数pevent 是指向需要查询的设备的信号量。当建立信号量时,该指针返回到用户程序。(参考OSSemCreate()函数)。返回值当调用OSSemAccept()函数时,设备信号量的值大于零,说明设备就绪,这个值被返回调用者,设备信号量的值减一。如果调用OSSemAccept()函数时,设备信号量的值等于零,说明设备没有就绪,返回零。注意/警告必须先建立信号量,然后使用。范例:OS_EVENT *DispSem;void Task (void *pdata) INT16U value; pdata = pdata; for (;) value = OSSemAccept(DispSem); /*查看设备是否就绪或事件是否发生 */ if (value 0) . /* 就绪,执行处理代码 */ . . . OSSemCreate( )OS_EVENT *OSSemCreate(WORD value);所属文件调用者开关量OS_SEM.C任务或启动代码OS_SEM_ENOSSemCreate()函数建立并初始化一个信号量。信号量的作用如下:l 允许一个任务和其他任务或者中断同步。l 取得设备的使用权l 标志事件的发生参数value 参数是建立的信号量的初始值,可以取0到65535之间的任何值。返回值OSSemCreate()函数返回指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,OSSemCreate()函数返回空指针。注意/警告必须先建立信号量,然后使用。范例:OS_EVENT *DispSem;void main(void) . . OSInit(); /* 初始化C/OS- */ . . DispSem = OSSemCreate(1); /* 建立显示设备的信号量 */
展开阅读全文