基于车载网络嵌入式浏览器的设计
以下为文章全文:(本站微信公共账号:cartech8)

汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
在实际的车载网络中,嵌入式浏览器不仅仅需要对静态的超文本信息进行浏览,还需要把下层节点发来 的数据进行实时处理、显示和保存。这就需要在内存中保存一个完整的解析数据结构,以方便数据的实时更新和显示。因此使用DOM解析技术更加符合车载网络的应用要求。 在文档解析中,遵循先外后内、标签后属性、先到先解析的顺序。首先处理处于嵌套外层的标签,然后处理标签的属性;对于同一层次的标签,先解析前面的。通过一个标签堆栈来获得嵌套信息,对标签的父标签指针赋值。具体的解析算法如图3所示。 图3 解析模块算法流程图 布局模块的设计 HTML语言在对标记的定义中包括两类信息:数据信息和显示信息,而在XML语言定义的标记语言文档是对信息的结构化表示,并不包括显示信息。在处理对XML语言的显示中,可以使用CSS(Cascading Style Sheets)样式单添加额外的显示信息,或者通过xCBL将XML文档转换成HTML格式的文件,然后再交付给浏览器,由浏览器显示转换的结果。 EXML语言也不包括显示信息,不能决定页面元素的显示位置。通过CSS和XML定义显示的方式会照成浏览器的高资源占用。因此,在嵌入式浏览器中采用主题文件定义每个页面元素的显示位置。 页面元素的 布局分为动态布局和静态布局两种,因为HTML标记包含显示数据,在解析HTML兼容标记时采用动态布局算法,通过标记的属性和标记本身来决定布局。在对其他标签布局时,根据显示分辨率和使用习惯对元素的布局进行定义并储存在主题文件中。浏览器在处理这些标签的布局时,首先读取主题文件获得布局信息,然后根据标签内容进行布局。 文档布局模块负责将经过解析器处理的标记语言文档中元素在浏览器工作区中合适的位置显示。页面的布局分为以下3个步骤: (1)获取页面元素。页面元素以EXML文档中标记的形式存储,浏览器解析模块通过对标记语言的解析,将标记中所包含的模块化信息储存在标签数据结构中。布局模块首先顺次读取标签信息。 (2) 调用标签的布局函数。布局模块通过绑定布局函数实现对布局函数的调用。绑定元素的布局函数是通过查找布局函数列表来实现的。布局函数列表是一张储存标签名字和对应标签布局函数地址的二维表。布局模块调用布局函数,将元素根据布局算法布局到虚拟的显示数据结构中。如果标签的名字不在标签布局函数列表中,说明标签属于扩展标记,将通过扩展标记函数显示。 (3)通过显示窗口完成以布局标记的显示。由于嵌入式应用中显示屏的分辨率限制,有时候不能一次显示所有的元素。布局模块会根据显示屏分辨率和页面的大小决定显示元素的数量。 交互界面的设计 交互界面也即浏览器界面模块,主要负责浏览器的主框架显示,提供标签浏览、主题显示,以及处理与用户的交互。 针对不同的硬件平台甚至相同硬件平台不同尺寸的液晶屏,交互界面也要发生改变。可移植性和可配置性也是嵌入式浏览器所必需的。 为了适应不同的硬件环境特别是不同分辨率的屏幕,在基于车载网络的嵌入式浏览器设计过程中使用多主题,以实现可移植和可配置。主题方法是指使用配置文件对可视化系统中实现用户交互界面进行图形效果配置的一种方式。基于车载网络的嵌入式浏览器的主题是对可配置主题方法的扩展,利用主题文件不仅仅可以配置界面的颜色样式、显示模式,还可以根据不同屏幕的分辨率,方便地调整界面元素的大小和布局。 考虑到系统的可移植性、可配置性和系统的时间空间性能,基于车载网络的嵌入式浏览器的图形系统采用microwindows 嵌入式图形系统。这是一个开放源码嵌入式GUI软件,目的是把现代图形视窗环境引入到小型设备平台上。
双层消息机制的设计 由于车载网络的复杂性,浏览器所要处理的信息不仅仅来源于互联网络,还可以来自底层网络通过网关传来的实时消息。来自互联网的信息往往是静态的,根据用户的要求进行更新,而来自底层网络的实时消息是动态的,对实时性要求很高。使用单层的消息循环机制会造成实时信息不能及时显示,或者交互消息占用大量的系统资源,因此,在浏览器中采用双层消息机制。 在双层消息机制是通过消息分组来实现的。首先把消息分为实时消息和交互消息两组,实时消息表示消息需要实时处理,交互消息表示非实时的交互消息。其中,实时消息按照不同的优先级排列成为一组,系统自动处理优先级较高的消息,延迟优先级较低的消息。交互消息组的消息不分优先级,系统在某一时刻首先检查实时优先级组消息结构体数组是否有被占用的消息,如果有则选择最高优先级消息进行响应,响应完毕清除实时消息占用标志。如果为空则转入交互消息循环。具体消息循环算法示意性代码如下所示: Msgloop() { while (1){ if (msg_sele ct_hmsg()==-1) //没有实时消息到来 { GrSelectNextMSG(); //获取交互消息队列中的下个消息 switch() //根据交互消息类型选择消息处理函数 …….} else { *(Rtmsg_msgarr[msg_select_ hmsg()].func)(); //选择最高优先级实时消息进行响应。 } } |
文章网友提供,仅供学习参考,版权为原作者所有,如侵犯到
你的权益请联系542334618@126.com,我们会及时处理。
会员评价:
共0条 发表评论