- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六节 嵌入式操作系统3
任务间通信与同步 同步与互斥--临界区 任务间通信 信号量分类 二值信号量(互斥) 非二值信号量 消息邮箱 多任务操作系统中,经常要两个任务之间通过传递一个数据(这种数据称为“消息”)的方式来进行通信。 任务间传递数据的一个最简单的方法就是传递消息指针,因此,用来传递消息缓冲区指针的数据结构就叫做消息邮箱 消息队列 消息邮箱不仅只能传递一个消息,可定义一个指针数组。让数据的每个元素都存放在一个消息缓冲区指针。这种传递多个消息的数据结构叫做消息队列 事件控制块ECB 等待任务列表 OSEventWaitListInit() 初始化一个事件控制块。当创建一个信号量、邮箱或消息队列时,相应的创建函数会调用本函数对ECB的内容进行初始化,将OSEventGrp和OSEventTbl[]数组清零; OSEventWaitListInit (OS_EVENT *pevent); prevent:指向需要初始化的事件控制块的指针。 使任务进入/脱离等待状态 在等待事件的任务列表中查找优先级最高的任务 ECB的基本操作 OS_EventTaskWait() OS_EventTaskRdy() OS_EventTO() 空闲ECB的管理 信号量 任务、ISR和信号量的关系 创建一个信号量 等待一个信号量 为防止任务因得不到信号量而处于长期的等待状态,函数OSSemPend允许用参数timeout设置一个等待时间的限制 当任务等待的时间超过timeout时可以结束等待状态而进入就绪状态。如果参数timeout被设置为0,则表明任务将持续地等待信号量,最大的等待时间为65535个时钟节拍 。 发送一个信号量 无等待地请求一个信号量 查询一个信号量的当前状态 删除该信号量 例 void? Main(void) { ARMTargetInit(); OSInit(); Sem1 = OSSemCreate(0); Sem2 = OSSemCreate(1); OSTaskCreate(Task1, (*)Id1 (OS_STK *)Stack1[STACKSIZE-1],5); OSTaskCreate(Task2, (*)Id2, (OS_STK *)Stack2[STACKSIZE-1],13); ARMTargetStart(); OSStart(); } void Task1(void *Id) { INT8U Reply; for (;;) { OSSemPend(Sem2,0, Reply); printf(Task1 turned\n ); OSSemPost(Sem1); OSTimeDly(200); } } void Task2(void *Id) { INT8U Reply; for (;;) { OSSemPend(Sem1, 0, Reply); printf(Task2 turned\n ); OSSemPost(Sem2); OSTimeDly(100); } } (1)首先信号量sem1,sem2分别为0,1。系统最开始运行Task1; (2)可知运行Task1后sem1,sem2分别变化为1,0.此时Task1挂起200us; (3)接着执行Task2,执行完之后sem1,sem2分别为0,1,接着挂起Task2; (4)100 tick之后,由于Task1还在挂起状态,所以Task2再次获得运行权,但此时OSSemPend(Sem1, 0, Reply)会等待获得Sem1的信号量,sem1信号量为0,没有办法获得,就移植停留在这里而挂起。直到200 tick之后Task1从休眠状态回来,执行Task1,如下循环下去。 结 论 概述 malloc/free? ?C/OS中的存储管理 内存分区示意图 创建一个内存分区 内存控制块 内存管理初始化 分配一个内存块 释放一个内存块 等待一个内存块 OSMemQuery( ) 请求消息队列的目的是为了从消息队列中获取消息。任务请求消息队列需要调用函数OSQPend( ),该函数的原型为: ? void*OSQPend( OS_EVENT*pevent, //所请求的消息队列的指针 INT16U timeout, //等待时限 INT8U*err //错误信息 ); 任务需要通过调用函数OSQPost( )或OSQPostFr
您可能关注的文档
最近下载
- CECS193-2005 城镇供水长距离输水管(渠)道工程技术规程.pdf VIP
- 《Python数学建模算法与应用课件》04第4章 线性规划和整数规划模型.pptx
- 立体仓库结构设计(底盘单元).docx VIP
- ASME中国制造-ISO12944-7-2017 中文译稿 第7部分 涂装工作的实施和监管.pdf VIP
- 2025年生物制药企业生产过程节能减排与成本控制方案.docx
- 民国时期广东的蔗糖生产与蔗糖业纠纷研究.pdf
- 末梢血标本采集专家共识试题及答案.doc VIP
- 年回收拆解30000辆报废汽车新建项目环境影响报告.docx VIP
- JTT1495-2024公路水运危险性较大工程安全专项施工方案审查规程.pdf VIP
- 《人类起源的演化过程》名著导读PPT教学课件.pptx VIP
文档评论(0)