基于ViewML的嵌入式浏览器移植杨志文I马骋2%普天惠讯公司北京100085)々清华大学精仪系北京100084)摘要嵌入式浏览器在数字电视、PDA等领域具有重要的应用价值。木文介绍了一种嵌入式浏览器的移植方法,对ViewML的系统结构和动态运行过程进行了详细的分析和描述,通过对图形接口等部分的移植,在基于PowerPC芯片和PSOS实时操作系统的硕件平台上•成功地实现了一种嵌入式浏览器。关键词嵌入式浏览器ViewML移植PortinganEmbeddedBrowserBasedonViewMLYangZhiwen1MaCheng21(PutianCorp.Beijing100085^China}2(Tsin^huaUniversityBeijing100084•China)AbstractEmbeddedbrowseriswidelyusedintheareasuchasdigitalTVandPDA.Inthispaper,amethodofportinganembeddedbrowserisintroduced.BaseontheanalysisofViewML^sstructureandrunningprocess,somepartssuchasgraphicsinterfacearereprogrammed.ExperimentshowsthatthereprogrammedembeddedbrowsercanrunningsteadlyonasystemcomposedofPowerPCandPSOS.KeywordsEmbeddedbrowserViewMLPorting1引言当今世界,数字电视、PDA等数字媒休和信息设备日益普及,而嵌入式浏览器是一项必不可少的功能。要在这些设备中实现嵌入式浏览器,目前主要有两类方法:一种方法是在JVMCJavaVirtualMachine)上运行一个java语言的浏览器,但是由于嵌入式系统的epu一般计算速度较慢(无法和pcft|比),从而导致浏览器运行很慢,因此这种方法对硬件性能的要求较高,目前应用一般不做考虑;另外一种方法:采用C或C++H主编程实现。但是,新的问题乂出现了:开发一个浏览器需要大量的时间和人力,这对于中小型公司来说是不能承受的,因此移植通用浏览器将是一个较好的选择。针对目前已经存在的IE、Opera、Mozilla、Konqueror.ViewML等多种通用浏览器°从商业成本考虑,选用自由软件可以降低成本并且避免知识产权纠纷•因而厉締媲商用的浏览器,另外,嵌入式系统对存储器的资源亦销要求也非常严格,ROM和RAM资源占用越小越好•同时•考虑到目前对于浏览器的性能需要不是太多,只要支持htrnl3.2和javascript1.1就可以,因此可以选用ViewML。ViewML功能简单,对于javascript的支持也不是很完善,但是它需要的资源少,而且模块化比较淸楚,易于移植.2ViewML的系统分析欲实现ViewMI.进行移植,首先需耍对它的结构进行分析。ViewML的框架结构图如图1所示。从图1可以看出,VcwML对底层模块的依赖主要有以下几部分:(1)Microwindows,这个模块为图形系统,它提供fXwindow的API函数的子集,其中包括鼠标、键盘、图形驱动等,它向上支持FLTK(C++图形库)。(2)WWWLB,这是MIT提供的一部分网络通讯库,主要是访问网络和本地文件,实现了httpl.1协议等。(3)StdC++Library,这部分主•要是一些标准C++图2ViewML的动态运行过程首先,运行ViewML,主程序创建主程序图形界面,创建网络通讯子进程HTTPConnection,启动Timer顶时器•进入等待,此时•子进程运行gctURL,调用wwwlib•按照Http协议进行网络通讯,将数据放进buffer中。主迓程在定时器时间到后,调用getfinishedURL,得到已完成通讯的URL,getdata得到数据,进行解析显示。如果没有数据,则启动定时器.调用通讯子进程。万方数据3VewML的移植过程根据上面的系统分析,要移植ViewML,需要支持C++的编译器和支持多任务的实时系统,主要实现七部分的移植•包括:3.1线程的移植由于大多数实时系统,对于P()S1X(—种操作系统接口的工业标准)标准支持的不确泄性,使得这部分在那些对POSIX标准支持不好的系统中,显得比较困难,例如PS()S就存在上述问题•因此需要对实时系统的线程函数进行开发,主要是线程创建•删除•线程间的互斥等。3.2图形的移植这部分工作相对来说比较复杂。由于是移植linux程序,因此,Microwindow应该选择NANO-X,这样才能支持上面的图形库山k,这部分要做的工作主要是和各个驱动的连接,包括图形驱动、鼠标驱动、键盘驱动三部分。图形驱动就是耍实现相应的图形驱动函数.如open(PSDpsd).setpalette(PSDpsd,intfirst♦intcount,MWPALENTRY"pal)等,然后将这些函数指针填到图形驱动结构的device,h的SCREENDEVICE中...