提高LCD显示效率
⦁ 内存映射
可以发现通过系统IO直接操作LCD的时候LCD屏的部分像素点会显示"黑线",过段时间或者重新再次运行程序之后"黑线"会慢慢消失。其实这种现象并不是由于硬件原因导致的,而是系统调用的过程中数据传输效率较低导致的。
int buf[800*480] -->用户缓冲区-->循环放入颜色分量-->调用write()写入LCD --> 把用户缓冲区的数据拷贝到内核缓冲区--->内核把缓冲区中的颜色分量依次写入LCD的驱动程序-->LCD看到显示效果。
由于write函数是系统调用,所以数据需要先从用户态进入到内核态,将用户态中的缓冲区数据拷贝到操作系统的内核缓冲区当中,此时已经完成了第一次数据拷贝,然后再将内核缓冲区中的数据再次拷贝到磁盘当中,此时完成了第二次拷贝。在这个过程当中我们进行了两次拷贝,数据传输的效率是比较低的。
为了提高数据的传输效率,那就需要减少拷贝次数,可以通过Linux系统的一个叫做mmap()的函数接口实现。mmap的全称是memory map,翻译为中文也就是内存映射,其实是一种内存映射文件的方法。
通过内存映射,用户可以将一个文件或者其它对象映射到进程的地址空间,从而实现磁盘的一段物理地址和进程的一段虚拟地址建立对应关系。
通过mmap()这个系统调用函数,用户可以让多个进程之间通过映射到同一个普通文件实现共享内存,普通文件被映射到进程地址空间之后,进程可以向访问普通内存一样对文件进行一系列操作,就不需要调用read/write函数,比如为LCD屏进行内存映射,用户把颜色数据写入到内存中,则LCD屏的像素点也会进行刷新。

使用mmap可以减少一次拷贝,并且采用内存操作比read和write要简单一些,用户不需要在用户空间定义缓冲区来保存从内核缓冲区读上来的数据,从而节约了内存的消耗。

BMP图像原理与应用
实际项目开发过程中只在LCD液晶屏显示单一的颜色并不能满足设计需求,为了实现人机交互以及提供用户体验,UI工程师都需要设计符合产品主题的图像素材,然后提交给软件工程师进行人机界面的交互设计。由于Linux系统"一切皆文件"的特性,所以图片在Linux系统中也是以文件的形式存储。
⦁ 图像格式
另外,图像中的数据必须按照某个已知的、公认的数据存储顺序和结构进行存储,这样才可以使不同的应用程序对该图像文件顺利的进行访问,从而实现数据共享。图像数据在文件中的存储顺序和结构也被称为图像文件格式。
目前广为流传的图像文件格式有许多,常见格式包括BMP、GIF、JPEG、TIFF、MPEG等。在各种图像文件格式中,一部分是由某个软硬件厂商提出并被广泛接受和采用的格式,例如 BMP格式就是由微软公司(MicroSoft)公司发明的数据封装格式。另一部分是由各种国际标准组织提出的格式,例如JPEG格式就是由国际静止图像压缩标准组织提出的格式。
⦁ 基本概念
BMP格式最大的特征是没有任何的压缩,因此文件尺寸比较大,不适合网络传输,但是优点是这种图像格式中的数据读取出来不需要任何解码器解码就可以直接使用,所以为了便于大家对图像格式进行了解,就先以BMP格式进行讲解。

⦁ 内部结构
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:分别是位图文件头、位图信息头、调色板(24bit位图是没有的)、位图数据(RGB)。
可以看到,BMP文件的位图文件头和位图信息头一共为54字节大小,其中位图文件头为14字节,位图信息头为40字节。
(1) 位图文件头
位图文件头(Bitmap-File Header)包含了图像类型、图像大小、两个保留字以及位图数据存放地址。
(2) 位图信息头
位图信息头(Bitmap-Information Header)包含了位图信息头的大小、图像的宽和高、图像的色深、压缩说明、图像数据的大小和其他一些参数。

练习:设计程序,利用系统IO读取磁盘上指定BMP图片的宽和高,以及BMP图片的大小,并输出到终端,要求图片名称通过命令行传递。
(3) 调色板
bmp位图按照像素深度分类可以分为:1bit位图(2色)、4bit位图(16色)、8bit位图(256色)、16bit位图(65536色-高彩色)、24bit位图(1670万色-真彩色)、32bit位图(1670万色-增强型真彩色)。
调色板是为了让一些颜色深度比较小(1bit、4bit、8bit)的位图可以表示颜色而设置的。调色板存储颜色,后面的位图数据存储颜色索引,这样调色板+位图数据就可以表示颜色了。
需要注意的是:16bit、24bit、32bit的位图一般没有调色板,因为从16bit开始就直接使用位图数据表示颜色了。
(4) 位图数据
位图数据分两种情况,如果带调色板,则位图数据存放的是调色板的颜色索引,如果不带调色板,则位图数据存放实际的argb值。由于24位bmp图片不带调色板,所以文件开头的54字节为图片信息,从第55个字节开始就为bmp图片的颜色数据。
⦁ 对齐说明
思考:计算当前这张BMP图片的总大小(按字节为单位计算),提示:1个像素点3字节!
回答:计算机的CPU为了提高工作效率,所以读取数据的时候会进行字节对齐,一般图像刷新都是行为单位,所以CPU每次都是读取一行的大小,所以32bit系统下如果一行字节大小不是4的倍数,就会进行字节补齐,目的是提高效率,是典型的用空间来换时间的案例!
分辨率是10*10,每行10个像素点,每个像素点3字节,所以一行是30个字节,不够4的倍数,所以需要在每行的末尾补2个字节。
由于每行必须是4的倍数,所以需要补齐的字节数有4种情况:0、1、2、3,所以需要设计算法来计算每行需要自动补齐的字节数。 公式: byte = ( 4 - (width*3 % 4) ) % 4
⦁ 存储顺序
如果打算了解BMP图片内部数据的存储顺序(大端 or 小端),应该去查看BMP文件内部数据结构,需要使用专业工具(HEX十六进制查看器)。
通过分析,可以知道BMP图片内部数据是采用小端方式进行存储,千万要背下来!
⦁ 像素结构
