嵌入式VxWorks学习总结报告 重新编译BSP,制作bootrom的. 4、配置vxworks
WindML components组件下,包含如下几个部分
WindML devices->input device->PS2 keyboard
->PS2 mouse
WindML devices->graphics device->graphics support(PCI device)2D layer
->complete 2D library
至此,WindML的环境配置就可以初步完成了。以上的配置过程,仅仅是一种情况的参考,开发人员可以根据自己的需求修改各个指标或者组件添加,但基本配置步骤是相似的。
2.5.3 汉字显示方案
在WindML的默认字库中,我们知道,是没有汉字库的。在我们添加汉字字库后,重新配置WindML库。在WindML配置表的Bitmap Fonts标签中,我们可以发现新开发的点阵字库。把新字库包含进去,重新编译WindML即可。因此,如果我们想要配置多种字体,只需将相对应字体的字库按照标准文件格式的格式编辑好,然后添加到VxWorks字库中即可。这种配置字体的方法简单,高效,可实施性强。
VxWorks开发中,主要有以下几种汉字显示方案:
(1)增加2D API层的显示接口函数。这种方法需要开发者完全开发一套点阵存储、点阵获取、点阵显示、汉字显示函数,使用者使用特定的汉字显示函数把汉字显示出来。该方法具有最大的灵活性,甚至不理睬WindML的任何机制,直接在上层组件里实现,但这种方法使程序的中英文混合显示变得复杂,程序可移植性也比较差。
(2)自己开发点阵存储、点阵获取、点阵显示,改造WindML的双字节或单字节显示函数,使其能判断汉字码,一旦判断出汉字码,则使用自己开发的点阵获取、点阵显示等把汉字显示出来。该方法对点阵的操作更加灵活,适合非标准的点阵算法,或者当开发者已有成熟的点阵操作方法时,把该方法绑接到WindML上。
(3)利用WindML对双字节编码的支持,实现对汉字的点阵存储、点阵获取、点阵显示的全过程,并使用WindML的双字节显示函数实现汉字码到汉字显示。这种方法使用了系统机制,是最根本的解决方法,并使用WindML的其他上层组件很方便的实现汉字显示。
在三种方法中,第三种方案是比较适合开发应用的,因为它不需要我们做过多的操作,只要我们找到符合VxWorks内部字库标准的汉子字库,将其添加到VxWorks字库中,再使用VxWorks中的字符显示函数调用即可。
但需要注意的是:使用这种字体配置方法,在显示汉字时,必须使用
28
嵌入式VxWorks学习总结报告 VxWorks提供的双字节显示函数uglTextDrawW(),并且在传字符串参数时,需要在字符串的结尾处补上“\\0”方可正确显示。然而,这样依然存在问题,因为函数uglTextDrawW()是双字节显示函数,而ASCII码只有一个字节,这样就使得英文显示或者中英文混显变得复杂。唯一的办法只能是将字符串分成中文和英文单独显示,这样将造成很多麻烦。因此,我们可以在用户接口软件开发的过程中,对函数uglTextDrawW()的源代码进行改写,使得函数能够同时支持双字节和单字节的显示。改写后的函数,可以自动区分中英文,为其分配合理的空间,使得中英文混显变得简单,不需使用者做额外工作。
2.5.4 WindML注意事项
因为Wind River公司的原有界面开发工具不是很完善,新一代的界面开发工具还没有推出,现在WindML就可以作为基本的界面开发工具。在WindML使用中,我个人认为应该注意以下几点:
1、WindML及其补丁的安装一定要完全,先安装WindML3.0,再安装3-0-0补丁,最后是3-0-3补丁;否则容易在编译和显示时出现错误;
2、WindML环境配置工作一定要细心做好,BSP包中的各个文件以及用户程序中都不要有疏漏;而且,在应用WindML Config工具时,各项指标的配置一定要和目标机相同或者兼容,尤其是架构系列和显卡类型。
3、在进行汉字输出开发时,采用主机与VMWare交叉调试。先在Vmware上试验,之后再移植到实体目标机上。这样可以节省很多不必要的联机操作。其实,很多不涉及到具体架构的试验性编程测试,都可以这样做。
4、每次WindML Config之后,先clean再build,避免一些生成文件在覆盖时候出现不可预知错误;而且,clean时间很短,而build时间相当长,需要20分钟左右。所以,为了避免因为没有clean直接build导致等待很长时间,最终得到错误报告,本人强烈建议先clean再build。
3 开发和问题
3.1 VxWorks开发工作
自从学习研究嵌入式VxWorks以来,我一直努力深入到VxWorks操作系统层次理解VxWorks的工作原理,运用Tornado 2.2开发工具完善自己的开发认知,经过理论知识的学习和实际开发操作的实践,我对嵌入式VxWorks操作系统理解更深,并且完成了一系列的工作。下面就是简单介绍。
29
嵌入式VxWorks学习总结报告 3.1.1 硬件环境搭建
VxWorks采用独特的主机—目标机开发调试方式,所依,在硬件环境方面,就需要有承载Tornado开发工具和VxWorks系统映像的主机和目标机。
我开发时,主机采用计算机为DELL OptiPlex 360,Pentium 双核E5300 2.6GHz,2GB/300GB,另外自己安装了一个软驱,用于主机中Tornado创建新的Bootrom后,向软盘中烧写Bootrom;目标机采用奔三架构主板的机器,保证软驱和PCI插槽可用,并且安装两块主板可以支持的PCI网卡,而且在进行嵌入式VxWorks开发前,应该把该计算机硬盘格式化为FAT16格式;主机与目标机之间采用网线连接,交叉线做法很简单,自己制作就可以满足要求。
目标机上最好配置键盘和鼠标,尤其是键盘,可以在包含Target Shell组件情况下,在目标机上直接敲击命令。据资料说,VxWorks默认支持串口键盘,但是不知道因为我的奔三主板过于陈旧有故障,串口键盘一直不响应,而USB接口的键盘就可以完好的响应。
3.1.2 网络通信
在Vxworks的BSP完成了网口的底层驱动和TCP/IP层上的协议加载后,用户程序需要的就是在TCP/IP层之上进行通信。利用VxWorks对多任务和BSD Socket的良好支持,可以方便的实现网络通讯。这不仅使嵌入式CPU与PC或工作站直接的网络通信成为可能,同时也丰富了系统的实时配置和调试方法,从而进一步扩展了VxWorks的功能和灵活性。
Vxworks系统和网络协议的接口是靠套接字(sockets)来实现的。Sockets规范是得到广泛应用的、开放的、支持多种协议的网络编程接口。通讯的基石是套接口,一个通讯口是套接的一端,在这一端上你可以找到其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的任务。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。各个任务使用这个域互相之间用Internet协议来进行通讯。
套接口可以根据通讯性质分类。应用程序一般仅在同一类的套接口间通讯。不过只要底层的通信协议允许,不同类型的套接口间也照样可以通信。用户目前使用两种套接口,即流套接口(采用TCP协议)和数据报套接口(采用UDP协议)。流套接口提供了双向的、有序的、无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠、有序、无重复的。也就是说,一个从数据报套接口接收信息的任务有可能发现信息
30
嵌入式VxWorks学习总结报告 重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。
套接口(socket)通信的最大优点是:过程间的通信是完全对等的,不管网络中过程的定位或主机所运行的操作系统。一般来说,流套套接口提供了可靠的面向连接的服务,应用较广泛。其应用程序时序下图。
Socket函数:
socket() bind() listen() accept()
创建一个套接口
给套接口分配名称
打开TCP套接口连接 完成套接口间连接
connect() shutdown() send() recv() select() read() write() ioctl() close()
请求连接套接口 关闭套接口间连接 向TCP套接口发送数据 从TCP套接口接收数据
完成同步I/O传输 从套接口读取信息 向套接口写入信息 完成对套接口的控制 关闭套接口
服务器socket()bind()listen()客户机socket()accept()阻塞,等待客户数据建立链接connect()请求数据read()write()处理服务请求write()应答数据read()close()close()
31
嵌入式VxWorks学习总结报告 初期试验时,主机上是使用Visual Studio 2005开发工具,子啊Windows环境中,应用MFC中已经封装好的CAsyncSocket(异步套接字)类实现,有对话框的控制界面(见下图),可以在VxWorks中网络初始化后,与其建立连接,并且传送和接收数据。
3.1.3 基于缓冲队列的多任务网络通信
在实际的网络信息传输中,在通信协议格式中,用固定格式的字符串表示特定信息,将网络上传递的含有命令性质的特性信息成为命令,通过网络通信的双方,即控制端和受控端,都需要对命令进行适当的反应。为了保证信息的不丢失,使用缓冲队列将所有信息缓存,然后再逐个读出并执行,基本通信模式见图。
32