找回密码
 立即注册
Qt开源社区 门户 查看内容

嵌入式学习之uCOS-II基础入门 ---大集合(十四)

2019-2-27 16:58| 发布者: admin| 查看: 1759| 评论: 0

摘要: 来源于微信公众号:嵌入式软件开发学习圈 关注“嵌入式软件开发学习圈”免费获取更多学习教程初始化一个事件控制块,OSEventWaitListInit()当建立一个信号量、邮箱或者消息队列时,相应的建立函数OSSemInit(),OSMb ...
来源于微信公众号:嵌入式软件开发学习圈

关注“嵌入式软件开发学习圈”免费获取更多学习教程



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

当建立一个信号量、邮箱或者消息队列时,相应的建立函数OSSemInit(),OSMboxCreate(),或者OSQCreate()通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化。该函数初始化一个空的等待任务列表,其中没有任何任务。该函数的调用参数只有一个,就是指向需要初始化的事件控制块的指针pevent。



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

当发生了某个事件,该事件等待任务列表中的最高优先级任务(Highest Priority Task – HPT)要置于就绪态时,该事件对应的OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFront()函数调用OSEventTaskRdy()实现该操作。



 详情参看:文档11

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



当某个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用该函数将当前任务从就绪任务表中删除,并放到相应事件的事件控制块的等待任务表中。



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


当在预先指定的时间内任务等待的事件没有发生时,OSTimeTick()函数会因为等待超时而将任务的状态置为就绪。在这种情况下,事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用OSEventTO()来完成这项工作。



 详情参看:文档12



    发送一个信号量, OSSemPost()


它首先检查参数指针pevent指向的任务控制块是否是OSSemCreate()函数建立的,接着检查是否有任务在等待该信号量。



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


当一个任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单地返回,而不是进入睡眠等待状态。这种情况下的操作是由OSSemAccept()函数完成的。



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


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

详情参看:文档13



 用邮箱实现延时,而不使用OSTimeDly()

邮箱的等待超时功能可以被用来模仿OSTimeDly()函数的延时,如程序清单L6.20所示。如果在指定的时间段TIMEOUT内,没有消息到来,Task1()函数将继续执行。这和OSTimeDly(TIMEOUT)功能很相似。

       建立一个消息队列,OSQCreate()

该函数需要一个指针数组来容纳指向各个消息的指针。该指针数组必须声名为void类型。OSQCreate()首先从空闲事件控制块链表中取得一个事件控制块(见图F6.3)[L6.21(1)],并对剩下的空闲事件控制块列表的指针做相应的调整,使它指向下一个空闲事件控制块[L6.21(2)]。



  待一个消息队列中的消息,OSQPend()


OSQPend()函数首先检查事件控制块是否是由OSQCreate()函数建立的[L6.22(1)],接着,该函数检查消息队列中是否有消息可用(即.OSQEntries是否大于0)[L6.22(2)]



 向消息队列发送一个消息(FIFO),OSQPost()


在确认事件控制块是消息队列后[L6.23(1)],OSQPost()函数检查是否有任务在等待该消息队列中的消息[L6.23(2)]



无等待地从一个消息队列中取得消息, OSQAccept()


如果试图从消息队列中取出一条消息,而此时消息队列又为空时,也可以不让调用任务等待而直接返回调用函数。这个操作可以调用OSQAccept()函数来完成



ßßß

  清空一个消息队列, OSQFlush()


OSQFlush()函数允许用户删除一个消息队列中的所有消息,重新开始使用



查询一个消息队列的状态,OSQQuery()


OSQQuery()函数使用户可以查询一个消息队列的当前状态。程序清单L6.27是该函数的源代码。OSQQuery()需要两个参数:一个是指向消息队列的指针pevent。它是在建立一个消息队列时,由OSQCreate()函数返回的;另一个是指向OS_Q_DATA(见uCOS_II.H)数据结构的指针pdata。



 释放一个内存块,OSMemPut()


当用户应用程序不再使用一个内存块时,必须及时地把它释放并放回到相应的内存分区中。这个操作由OSMemPut()函数完成



详情参看:文档18











以上uCOS-II相关文档资料:回复“uCOS-II基础入门文档”即可

uCOS-II基础入门相关链接:

uCOS-II基础入门一介绍:实时系统概念、前后台系统、代码的临界段、任务切换。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(一)

uCOS-II基础入门二介绍:内核概述、调度含义、不可剥夺型内核、可剥夺内核、可重入性的含义。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(二)

uCOS-II基础入门三介绍:任务优先级、静态(动态)优先级、优先级反转、任务优先级分配。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(三)

uCOS-II基础入门四介绍:资源共享时,互斥条件包括:关中断、使用测试并置位指令、禁止做任务切换、利用信号量。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(四)

uCOS-II基础入门五介绍:死锁,同步,事件标记等概念。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(五)

uCOS-II基础入门六介绍:消息邮箱,消息队列,中断延迟,中断响应等概念。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(六)

uCOS-II基础入门七介绍:中断响应时间等概念。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(七)

       

uCOS-II基础入门八介绍:中断响应时间等概念。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(八)

uCOS-II基础入门九介绍:内核结构,任务等概念。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(九)

uCOS-II基础入门十介绍:任务控制块等概念。如需了解更多详情可以点击如下:

嵌入式学习之uCOS-II基础入门(十)

最近和大家分享嵌入式学习之uCOS-II基础入门学习资料。

获取如下uCOS-II基础入门学习资料,关注分享微信公众号“嵌入式软件开发学习圈”,回复“uCOS-II基础入门学习资料”即可。







关注分享微信公众号“嵌入式软件开发学习圈”,获取更多学习资料、以及资讯。你们的关注是我最大动力。




----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:嵌入式软件开发学习圈,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了