实验四 UCOS-II消息队、信号量和软件定时器

实验四 UCOS-II消息队、信号量和软件定时器

ID:38698739

大小:366.00 KB

页数:21页

时间:2019-06-17

实验四 UCOS-II消息队、信号量和软件定时器_第1页
实验四 UCOS-II消息队、信号量和软件定时器_第2页
实验四 UCOS-II消息队、信号量和软件定时器_第3页
实验四 UCOS-II消息队、信号量和软件定时器_第4页
实验四 UCOS-II消息队、信号量和软件定时器_第5页
资源描述:

《实验四 UCOS-II消息队、信号量和软件定时器》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、班级学号姓名同组人实验日期室温大气压成绩实验四UCOS-II消息队、信号量和软件定时器一、实验目的1、掌握UCOS-II中任务管理的函数的应用。2、掌握UCOS-II在STM32平台下对硬件的控制。3、掌握开发UCOS-II应用的程序结构。二、实验步骤1、UCOSII消息队列、信号量集和软件定时器简介1)消息队列使用消息队列可以在任务之间传递多条消息。消息队列由三个部分组成:事件控制块、消息队列和消息。当把事件控制块成员OSEventType的值置为OS_EVENT_TYPE_Q时,该事件控制块描述的就是一个消息队列。消息队列的数据结构如图4.1所示。从图中可以

2、看到,消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员OSEventPtr指向了一个叫做队列控制块(OS_Q)的结构,该结构管理了一个数组MsgTbl[],该数组中的元素都是一些指向消息的指针。队列控制块(OS_Q)的结构定义如下:typedefstructos_q{structos_q*OSQPtr;void**OSQStart;void**OSQEnd;void**OSQIn;void**OSQOut;INT16UOSQSize;INT16UOSQEntries;}OS_Q;其中,可以移动的指针为OSQIn和OSQOut,而指针OSQSt

3、art和OSQEnd只是一个标志(常指针)。当可移动的指针OSQIn或OSQOut移动到数组末尾,也就是与OSQEnd相等时,可移动的指针将会被调整到数组的起始位置OSQStart。于是,这个由消息指针构成的数组就头尾衔接起来形成了一个如图所示的循环队列。在UCOSII初始化时,系统将按文件os_cfg.h中的配置常数OS_MAX_QS定义OS_MAX_QS个队列控制块,并用队列控制块中的指针OSQPtr将所有队列控制块链接为链表。由于这时还没有使用它们,故这个链表叫做空队列控制块链表。在UCOSII中,与消息队列相关的几个函数(未全部列出,下同)。①创建消息队

4、列函数创建一个消息队列首先需要定义一指针数组,然后把各个消息数据缓冲区的首地址存入这个数组中,然后再调用函数OSQCreate来创建消息队列。创建消息队列函数OSQCreate的原型为:OS_EVENT*OSQCreate(void**start,INT16Usize)其中,start为存放消息缓冲区指针数组的地址,size为该数组大小。该函数的返回值为消息队列指针。②请求消息队列函数请求消息队列的目的是为了从消息队列中获取消息。任务请求消息队列需要调用函数OSQPend,该函数原型为:void*OSQPend(OS_EVENT*pevent,INT16Utim

5、eout,INT8U*err)其中,pevent为所请求的消息队列的指针,timeout为任务等待时限,err为错误信息。③向消息队列发送消息函数任务可以通过调用函数OSQPost或OSQPostFront两个函数来向消息队列发送消息。函数OSQPost以FIFO的方式组织消息队列,函数OSQPostFront以LIFO的方式组织消息队列。这两个函数的原型分别为:INT8UOSQPost(OS_EVENT*pevent,void*msg)、INT8UOSQPost(OS_EVENT*pevent,void*msg)。其中,pevent为消息队列的指针,msg为待

6、发消息的指针。2)信号量集在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式。UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集。信号量集所能管理的信号量都是一些二值信号,所有信号量集实质上是一种可以对多个输入的逻辑信号进行基本逻辑运算的组合逻辑。成员OSFlagWaitList是一个指针,当一个信号量集被创建后,这个指针指向了这个信号量集的等待任务链表。与其他前面介绍过的事件不同,信号量集用一个双向链表来组织等待任务,每一个等待任务都是该链表中的一个节点(Node)。标志组OS_FLAG_G

7、RP的成员OSFlagWaitList就指向了信号量集的这个等待任务链表。等待任务链表节点OS_FLAG_NODE的结构如下:typedefstruct{void*OSFlagNodeNext;//指向下一个节点的指针void*OSFlagNodePrev;//指向前一个节点的指针void*OSFlagNodeTCB;//指向对应任务控制块的指针void*OSFlagNodeFlagGrp;//反向指向信号量集的指针OS_FLAGSOSFlagNodeFlags;//信号过滤器INT8UOSFlagNodeWaitType;//定义逻辑运算关系的数据}OS_FL

8、AG_NODE;其中OS

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。