Loading
新闻中心库存中心价格中心PDF中心图片中心
ICGLE 电子技术支持中心,为电气人员和相关企业提供全面的信息(IC技术\IC库存\IC图片\PDF资料等)服务
总线设计PCB设计单片机DSPARM
JAVA驱动设计C/C++汇编J2EE网络协议中间件技术嵌入式系统无线通信通信网络模拟技术接口电路显示光电传感与控制EDA/PLD
气流体控制电子产品电机及工具通信设备仪器仪表电线电缆建筑电气低压电器高压电器电源工控自动化广电设备医疗器械More..
电源设计仪器仪表技术专递电路图片电子专栏储存技术汽车电子测量测试音响技术家用电器
成功方案市场分析行业标准应用前沿芯片应用综合专区
VxWorks上WindML对多字节码的显示
来源:中国电子前沿   作者:佚名
字体大小:[大][中][小]

  摘要:论述VxWorks上WindML对多字节码的显示支持,着重讨论其存储结构和意义,并给出汉字显示的实现方法。

  关键词:VxWorks操作系统 WindML组件 汉字点阵 国标编码

  1 VxWorks操作系统图形显示方案

  VxWorks作为嵌入式实时操作系统,在国内应用已非常广泛,但VxWorks原厂商没有直接提供完备的汉字显示解决方案。本文这个热点论题,通过对VxWorks显示组件的分析,具体给出一种汉字显示的方案。

  VxWorks的汉字显示首先需要一种图形解决方案,只有工作在图形模式下才可能显示汉字。VxWorks有三种显示方案可供选择。

  (1)WindML+Zinc

  WindML是Wind River Mutli-media Library的简称,其中包含UGL(Universal Graphics Library)。该组件直接控制显示硬件,主要提供显示模式设置、标准输入输出控制、点线面作图等函数,编程接口很类似于Torbo C、Borland C里的图形库。Zinc基于WindML,提供了类Widnows风格的接口,有各种控件被封装于内,编程接口很类似于Windows编程。

  (2)WindML+Jworks

  Jworks提供Java的支持,在VxWorks上启动Java虚拟机来解释Java语言;图形开发编程接口是Java语言,Java虚拟机的图形实现基于WindML。

  (3)Web Server+WindML+Jworks+Browser

  Web Werver使显示编程接口成为编写网页,可以通过远程的Browser来访问而使设备具有远程显示接口,也可以在本机做Browser使设备具有本机显示接口。该Browser的实现需要WindML或Jworks的支持。

  上述方案内,纯Web Server的方案不需要本地汉字显示,只要在网页上放国标码或Unicode码等,由远程的Browser去实现显示;其它方案基本上都需要WindML的支持,这是因为VxWorks系统里所有底层的显示操作都是通过WindML实现的。

  2 汉字显示方案

  实现本地汉字显示的方案一定会涉及到WindML,只是不同的方案对WindML的依赖程度有所不同,一般有如下几种。

  ①利用WindML对双字节编码的支持,实现对汉字的点阵存储、点阵获取、点阵显示的全过程,并使用WindML的双字节显示函数实现汉辽码到汉字显示。这种方法使用了系统机制,最根本的解决方法,并使WindML的其它上层组件很方便地实现汉字显示。

  ②自己开发点阵存储、点阵获取、点阵显示,改造WindML的双字节和单字节显示函数,使其能判断汉字码,一旦判断出汉字码,则使用自己开发的点阵获取、点阵显示等把汉字显示出来。该方法对点阵的操作更加灵活,适合非标准的点阵算法,或者当开发者已有成熟的点阵操作方法时,把该方法绑接到WindML上。

  ③完全自己开发一套点阵存储、点阵获取、点阵显示、汉字显示函数,使用者使用特定的汉字显示函数把汉字显示出来。该方法具有最大的灵活性,甚至不理睬WindML的任何机制,直接在上层组件里实现,但这种方法使程序的中英文混合显示变得复杂,程序可移植性也比较差。

  本文将就第一种显示方案和第一种汉字显示方案详细论述WindML的双字节编码机制,并利用该机制构建WindML汉字显示框架,并论述Zinc如何使用该框架。这些机制和思路其实是任何方案都需要考虑的,对绕开WindML的方案也具指导和借鉴意义。

  3 WindML的点阵参数

  ①每个字模都有一个占据的空间,该空间对于点阵字库里的每个字是一样大的,所有字符点阵的大小都不应该超过该空间,如果超过,显示时超出部分将被截掉。相关参数有:

  maxAdvance——最大宽度(横向)大小,以点为单位。

  MaxAscent,maxDescent——maxAscent+maxDescend 是最大长度(即纵向)大小,两数的交界决定了一个baseline,maxAscent是baseline以上的长度,maxDescent是 baseline以下的部分。Baseline对于定位具体字符点阵的打点起始位置非常重要,另外如果有一行来自同一个字符集的字符串,则这些字符的 baseline是在一条线上的。maxAscent+maxDescent有时被称为字符表高度height,注意要与下面所述的字符高度区别开来。

  ②每个字符点阵也有一个范围大小,其大小与每个字符有关。该大小一般不会填满整个字模空间。相关参数有:

  width——宽度。

  height——高度。

  ascent——点阵打点开始位置在baseline之上的偏移,如果是负数,则点阵在baseline之下开始打点。

  Ascent和height决定了点阵从字模的多少行开始打点,要打多少行。而列的打点起始位置,固定是0,即字模的最左边,所以只有width描述打点的宽度。

  ③字符横向和纵向都要有额外空间,以防止字符粘接重叠。相关参数有:

  leading——行间距。

  ④对字符的一些变换选项,字符读取的标志等。相关参数有:

  pixelSixe——平均行、列大小。

  weight——行、列加粗属性。

  italic——斜体属性。

  spacing——字符行间距属性。

  charSet——字符集标志。

  faceName——字符集名称。

  familyName——字符集的家族名称。

  scalable——字符放大缩小比例。

  WindML显示字符时,以maxAscent+maxDescend作为字符高度(不加 leading),以width作为字符宽度(不以maxAdvance,不判断spacing);根据字符ascent和字符height取出字符点阵数据,进行weight、italic、scalable等运算(很多运算需要用户开发),然后输出到屏幕。

  4 WindML的点阵存储结构和操作方法

  WindML双字节编码显示的参数和实现思路集中体现在点阵存储文件的结构上,该文件的框架如下(这些文件在WIND_BASE/target/src/ugl/fonts/bmf目录下):

  UGL_LOCAL const unsigned char UGL_FAR_DATA

  page0Data[]=

  {…

  /*0x0023(#)*/

  0,/*page*/

  0x23,/*index*/

  0,/*size(MSB)*/

  20,/*size(LSB)*/

  8,/*width*/

  16,/*high*/

  14,/*ascent*/

  0x00,0x00,0x00,0x00,0x44,0x44,0x44,0xfe,0x44,0x44,0x44,0xfe,0x44,0x44,0x44,0x00,/*数据*/

  /*0x0024和其它字符*/

  …

  /*结束*/

  0,0,0,0

  }/*西文扩展为双字节编码的点阵表*/

  /*上表解析:

  page+index就是该字符的ASCII编码,过扩成了双字节;

  size(MSB)+size(LSB)是该字节的点阵信息长度,注意实际描述体的长度是2(2字节page,index)+该长度+1(从0开始编大小,所以从1数据要加1),而ascent之后的真正点阵数据的大小是该大小减4;

  width+height是该点阵资料的宽度和高度;

  ascent是点阵处在baseline以上的偏移位置,baseline的位置要看整个字符表描述结构的定义;

  data是按行扫描得到的点阵资料,是列递增把行显示效果排成一个连续空间后,按字节来描述每位的打点状态;如果行宽是8位的整数倍,不会把位补0去凑8位整数倍 。

  字符点阵描述数据依次往下排列,直到以4个0标志结束。

  */

  UGL_LOCAL const unsigned char UGL_FAR_DATA

  Page1Data[]=

  { 0x81,/*page*/

  0x40,/*index*/

  0,/*size*/

  36,/*size*/

  16,/*width*/

  16,/*hight*/

  14,/*ascent*/

  0x00,0x08,0xff,0xfc,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x10,0x1f,0xf8,0x00,0x10,

  0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x02,0x20,0x01,0x40,0x00,0x80,

  /*其它字符*/

  …

  /*结束*/

  0,0,0,0

  }*/国标码对应的点阵表*/

  /*上表解析:

  数据含义与西文表类似,注意字码是双字节国标码*/

  UGL_LOCAL const unsigned char *const pageArray[]

  { page0Data,

  page1Data,

  UGL_NULL

  };/*总的点阵资料表*/

  /*上表解析:

  把分类的点阵资料表汇集成一张表,总表以UGL_NULL结束,注意各个分表是以0,0,0,0结束。

  可以把汉字表按GB2312编码的page分类,构建多个汉字分表,然后把分表指针填入该表。当然,也可以做成一个汉字大表,把指针放在该表,甚至也可以把中西文点阵做成的中西文混合大表,然后把该表指针放在该数组里。

  */

  const UGL_BMF_FONT_DESC uglBMFFont_Song_16=

  {

  /*UGL_FONT_DESC结束*/

  {

  {16,16}, /*点阵大小*/

  {UGL_FONT_BOLD_OFF,UGL_FONT_BOLD_OFF},

  /*宽度*/

  UGL_FONT_UPRIGHT, /*斜体*/

  UGL_FONT_PROPORTIONAL,/*行间距属性*/

  UGL_FONT_UNICODE, /*字符集*/

  “Song 16x16Dot”, /*字体名称*/

  “Song” /*字体系列名称*/

  }/*点阵名称等点阵属性表*/

  /*UGL_BMF_FONT_DESC结构*/

  /*点阵表的属性和位置*/

  2, /*行间距*/

  14, /*最大上偏移位置*/

  2, /*最大下偏移位置*/

  14, /*最大宽度*/

  pageArray /*字形页*/

  };/*点阵描述结构*/

  /*上表解析:

  首先是定义属性表,然后是定义字模和间距,并定义总的点阵描述表指针。

  */

  最后定义的const UGL_BMF_FONT_DESC uglBMFFont_Song_16包含了该点阵的所有信息。只要能定位该结构,则任何能在该点阵表内匹配出字码的字都可以显示出来。WindML选择不同的点阵就是选择不同的该结构去做点阵寻址,其实现的大体过程如下:

  ①WIND_BASE/target/src/ugl/config/uglBmfCfge文件描述了整个系统能使用的字符集,如:

  extern const UGL_BMF_FONT_DESC uglBMFFont_Courier_12;

  extern const uglBMFFont_Song_16;/*就是上面的例子*/

  const UGL_BMF_FONT_DESC * uglBMFFontData[]=

  {

  &uglBMFFont_Courier_12,

  &uglBMFFont_Song_16,

  NULL

  };

  ②通过如uglDriverFind (UGL_FONT_ENGINE_TYPE,0,(UGL_UINT32*)&fontDrvId);的调用定位点阵驱动,即控制对点阵表访问、打点等操作的函数;

  通过如uglFontFindString(fontDrvId,“familyName=Song;pixelSize=16”&systemFontDef);的调用定位点阵描述结构;

  通过如fontSystem=uglFontCreate(fontDrvId,&systemFontDef));的调用绑接点阵和点阵驱动,并标识为fontSystem;

  如此重复创建多个字符集的点阵标识。

  ③通过如:uglFontSet(gc,fontSystem);的调用设置当前字符集;

  通过如uglTextDrawW(gc,iX,iY,iLength,caString);的调用在iX,iY的位置显示caString里的字码。

  可见,只要开发者根据上述的存储结构开发出对应的字符点阵,然后把点阵描述结构加入到 uglBMFFontData,便可以用系统的函数使用这些点阵了。在Dos/Windosw、Linux系统下一些应用程序,可以把操作系统的点阵导出为C文件或数组,把这些导出的文件加以调整,就可以得到VxWorks系统支持的格式。

  5 Zinc对汉字的支持

  只要WindML的汉字支持做成功,则可以按如下方法使Zinc支持汉字:

  WIND_BASE/target/src/zinc/generic/i_ugldsp.cpp 文件是WindML与Zic的接口文件,在ZafScreenDisplay::ZafScreenDisplay函数里使用上述的函数定义了Zinc要使用的字符集。把这些字符集改成汉字字符集,并且把Zinc配置成支持UNICODE的方式重新编译,则Zinc就自然支持汉字显示了。

  6 注意事项和总结

  在使用过程中,还要注意几个问题。

  ①Tornado对汉字的编译,如果把汉字定义为如short ca[]={董,0x00}(把单个汉字定义在单引号),则编译生成的目标码是正序的国标码;如果定义为“董”(双引号定义出的汉字字符串),则编译生成的目标码是反序的国标码。这样,就必须约定一种定义以根据该约定产生的国标码来构建字符点阵表(以根据该约定产生的国标码来构建字符点阵表(需要改变表里面的字码顺序)。

  ②如果使用双引导定义汉字字符中,要注意该串数据是以一个字节0结束,使用uglTextDrawW要求是以字为单位,所以,需要在该字节串结尾补一个0("000"即可)。

  ③有些字库表的字码是UNICODE的编码,尤其是使用一些操作系统的点阵导出程序生成的字库表。UNICODE编码与国际码有一一对应关系,可以把这样的字库表转换过来或者在程序里适当位置把要显示的内容转化为UNICODE再显示。

  本文就嵌入式操作系统上作用汉字这一热门论题,论述了VxWorks上的图形实现方案、汉字开发方案,图形组件WindML对多字节码的支持特性,并在论述特性的同时,列举了宋体16点阵的框架,帮助汉字开发者理解点阵实现的细节。在论述 WindML汉字操作函数之后,提出了在Zinc层实现汉字显示的方法和编程时注意事项。这套方案已经成功地实现,并在上海大众的导航产品、南京电力的电力控制产品等项目上获得成功的应用。

Upload by 小刘(2007-3-13)
IC
·基于C语言的设计流优化语音识别芯片结..
·针对嵌入式SoC应用的C编程优化
·如何用C语言开发DSP嵌入式系统
·浅析malloc()的几种实现方式
·用Eclipse+MyEclipse..
·Java中使用接口实现多继承和多态的..
·提升JSP中页面响应速度的七大秘籍绝..
·Static和Final修饰类属性变..
·探讨JAR文件无限可能性
·Tomcat集群与负载均衡
·使用Java NIO提高服务端程序的..
·java虚拟机管理大内存
·java中使用MD5加密算法进行加密
·EMF模型解析的策略分析
·编写对GC友好,又不泄漏的代码
·J2SE5.0新特性之windows..
·java中通过xpath处理含有命名..
·使用Hashtable对字符串进行碰..
·揭开 Java 安全标准的神秘面纱
·java的线程安全四种方式五个等级
·破除java神话之原子操作都是线程安..
·Java服务器端编程安全必读
·编写高效的线程安全类
·用Java向Web站点发送POST请..
·Java多线程的优先级
·基于Java的嵌入式网络视频服务器
·Java源码分析:深入探讨Itera..
·在Java里面调用CUI程序的方法
·从C++到Java--理解面向对象是..
·避免JavaEE项目评估中的常见错误
·XML和Java:一个强大的组合
·J2ME平台下基于手机定位实现的移动..
·Java回归嵌入式无线通信
·用Java实现FTP服务器
·在VxWorks下实现NAT/NAP..
·VxWorks中的地址映射
·基于Rhapsody和VxWorks..
·VxWorks中怎么从Flash B..
·基于嵌入式操作系统VxWorks的S..
·基于VxWorks的bootrom代..
IC
推荐技术文章:
·VxWorks for X86的输入....
·基于LPC2104的VxWorksB....
·嵌入式操作系统VxWorks中TFF....
·基于ARM7核处理器VxWorks系....
·基于VxWorks的产品映象设计..
·VxWorks应用技巧两例..
·基于VxWorks的飞机配电自动化主....
·VxWorks从Flash BOOT....
·VxWorks任务编程中常见异常分析..
·VxWorks体系下PowerPC8....
·vxWorks在线升级技术..
·基于Vxworks实时操作系统的串口....
·VxWorks网络驱动配置及分析..
·VxWorks中以太网通信报文的粘连....
·VxWorks下基于CS4281声卡....
·VxWorks系统下的RTL8139....
·基于VxWorks的视频采集系统的设....
·VxWorks下UDP协议栈效率的研....
·基于MPC860T的嵌入式通信服务器....
·基于VxWorks嵌人式操作系统的C....
·VxWorks操作系统及实时多任务程..
·基于嵌入式操作系统VxWorks的图..
·利用VxWorks作Internet..
·linux下命令行下编译c程序
·移植U-Boot到AT91RM920..
·一种改进嵌入式Linux操作系统实时..
·Linux内核初始化及启动之用户模式..
·Linux在信息家电(IA)上的应用
·嵌入式Linux的动态扩展技术研究
·基于Linux的嵌入式POS的GUI..
·Linux嵌入式系统与硬件平台的关系
·基于嵌入式Linux的打印控制系统的..
·Linux下获得CPU利用率和内存使..
·擂台战:嵌入式Linux面临图形化挑..
·面向多媒体应用的嵌入式Linux实时..
·Linux系统内存磁盘初始化技术详细..
·Linux下的网络HOOK实现以及使..
·Linux系统下搭建C/C++开发的..
·移动电话挑战嵌入式Linux
·在嵌入式Linux上实现JFFS文件..
IC
IC

©2007 版权归ICGLE所有   页面执行时间:62.500毫秒