- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
班 级 学号 姓 名 同组人
实验日期 室温 大气压 成 绩
实验四 UCOS-II消息队、信号量和软件定时器
一、实验目的
1、掌握UCOS-II中任务管理的函数的应用。
2、掌握UCOS-II在STM32平台下对硬件的控制。
3、掌握开发UCOS-II应用的程序结构。
二、实验步骤
1、UCOSII消息队列、信号量集和软件定时器简介
1)消息队列
使用消息队列可以在任务之间传递多条消息。消息队列由三个部分组成:事件控制块、消息队列和消息。当把事件控制块成员OSEventType的值置为OS_EVENT_TYPE_Q时,该事件控制块描述的就是一个消息队列。 消息队列的数据结构如图4.1所示。从图中可以看到,消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员
OSEventPtr指向了一个叫做队列控制块(OS_Q)的结构,该结构管理了一个数组MsgTbl[],该数组中的元素都是一些指向消息的指针。
队列控制块(OS_Q)的结构定义如下:
typedef struct os_q
{
struct os_q *OSQPtr;
void **OSQStart;
void **OSQEnd;
void**OSQIn;
void **OSQOut;
INT16U OSQSize;
INT16U OSQEntries;
} OS_Q;
其中,可以移动的指针为OSQIn和OSQOut,而指针OSQStart和OSQEnd只是一个标志
(常指针)。当可移动的指针OSQIn或OSQOut移动到数组末尾,也就是与OSQEnd相等时,可移动的指针将会被调整到数组的起始位置OSQStart。于是,这个由消息指针构成的数组就头尾衔接起来形成了一个如图所示的循环队列。
在UCOSII初始化时,系统将按文件os_cfg.h中的配置常数OS_MAX_QS定义OS_MAX_QS个队列控制块,并用队列控制块中的指针OSQPtr将所有队列控制块链接为链表。由于这时还没有使用它们,故这个链表叫做空队列控制块链表。
在UCOSII中,与消息队列相关的几个函数(未全部列出,下同)。
①创建消息队列函数
创建一个消息队列首先需要定义一指针数组,然后把各个消息数据缓冲区的首地址存入这个数组中,然后再调用函数OSQCreate来创建消息队列。创建消息队列函数OSQCreate的原型为:OS_EVENT *OSQCreate(void**start,INT16U size)
其中,start为存放消息缓冲区指针数组的地址,size为该数组大小。该函数的返回值为消息队列指针。
②请求消息队列函数
请求消息队列的目的是为了从消息队列中获取消息。任务请求消息队列需要调用函数OSQPend,该函数原型为:void*OSQPend(OS_EVENT*pevent,INT16U timeout,INT8U*err) 其中,pevent为所请求的消息队列的指针,timeout为任务等待时限,err为错误信息。
③向消息队列发送消息函数
任务可以通过调用函数OSQPost 或OSQPostFront 两个函数来向消息队列发送消息。函数OSQPost以FIFO的方式组织消息队列,函数OSQPostFront 以LIFO的方式组织消息队列。这两个函数的原型分别为: INT8U OSQPost(OS_EVENT *pevent,void *msg)、INT8U OSQPost(OS_EVENT*pevent,void*msg)。其中,pevent为消息队列的指针,msg为待发消息的指针。
2)信号量集
在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式。UCOSII 为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集。
信号量集所能管理的信号量都是一些二值信号,所有信号量集实质上是一种可以对多个输入的逻辑信号进行基本逻辑运算的组合逻辑。成员OSFlagWaitList是一个指针,当一个信号量集被创建后,这个指针指向了这个信号量集的等待任务链表。与其他前面介绍过的事件不同,信号量集用一个双向链表来组织等待任务,每一个等待任务都是该链表中的一个节点(Node)。标志组OS_FLAG_GRP的成员OSFlagWaitList就指向了信号量集的这个等待任务链表。等待任务链表节点OS_FLAG_NODE的结构如下:
typedef struct
{
void *OSFlagNodeNext; /
您可能关注的文档
最近下载
- 精细化施工方案(经典).pdf VIP
- 无创呼吸机操作及参数设置.ppt VIP
- 坏死性筋膜炎【16页】.pptx VIP
- 湖南省高职单招《职业适应性测试》备考试题及答案(含历年真题).doc VIP
- 2025安徽淮北市总工会社会化工会工作者招聘9人笔试模拟试题及答案解析.docx VIP
- 2025安徽淮北市总工会社会化工会工作者招聘9人笔试备考试题及答案解析.docx VIP
- 毕业论文--基于PLC污水处理控制系统毕业设计.doc VIP
- 《人工智能应用导论》PPT全套完整教学课件.pptx VIP
- GB51038-2015 城市道路交通标志和标线设置规范.docx
- 高等数学(英文版)全套PPT课件.pptx
文档评论(0)