网站大量收购闲置独家精品文档,联系QQ:2885784924

《基于嵌入式实时操作系统的程序设计7.ppt

《基于嵌入式实时操作系统的程序设计7.ppt

  1. 1、本文档共33页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 数据通信 在嵌入式系统的运行过程中,ISR与任务之间、任务与任务之问必然伴随数据通信。在实时操作系统支持下,这种数据通信可以采用多种方法来实现,应根据实际情况来选择最合适的方法。 8.1 全局变量 全局变量(包括全局数组和全局结构体)可以充当一种共享资源,用来在任务之间传输数据。提供数据的任务或ISR(生产者)对全局变量进行写操作,使用数据的任务或ISR(消费者)对全局变量进行读操作,从而实现了数据在任务或ISR之间的传输过程。这时,全局变量是一种共享资源,对其进行的访问必须遵循“资源同步”的规则(如关中断)。 全局变量虽然可以实现数据传输,但不能实现行为同步:新的数据产生之后并不能自动通知相关使用者,使用者也不知道当前数据是何时产生(刷新)的。因此,全局变最只能用于没有行为同步要求的任务之间,即每次产生的新数据不要求立即使用,甚至可以不被使用。 一个具体的实例是系统实时时钟(见程序清单L7-4和L7-5 ),它的数据为全局变量,其内容每秒都被刷新。很多任务都需要使用实时时钟数据,例如一个报警任务需要记录警情出现的时间,这时只要访问实时时钟就可以得到时间数据。在这里,生产者不停地输出数据,使用者只是在需要的时候才会使用这个数据。 结论:在没有行为同步要求的前提下,当传输的数据量不大时,采用全局变量并配合关中断的资源同步措施是一种经济、有效的方法。 下面将介绍利用全局变量传递数据的实验程序(见程序清单L8-1):程序流程图如图8-1所示,采样任务不停地对模拟信号进行采样,并将采样结果保存在全局变量中,如果有按键操作,则数码管便显示当前的采样瞬时值(单位为mV)。 当对共享资源进行写操作的任务只有一个时(通常如此),只要其优先级高于所有其他进行读操作的任务,就可以在进行写操作时不必关中断,这是因为低优先级的执行读操作任务不可能在这个时刻夺取运行权。而低优先级的执行读操作任务必须采取关中断措施来访问全局变量,这是因为高优先级进行写操作的任务随时有可能被触发而获得运行权。 在这个实验中,全局变量ad为两个任务的共享资源,低优先级的显示任务对其进行读操作时采取关中断措施,而高优先级的采样任务对其进行写操作时并没有关中断。 8.2 内存数据块 当需要传输的数据量很大时(如规模很大的数据块),采用内存块来存放这批数据是最合适的选择。实时操作系统有配套的内存动态管理函数,可以很简单地实现数据块的申请和释放。与全局变量类似,内存数据块也是共享资源,对其使用必须遵循“资源同步”的规则。内存块内可以存放各种类型的数据,其本身并不具有行为同步的功能。 在采用“消息队列”的通信方式时,常常将内存块作为消息内容缓冲区,配合使用操作系统提供的“消息队列”相关服务函数,就可以实现行为同步功能,8.4节中有一个把内存块用作消息内容缓冲区的例子。 8.3 消息邮箱 当每次发送的数据都要求接收方及时接收和处理时,在数据通信的同时必然发生行为同步,“消息邮箱’’就是具有行为同步功能的通信手段。在用“消息邮箱”进行数据传输时,要求接收消息的任务总是在等待消息,一得到消息总能在下一个消息产生之前处理完毕。当通信双方的执行均具有周期性(且周期相同)时,“消息邮箱”是合适的通信工具。 在向消息邮箱发送消息时,实际上只发送消息指针(消息的首地址),不管消息本身是什么数据类型,投送的指针都被理解为( void*)。在接收方得到这个消息指针后,通过指针来获取真正的消息内容。 从本质上讲,保存消息的变量也是收发双方的共享资源,对它的访问也应该遵守资源同步的原则。事实上,实时操作系统已经在处理消息的收发函数时解决了这个问题,使收发过程在时序上不会互相打扰,这一点我们不必操心。 如果发送消息的一方是任务(不是ISR),那么只要任务没有被删除,保存消息的变量(不管是全局变量还是局部变量)总是存在的,接收消息的一方总能够通过指针访问到这个变量,从而获取消息的内容。 很多情况下发送消息的一方是ISR(如第5章中的程序清单L5-11)。这时需要特别注意: 如果用ISR的局部变量来保存消息,则接收消息的一方就不能获得真正的消息,原因是接收消息的一方在获得消息指针时ISR已经结束,其局部变量也一同消失。用程序清单L8-2替代程序清单L5-11中的采样任务和T1中断服务函数后,可以观察到这种失败现象。 ISR可靠发送消息的方法有以下三种: 1.将消息保存在全局变量里 ISR结束后消息仍然存在,这是绝对可靠的办法。缺点是变量定义与ISR代码分离,程序可读性下降。用程序清单L8-3替代程序清单L5-11中的采样任务和T1中断服务函数后,实验可以获得成功。 2.将消息保存在ISR的静态局部变量里 由于静态局部变量分配

文档评论(0)

you9391 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档