目录
前言
一.LCD显示
二.LCD颜色显示
2.1 直接显示
2.2 mmap映射显示
前言
mmap是一种内存映射文件的方法,它允许将文件或其它对象映射到进程的地址空间。
使用mmap映射函数进行映射显示,与屏幕普通直接显示相比有很大的优势
一.LCD显示基础
像素、分辨率和色彩深度是数字图像处理和计算机图形学中三个非常重要的概念,它们共同决定了图像的质量和细节。下面将对这三个概念进行详细解释:
像素(Pixel) 像素是“picture element”的缩写,指的是构成数字图像的最小单位。每个像素代表图像中的一个点,并且具有特定的颜色值。在数字图像中,像素是按照网格状排列的,每个像素的位置由其在水平和垂直方向上的坐标来确定。图像的尺寸通常由像素的数量来表示,例如,一个1920x1080的图像意味着它在水平方向上有1920个像素,在垂直方向上有1080个像素。
分辨率(Resolution) 分辨率是指图像中像素的密度,通常以每英寸像素数(Pixels Per Inch,PPI)来衡量。分辨率越高,意味着在相同的物理尺寸下,图像包含的像素点越多,图像的细节也就越丰富。屏幕分辨率和打印分辨率是分辨率的两种常见类型。屏幕分辨率通常指的是显示器能够显示的像素数量,而打印分辨率则是指在每英寸的打印区域内包含的点数,通常以DPI(Dots Per Inch)来表示。
色彩深度(Color Depth) 色彩深度又称为位深度(Bit Depth),是指每个像素可以表示的颜色数的多少。色彩深度越高,表示的颜色就越多,图像的色彩层次也就越丰富。色彩深度通常以位数(bit)来表示,例如:
- 1位色彩深度:可以表示2^1=2种颜色(通常为黑白)。
- 8位色彩深度:可以表示2^8=256种颜色。
- 24位色彩深度:可以表示2^24约1677万种颜色(标准的真彩色)。
- 32位色彩深度:除了24位的RGB颜色信息外,还包括8位的Alpha通道,用于表示透明度信息。
这三个概念相互关联,共同影响图像的质量和观感。例如,一个高分辨率的图像如果在色彩深度上不足,可能会导致颜色过渡不自然;而一个色彩深度很高的图像如果分辨率较低,可能无法展现足够的细节。因此,在图像处理和设计中,需要根据具体需求和应用场景来平衡这三个因素,以达到最佳的视觉效果。
二.LCD颜色显示
2.1 直接显示
如果不使用mmap函数,内存映射。把arm-linux-gcc编译后生成的文件,传送到开发板中,显示颜色,我们可以观察下屏幕显示的效果,有部分像素没有显示出来,甚至要把源文件运行两遍色彩才会正常
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define LCD_PATH "/dev/fb0" int main(int argc, char const *argv[]) { // 1. 打开LCD 设备文件 int fd_lcd = open( LCD_PATH , O_RDWR ); if( -1 == fd_lcd) { perror("open lcd error"); return -1 ; } // 2. 写入RGB的十六进制 int color = 0xFF7F ; for (size_t i = 0; i < 800*480; i++) { write(fd_lcd , &color , 4); } // 3. 关闭 close(fd_lcd); return 0; }
这里的write函数,它会自动移动直到for循环结束
2.2 mmap映射显示
mmap是一种内存映射文件的方法,它允许将文件或其它对象映射到进程的地址空间。
以下是mmap的一些相关内容:
- 原理概述:mmap将用户空间的虚拟内存地址与文件进行映射,使得对这些内存地址的读写操作等同于对文件的读写操作。这样,可以通过指针来读写映射的内存区域,而系统会自动处理脏页的回写,即将修改过的数据同步到文件所在的磁盘上。
- 映射类型:内存映射可以分为两种类型,一种是将虚拟内存映射到匿名物理内存页,通常用于分配和释放内存;另一种是将虚拟内存映射到文件页,用于文件的读写操作。
- 优势:mmap的优势在于它提供了一种高效的方式来访问文件,因为它减少了数据在用户空间和内核空间之间的拷贝。此外,它还可以实现不同进程间的文件共享,因为多个进程可以映射同一个文件的不同部分到它们的虚拟地址空间中。
- 使用方式:mmap通常通过
mmap()
和munmap()
系统调用接口来实现。mmap()
用于创建映射,而munmap()
用于解除映射。需要注意的是,mmap必须以页(PAGE_SIZE)为单位进行映射。- 缺点:虽然mmap提高了文件操作的效率,但它也需要处理同步和锁定页缓存的问题。此外,如果映射的文件非常大,可能会占用大量的虚拟内存地址空间。
总的来说,mmap是操作系统提供的一种强大功能,它通过内存映射机制优化了文件的读写过程,减少了数据拷贝,提高了数据处理效率。然而,它也需要合理管理,以确保系统资源的高效使用。
使用mmap内存映射函数,
其中行为800像素点,列为480像素点,也就是显示屏的行:可以使用800int进行表示,列:可以使用400个int表示,mmap的返回值为int*
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #define LCD_PATH "/dev/fb0" int main(int argc, char const *argv[]) { // 1. 打开LCD 设备文件 int fd_lcd = open( LCD_PATH , O_RDWR ); if( -1 == fd_lcd) { perror("open lcd error"); return -1 ; } // 内存映射 int * p_lcd = mmap(NULL , 800*480*4 , PROT_READ | PROT_WRITE , MAP_SHARED , fd_lcd , 0 ); if (MAP_FAILED == p_lcd) { perror("mmap error"); return -1 ; } // 2. 写入RGB的十六进制 int color[3] = {0x00FF0000, 0x0000FF00, 0x000000FF}; // int (* buf)[480][800] = calloc() int i = 0 ; while(1) { for (int y = 0; y < 480 ; y++) { for (int x = 0; x < 800 ; x++) { // x宽 y高度, 假设y=5 则表示需要跳过5行 * (p_lcd+x+y*800) = color[i] ; } } i++ ; if (i >= 3 ) { i = 0 ; } sleep(1); } // for (size_t i = 0; i < 800*480; i++) // { // * (p_lcd+i) = color ; // } // 3. 关闭 close(fd_lcd); munmap(p_lcd , 800*480*4 ); return 0; }