• <tt id="syuie"><li id="syuie"></li></tt>
    <menu id="syuie"><u id="syuie"></u></menu>
    <optgroup id="syuie"><source id="syuie"></source></optgroup>
    <table id="syuie"><blockquote id="syuie"></blockquote></table>
  • 推广 热搜: ANDROID  Linux  DSP  如何  芯片  显示  单片机  DIY  控制  游戏 

    基于嵌入式linux系统的GUI方案设计

       日期:2020-06-05     浏览:12    

    嵌入式linux操作系统的快速发展,迫切需求一种简洁的人机交互界面,为此,本文介绍了如何在frameBuffer基础上设计自己的嵌入式GUI的简单方法。

    1 显示原理

    1.1 颜色表示

    颜色是所有绘图操作的基础。16位的LCD屏一般需要2个字节来表示。16位RGB格式一般可分为RGB565与RGB5551两种格式。其中RGB565格式如表1所列,而其RGB5551格式如表2所列。表中的R为红色分量,G为绿色分量,B为蓝色分量。



    由于颜色采用的是RGB565规则。因此。基本颜色,即红色、绿色、蓝色按照RGB565规则可分别为0xf800、0x07e0、Ox001f。由此可见,如果用十六进制直接表示颜色会非常不便。目前,普遍为软件工程师所接受的颜色表示方式为24位的RGB,其中R、G、B三个分量各占用一个字节,范围是0~255。因此,应该为MIS软件系统提供一个从24位RGB转化为16RGB的接口。该接口用宏来实现的具体方式如下:

    #define RGB(r,g,b)  (((r>>3)<<11)∣((g>>2)<<5)∣(b>>3))

    1.2 画点操作

    图形设备接口的最基本操作为画点,任何其它绘图函数都是基于画点来完成的。其原理是以屏的左上角第一个像素点为(0,0)点,向右为x轴,向下为y轴建立坐标系,只要提供某点的横坐标x,纵坐标y和颜色值,就可以通过一定的算法找到(x,y)所表示的地址,然后将该地址上的2个字节替换为指定的颜色值。例如有一块640×480×16的LCD,像素的首地址为0x40000000,那么,其中的第2行、第3列的像素位置如图1所示。



    如果要把第2行、第3列的像素由原来的白色(0xfff)变为黑色(0x0000)。那么,就可以根据下面的寻址方式找到地址:

    最终地址=首地址+y×2×屏的宽度+x×2

    其中,首地址表示第1行第1列像素所对应的地址。由上式,该点的地址=0x40000000+2×2×0x280+3×2=0x40000A06。那么0x40000A06地址对应的数据应为十六位颜色的低字节部分,而0x40000A07地址对应的数据应为十六位颜色的高字节部分。

    例如,画点函数可用下面的代码来实现:



    其中m_pScreen_Addr是屏的首地址,m_nSereen_Width和m_nScreen_Height则分别为屏宽和屏高。这样,就可以在画点的基础上根据Bresenham算法延伸出各种各样的基本绘图操作来,比如画直线、画矩形和画圆等。

    2 frameBuffer接口

    frameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。Linux抽象出frameBuffer这个设备可供用户态进程实现直接写屏。frameBuffer机制模仿显卡的功能是将显卡硬件结构抽象掉,然后通过frameBuffer的读写直接对显存进行操作。用户可以将frameBuffer看成是显示内存的一个映像。在将其映射到进程地址空间之后,就可以直接进行读写操作,而且写操作还可以立即反映在屏幕上。这种操作是抽象的、统一的。用户不必关心物理显存的位置和换页机制等具体细节,而这些都可由frameBuffer设备驱动来完成。

    Linux采用虚拟内存技术,系统中的所有进程之间以虚拟方式共享内存。对每个进程来说,它们好像都可以访问整个系统的所有物理内存。更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内存。在地址空间中,进程有权访问虚拟内存地址区间(比如08048000~0804c000)。这些可被访问的合法地址区间叫做内存区域(memory area)。通过内核,进程可以给自己的地址空间动态地添加或减少内存区域,而进程只能访问有效范围内的内存地址。每个内存区域也具有相应进程必须遵循的特定访问属性,如只读、只写、可执行等属性。如果一个进程访问了不在有效范围中的地址,或以不正确的方式访问了有效地址,那么,内核将会终止该进程,并返回“段错误”信息。

    在应用程序中,一般将frameBuffer设备映射到进程地址空间,比如下面的程序就可打开/dev/ib0设备,并通过mmap系统调用来进行地址映射,随后用memset将屏幕清空。Struct fb_var_screen-info记录了帧缓冲设备和指定显示模式的可修改信息,包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。实现以上过程的函数代码如下:

     
    打赏
     
    更多>同类电子

    推荐图文
    推荐电子
    点击排行
    网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
     
    zmkk1字幕网