本文引用地址:http://www.eepw.com.cn/article/201809/388534.htm

这里基于Linux2.4.19和Microwindows0.89进行讨论,主要难点:一是将Microwindows层次打乱后如何进行代码的重构,用最少的代码实现最有效的功能,二是提供中文显示和中文输入的支持。

2.1 结构重构

(1)底层驱动层

整个系统的核心是键盘和屏幕数据结构,它们在Linux系统中都是被当作文件来进行访问,其C代码主要在src/drivers和src/engine目录下。

键盘是通过fd=open(/dev/tty,O_NONBLOCK)打开,利用ioctl来进行操作的,涉及到的文件有kbd_ttyscan.c(提供键盘的打开、关闭等支持)。

屏幕驱动是基于Linux内核中framebuffer,这要求在编译内核的时候选择支持framebuffer编译参数选项。它是通过fd=open(env=/dev/fb0)打开,用SCREENDEVICE的指针PSD指向这片显存,然后对这片显存根据屏幕的不同位色设置情况为中间引擎层提供相应的图形操作支持,包括画点线、图片显示、屏幕拷贝以及中西文字的显示等等。其涉及到的文件较多,类型定义与函数声明的头文件有fb.h、genfont.h和genmem.h,C代码文件有src_fb.c(提供基本的framebuffer打开和关闭等支持)、fb*.c(*为2、4、8、16、24、32,提供对应不同灰度级别和不同位色屏幕的支持)、genmem.c(提供显存分配)和genfont.c(提供中西文字体显示支持)。

(2)中间引擎层

这一层是在底层驱动层提供的设备对象支持下,完成图形在实虚屏之间的转换(以PSD指针作为参数来进行),实现各种图形功能函数(以Gd...为开头)。相关的类型定义与函数声明头文件有include目录下的mwtypes.h、swap.h和winkbd.h,C代码主要有src/engine目录下的devarc.c(提供弧线和椭圆绘制支持)、devclip.c(提供剪贴支持)、devdraw.c(提供基本的绘图支持)、devfont.c(提供字体字库支持)、devimage(提供图片绘制拷贝支持)、devkbd.c(提供键盘控制支持)、devrgn.c(提供区域操作动态分配支持)和devpal*.c(*为1、2、4、8,提供调色板支持)。

在分析完驱动层和引擎层后,将它们的相关文件放在同一个目录下,利用gcc编译器编译,链接生成目标文件,然后用ar归档命令即可生成库文件(动态库和静态库),只需要将这个库文件提交给二次开发人员即可进行图形应用程序的开发。

2.2 中文支持

在嵌入式Linux应用系统中,控制台驱动程序和Framebuffer驱动程序对字符的处理都是以单字节为基础的,所以需要进行中文化的改造。

(1)中文显示的支持

这里采用16×16点阵的GB2312字库,字模文件hzk.bin存放在/font/chinese目录下。对于一个需要显示的字符串,首先判断其是属于哪种编码集,如果是ASCII码,就调用Microwindows提供的GdText函数进行显示;如果是汉字,则根据其机内码得到区位码,计算该汉字字模在字模文件中的偏移量,读出该汉字字模,调用底层DrawPixel函数的像素点,并显示这个汉字。

(2)中文输入的支持

由于Microwindows对输入法没有任何支持,所以这一块几乎所有的代码都需要重新编写。目前只提供GB2312字库的拼音输入方法,且只能逐字输入(见图2),同时也默认字模文件hzk.bin存放在/fonts/chinese目录下。

先定义一个拼音结构体:

struct PY_index

{ char PY[6];//拼音的韵母

char *PY_mb;//对应的汉字机内码

};

然后根据GB2312字库和汉字的声母、韵母定义拼音输入法查询码表。查询码表分两部分,第一部分是二级索引表,它将每个拼音和汉字对应起来:

stmct PY_index PY_index_a[5]={

{,阿啊呵腌嗄锕吖},

……

{i,爱哀挨碍埃癌艾唉矮哎皑蔼隘暖霭捱嗳瑷嫒锿嗌砹”},

{o,奥澳傲熬敖凹袄懊坳嗷拗鏖骜鳌翱岙廒遨獒聱媪螯鏊}};

……

strucet PY_index PY_index_z[36]={{a,杂扎砸咋咂匝拶},

{ai,在再载灾仔宰哉栽崽甾),

{an,咱赞暂攒簪糌瓒拶昝趱錾),

……

{un,尊遵樽鳟撙“},

{uo,作做坐座左昨琢佐凿撮柞嘬怍胙唑笮阼祚酢}};

street PY_index PY_index_end [1] = {{,

PY_mb_space}

};

其中PY_mb_space为常量0xffff,它用于两个地方,一是i,v,u三个字母不能作为声母,所以它们没有对应的汉字,这里就以0xffff来约定;二是表示拼音表的结束。

第二部分是一级索引表,它将26个首字母(即声母)和其韵母对应起来:

street PY_index code *code PY_index_headletter[27]=

{

PY_index_a,

PY_index_b,

PY_index_z,

PY_ index_end

};

有了上面定义的两个索引表,就可以进行汉字的输入了。

3 结论

图形应用库提供了图形系统的初始化、键盘操作、区域块拷贝、中西文的输入显示、基本图形绘制等共计40多个API功能函数,很好的满足了低端嵌入式Linux系统的图形应用程序开发的需要。该图形应用库只有70多KB大小,占用资源少,性能稳定,很好的满足了低端信息终端和控制系统等嵌入式Linux产品设计的需要, 目前已经成功应用于嵌入式税控收款机(pos)、自动柜员机(ATM)等嵌入式产品中。

