收藏 分享(赏)

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

上传人:wspkg9802 文档编号:6996904 上传时间:2019-04-30 格式:PPT 页数:33 大小:2.32MB
下载 相关 举报
基于嵌入式实时操作系统的程序设计(7).ppt_第1页
第1页 / 共33页
基于嵌入式实时操作系统的程序设计(7).ppt_第2页
第2页 / 共33页
基于嵌入式实时操作系统的程序设计(7).ppt_第3页
第3页 / 共33页
基于嵌入式实时操作系统的程序设计(7).ppt_第4页
第4页 / 共33页
基于嵌入式实时操作系统的程序设计(7).ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、第8章 数据通信,在嵌入式系统的运行过程中,ISR与任务之间、任务与任务之问必然伴随数据通信。在实时操作系统支持下,这种数据通信可以采用多种方法来实现,应根据实际情况来选择最合适的方法。,8.1 全局变量,全局变量(包括全局数组和全局结构体)可以充当一种共享资源,用来在任务之间传输数据。提供数据的任务或ISR(生产者)对全局变量进行写操作,使用数据的任务或ISR(消费者)对全局变量进行读操作,从而实现了数据在任务或ISR之间的传输过程。这时,全局变量是一种共享资源,对其进行的访问必须遵循“资源同步”的规则(如关中断)。 全局变量虽然可以实现数据传输,但不能实现行为同步:新的数据产生之后并不能自

2、动通知相关使用者,使用者也不知道当前数据是何时产生(刷新)的。因此,全局变最只能用于没有行为同步要求的任务之间,即每次产生的新数据不要求立即使用,甚至可以不被使用。,一个具体的实例是系统实时时钟(见程序清单L7-4和L7-5 ),它的数据为全局变量,其内容每秒都被刷新。很多任务都需要使用实时时钟数据,例如一个报警任务需要记录警情出现的时间,这时只要访问实时时钟就可以得到时间数据。在这里,生产者不停地输出数据,使用者只是在需要的时候才会使用这个数据。,结论:在没有行为同步要求的前提下,当传输的数据量不大时,采用全局变量并配合关中断的资源同步措施是一种经济、有效的方法。下面将介绍利用全局变量传递数

3、据的实验程序(见程序清单L8-1):程序流程图如图8-1所示,采样任务不停地对模拟信号进行采样,并将采样结果保存在全局变量中,如果有按键操作,则数码管便显示当前的采样瞬时值(单位为mV)。,当对共享资源进行写操作的任务只有一个时(通常如此),只要其优先级高于所有其他进行读操作的任务,就可以在进行写操作时不必关中断,这是因为低优先级的执行读操作任务不可能在这个时刻夺取运行权。而低优先级的执行读操作任务必须采取关中断措施来访问全局变量,这是因为高优先级进行写操作的任务随时有可能被触发而获得运行权。,在这个实验中,全局变量ad为两个任务的共享资源,低优先级的显示任务对其进行读操作时采取关中断措施,而

4、高优先级的采样任务对其进行写操作时并没有关中断。,8.2 内存数据块,当需要传输的数据量很大时(如规模很大的数据块),采用内存块来存放这批数据是最合适的选择。实时操作系统有配套的内存动态管理函数,可以很简单地实现数据块的申请和释放。与全局变量类似,内存数据块也是共享资源,对其使用必须遵循“资源同步”的规则。内存块内可以存放各种类型的数据,其本身并不具有行为同步的功能。在采用“消息队列”的通信方式时,常常将内存块作为消息内容缓冲区,配合使用操作系统提供的“消息队列”相关服务函数,就可以实现行为同步功能,8.4节中有一个把内存块用作消息内容缓冲区的例子。,8.3 消息邮箱,当每次发送的数据都要求接

5、收方及时接收和处理时,在数据通信的同时必然发生行为同步,“消息邮箱就是具有行为同步功能的通信手段。在用“消息邮箱”进行数据传输时,要求接收消息的任务总是在等待消息,一得到消息总能在下一个消息产生之前处理完毕。当通信双方的执行均具有周期性(且周期相同)时,“消息邮箱”是合适的通信工具。,在向消息邮箱发送消息时,实际上只发送消息指针(消息的首地址),不管消息本身是什么数据类型,投送的指针都被理解为( void*)。在接收方得到这个消息指针后,通过指针来获取真正的消息内容。从本质上讲,保存消息的变量也是收发双方的共享资源,对它的访问也应该遵守资源同步的原则。事实上,实时操作系统已经在处理消息的收发函

6、数时解决了这个问题,使收发过程在时序上不会互相打扰,这一点我们不必操心。,如果发送消息的一方是任务(不是ISR),那么只要任务没有被删除,保存消息的变量(不管是全局变量还是局部变量)总是存在的,接收消息的一方总能够通过指针访问到这个变量,从而获取消息的内容。很多情况下发送消息的一方是ISR(如第5章中的程序清单L5-11)。这时需要特别注意:,如果用ISR的局部变量来保存消息,则接收消息的一方就不能获得真正的消息,原因是接收消息的一方在获得消息指针时ISR已经结束,其局部变量也一同消失。用程序清单L8-2替代程序清单L5-11中的采样任务和T1中断服务函数后,可以观察到这种失败现象。,ISR可

7、靠发送消息的方法有以下三种:,1将消息保存在全局变量里ISR结束后消息仍然存在,这是绝对可靠的办法。缺点是变量定义与ISR代码分离,程序可读性下降。用程序清单L8-3替代程序清单L5-11中的采样任务和T1中断服务函数后,实验可以获得成功。,2将消息保存在ISR的静态局部变量里由于静态局部变量分配有固定地址。所以ISR结束后仍然存在,其中保存的消息也不会消失;而且变量的定义就在ISR的代码小,程序可读性好(见程序清单L8-4)。,3.将消息内容冒充指针进行发送,接收消息的一方直接从“消息指针”中提取消息内容。但消息指针为( void*),占用4字节的空间,只能发送不超过4字节的“短消息”。当消息的内容为0时,变成空指针,消息是发不出去的,需要进行预处理,确保数据不为0。本方法需要一定技巧,需要小心使用。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报