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

嵌入式linux系统GUI如何来实现

其中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记录了帧缓冲设备和指定显示模式的可修改信息,包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。实现以上过程的函数代码如下:

嵌入式linux系统GUI如何来实现

此外,FrameBuffer设备还提供了若干ioctl命令,通过这些命令可以获得显示设备的一些固定信息(比如显示内存大小)以及与显示模式相关的可变信息(比如分辨率、象素结构、扫描线的字节宽度),同时可获得伪彩色模式下的调色板信息等。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查