linux轻量级的图形库,基于Microwindows的嵌入式Linux轻量级图形应用库的设计相关推荐

  1. linux 挂iscisc存储,基于arm的嵌入式linux操作系统的移植研究-通信与信息系统专业论文.docx...

    基于arm的嵌入式linux操作系统的移植研究-通信与信息系统专业论文 Classified Index: TP316.8 U.D.C: 621.38 Dissertation for the Mas ...

  2. 基于ARM的嵌入式Linux移植真实体验(3)――操作系统

    基于ARM的嵌入式Linux移植真实体验(3)――操作系统 宋宝华[email]21cnbao@21cn.com[/email] 出处:dev.yesky.com 在笔者撰写的<C语言嵌入式系统 ...

  3. 基于AT91SAM9G20构建嵌入式Linux系统

    本文中使用的目标平台AT91SAM9G20是Atmel公司使用ARM926EJ-S处理器内核开发的一块SoC嵌入式微处理器,主频达到400MHz,具有Atmel 先进的外设DMA 和分布式存储器架构, ...

  4. 基于Yocto构建嵌入式Linux系统U-boot、kernel内核、rootfs文件系统

    前言 Yocto 是一个很强大的构建工具,其功能不仅仅是用来获取BSP源码和简单地编译源码,开发者还可以使用Yocto对其 开发板添加各种第三方开发库,而不需要每次重新从零开始编译源码,解决第三方依赖 ...

  5. [嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计【2018年给力项目】

    [嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计[2018年给力项目]是[创科之龙]团队aiku嵌入式视频教程系列制作的现有的音乐播放器. 主要功能实现: 1.新建工程,基类选 ...

  6. vme嵌入式软件linux,基于VME总线嵌入式Linux应用研究.pdf

    基于VME总线嵌入式Linux应用研究 皋 粮 突 典 悸 猪 笺 诈 虹 切 躲 亦 餐 慌 霄 杆 仗 培 檬 子 厂 饥 捧 铰 吨 卿 娄 承 虚 犯 卒 郧 笛 玉 饭 秋 微 俩 鲤 弹 ...

  7. s3c2440a如何保证嵌入式linux对于虚拟内存的支持?,基于S3C2440的嵌入式LINUX操作系统内核研究【资料学习】.doc...

    学校代码: 11059 学 号:0805070285 Hefei University 毕业论文(设计) BACHELOR DISSERTATION 论文题目: 基于S3C2440的嵌入式 LINUX ...

  8. 基于ARM的嵌入式Linux移植真实体验(1)――基本概念

    基于 ARM 的嵌入式 Linux 移植真实体验( 1 ) ――基本概念 宋宝华   [email]21cnbao@21cn.com[/email] 出处:dev.yesky.com 1. 引言 AR ...

  9. 基于ARM的嵌入式Linux移植真实体验(4)――设备驱动

    基于 ARM 的嵌入式 Linux 移植真实体验( 4 ) ――设备驱动 宋宝华 [email]21cnbao@21cn.com[/email] 出处:dev.yesky.com 设备驱动程序是操作系 ...

  10. 基于CH375的嵌入式USB文件加解密系统的设计

    基于CH375的嵌入式USB文件加解密系统的设计 [日期:2008-7-21] 来源:电子技术应用  作者:华中科技大学 电子与信息工程系, 湖北 武汉 430074 [字体:大 中 小] <s ...

最新文章

  1. 百度世界-“框天地”
  2. 一个JSON字符串和文件处理的命令行神器jq,windows和linux都可用
  3. nginx https 配置
  4. c++ c超简单的求公约数
  5. Oracle bad magic 1,linux下Oracle的安装
  6. 多屏系统上播放幻灯片的设想
  7. iOS开发日记40-详解React Native
  8. 逻辑函数的化简-代数法化简
  9. 谈谈柔性屏/可折叠屏的过去、现在和未来
  10. [转]国内外sns源码搜集
  11. 给自己一个不断学习的理由
  12. linux 网络配置 nm_controlled,LINUX centos7.6修改静态IP与配置参数NM_CONTROLLED
  13. 算法笔记之狄克斯特拉算法
  14. 电脑怎么安装excel表格
  15. 关于时隙、RB、RE、PRB等概念的笔记
  16. 使用latex做IEEE ACCESS排版时候,解决模板作者信息之间的距离问题。
  17. html中表格修改标题间距,css表格间距怎么调?
  18. 刘克亚十二条营销铁律
  19. mysql—自增长和索引
  20. 3.前端开发就业前景

热门文章

  1. c++primer 容器算法整理一
  2. AutoIt:工具栏中没有其它工具,eg,Koda
  3. Python:通过执行100万次打印来比较C和python的性能,以及用C和python结合来解决性能问题的方法 ....
  4. 计算机精品学习资料大放送
  5. Silverlight 2.5D RPG游戏技巧与特效处理:(五“.NET研究”)圣赞之HLSL渲染动画
  6. SpringBoot整合jsp的使用
  7. 监控mysql连接池信息_druid-带监控功能的数据库连接池
  8. 设置linearlayout最大高度_桥式、门式起重机-安全防护装置30条设置要求(六)- 第1~10条...
  9. React 中setState更新state何时同步何时异步?
  10. mac设置多个屏幕显示的问题