查询一个信号量的当前状态, OSSemQuery()

在应用程序中,用户随时可以调用函数OSSemQuery()[程序清单L6.13]来查询一个信号量的当前状态。该函数有两个参数:一个是指向信号量对应事件控制块的指针pevent。该指针是在生产信号量时,由OSSemCreate()函数返回的;另一个是指向用于记录信号量信息的数据结构OS_SEM_DA...

2017-03-31 09:29:25

阅读数 1309

评论数 0

无等待地请求一个信号量, OSSemAccept()

当一个任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单地返回,而不是进入睡眠等待状态。这种情况下的操作是由OSSemAccept()函数完成的,其源代码见程序清单 L6.12。该函数在最开始也是检查参数指针pevent指向的事件控制块是否是由OSSemCreate()函数建立的[L6...

2017-03-30 10:09:56

阅读数 1151

评论数 0

发送一个信号量, OSSemPost()

程序清单 L6.11是OSSemPost()函数的源代码。它首先检查参数指针pevent指向的任务控制块是否是OSSemCreate()函数建立的[L6.11(1)],接着检查是否有任务在等待该信号量[L6.11(2)]。如果该任务控制块中的.OSEventGrp域不是0,说明有任务正在等待该信号...

2017-03-29 10:08:37

阅读数 640

评论数 0

等待一个信号量, OSSemPend()

程序清单 L6.10是OSSemPend()函数的源代码。它首先检查指针pevent所指的任务控制块是否是由OSSemCreate()建立的[L6.10(1)]。如果信号量当前是可用的(信号量的计数值大于0)[L6.10(2)],将信号量的计数值减1[L6.10(3)],然后函数将“无错”错误代码...

2017-03-28 08:23:26

阅读数 708

评论数 0

建立一个信号量, OSSemCreate()

程序清单 L6.9是OSSemCreate()函数的源代码。首先,它从空闲任务控制块链表中得到一个事件控制块[L6.9(1)],并对空闲事件控制链表的指针进行适当的调整,使它指向下一个空闲的事件控制块[L6.9(2)]。如果这时有任务控制块可用[L6.9(3)],就将该任务控制块的事件类型设置成信...

2017-03-27 11:26:53

阅读数 560

评论数 0

信号量

µC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样µC/OS-II才能支持信号量。 在使用一个信号量之前,首先要建立...

2017-03-26 08:33:01

阅读数 251

评论数 0

由于等待超时而将任务置为就绪态, OSEventTO()

程序清单 L6.8是OSEventTO()函数的源代码。当在预先指定的时间内任务等待的事件没有发生时,OSTimeTick()函数会因为等待超时而将任务的状态置为就绪。在这种情况下,事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用OSEventTO()来完成这...

2017-03-25 09:24:19

阅读数 408

评论数 0

使一个任务进入等待某事件发生状态, OSEventTaskWait()

程序清单 L6.7是OSEventTaskWait()函数的源代码。当某个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用该函数将当前任务从就绪任务表中删除,并放到相应事件的事件控制块的等待任务表中。   程...

2017-03-24 09:09:18

阅读数 774

评论数 0

使一个任务进入就绪态,OSEventTaskRdy()

程序清单 L6.6是函数OSEventTaskRdy()的源代码。当发生了某个事件,该事件等待任务列表中的最高优先级任务(Highest Priority Task – HPT)要置于就绪态时,该事件对应的OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFro...

2017-03-23 10:33:40

阅读数 839

评论数 0

初始化一个事件控制块,OSEventWaitListInit()

程序清单 L6.5是函数OSEventWaitListInit()的源代码。当建立一个信号量、邮箱或者消息队列时,相应的建立函数OSSemInit(),OSMboxCreate(),或者OSQCreate()通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化。...

2017-03-22 08:37:54

阅读数 334

评论数 0

事件控制块ECB

µC/OS-II通过uCOS_II.H 中定义的OS_EVENT数据结构来维护一个事件控制块的所有信息[程序清单L6.1],也就是本章开篇讲到的事件控制块ECB。该结构中除了包含了事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等,还定义了等待该事件的所有任务的...

2017-03-21 09:21:05

阅读数 1614

评论数 0

任务之间的通讯与同步

在µC/OS-II中,有多种方法可以保护任务之间的共享数据和提供任务之间的通讯。在前面的章节中,已经讲到了其中的两种: 一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断。当两个任务或者一个任务和一个中断服务子程序共享某些数据时,可以采用这种...

2017-03-20 09:23:01

阅读数 926

评论数 0

系统时间,OSTimeGet()和OSTimeSet()

无论时钟节拍何时发生,µC/OS-Ⅱ都会将一个32位的计数器加1。这个计数器在用户调用OSStart()初始化多任务和4,294,967,295个节拍执行完一遍的时候从0开始计数。在时钟节拍的频率等于100Hz的时候,这个32位的计数器每隔497天就重新开始计数。用户可以通过调用OSTimeGet...

2017-03-19 13:11:18

阅读数 2842

评论数 0

让处在延时期的任务结束延时,OSTimeDlyResume()

µC/OS-Ⅱ允许用户结束延时正处于延时期的任务。延时的任务可以不等待延时期满,而是通过其它任务取消延时来使自己处于就绪态。这可以通过调用OSTimeDlyResume()和指定要恢复的任务的优先级来完成。实际上,OSTimeDlyResume()也可以唤醒正在等待事件(参看第六章——任务间的通讯...

2017-03-17 08:37:48

阅读数 464

评论数 0

按时分秒延时函数 OSTimeDlyHMSM()

OSTimeDly()虽然是一个非常有用的函数,但用户的应用程序需要知道延时时间对应的时钟节拍的数目。用户可以使用定义全局常数OS_TICKS_PER_SEC(参看OS_CFG.H)的方法将时间转换成时钟段,但这种方法有时显得比较愚笨。笔者增加了OSTimeDlyHMSM()函数后,用户就可以按小...

2017-03-16 09:59:55

阅读数 1633

评论数 0

任务延时函数,OSTimeDly()

µC/OS-Ⅱ提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。实现这个系统服务的函数叫做OSTimeDly()。调用该函数会使µC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用OSTimeDly()后,一旦规定的时间期...

2017-03-15 10:04:49

阅读数 3989

评论数 0

获得有关任务的信息,OSTaskQuery()

用户的应用程序可以通过调用OSTaskQuery()来获得自身或其它应用任务的信息。实际上,OSTaskQuery()获得的是对应任务的OS_TCB中内容的拷贝。用户能访问的OS_TCB的数据域的多少决定于用户的应用程序的配置(参看OS_CFG.H)。由于µC/OS-Ⅱ是可裁剪的,它只包括那些用户...

2017-03-14 09:13:48

阅读数 1013

评论数 0

恢复任务,OSTaskResume()

在上一节中曾提到过,被挂起的任务只有通过调用OSTaskResume()才能恢复。OSTaskResume()函数的代码如程序清单 L4.17所示。因为OSTaskSuspend()不能挂起空闲任务,所以必须得确认用户的应用程序不是在恢复空闲任务[L4.17(1)]。注意,这个测试也可以确保用户不...

2017-03-13 10:08:38

阅读数 292

评论数 0

挂起任务,OSTaskSuspend()

有时候将任务挂起是很有用的。挂起任务可通过调用OSTaskSuspend()函数来完成。被挂起的任务只能通过调用OSTaskResume()函数来恢复。任务挂起是一个附加功能。也就是说,如果任务在被挂起的同时也在等待延时的期满,那么,挂起操作需要被取消,而任务继续等待延时期满,并转入就绪状态。任务...

2017-03-12 18:28:14

阅读数 1521

评论数 1

改变任务的优先级,OSTaskChangePrio()

在用户建立任务的时候会分配给任务一个优先级。在程序运行期间,用户可以通过调用OSTaskChangePrio()来改变任务的优先级。换句话说,就是µC/OS-Ⅱ允许用户动态的改变任务的优先级。 OSTaskChangePrio()的代码如程序清单 L4.15所示。用户不能改变空闲任务的优先级[L...

2017-03-11 19:13:55

阅读数 1021

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