企业备案 网站服务内容,网站建设编辑部,招商网站建设全包,电子商务网站建设收获目录 前言 一.LCD显示 二.LCD颜色显示 2.1 直接显示 2.2 mmap映射显示 前言 mmap是一种内存映射文件的方法#xff0c;它允许将文件或其它对象映射到进程的地址空间。 使用mmap映射函数进行映射显示#xff0c;与屏幕普通直接显示相比有很大的优势 一.LCD显示基础 像素、分辨… 目录 前言 一.LCD显示 二.LCD颜色显示 2.1 直接显示 2.2 mmap映射显示 前言 mmap是一种内存映射文件的方法它允许将文件或其它对象映射到进程的地址空间。 使用mmap映射函数进行映射显示与屏幕普通直接显示相比有很大的优势 一.LCD显示基础 像素、分辨率和色彩深度是数字图像处理和计算机图形学中三个非常重要的概念它们共同决定了图像的质量和细节。下面将对这三个概念进行详细解释 像素Pixel 像素是“picture element”的缩写指的是构成数字图像的最小单位。每个像素代表图像中的一个点并且具有特定的颜色值。在数字图像中像素是按照网格状排列的每个像素的位置由其在水平和垂直方向上的坐标来确定。图像的尺寸通常由像素的数量来表示例如一个1920x1080的图像意味着它在水平方向上有1920个像素在垂直方向上有1080个像素。 分辨率Resolution 分辨率是指图像中像素的密度通常以每英寸像素数Pixels Per InchPPI来衡量。分辨率越高意味着在相同的物理尺寸下图像包含的像素点越多图像的细节也就越丰富。屏幕分辨率和打印分辨率是分辨率的两种常见类型。屏幕分辨率通常指的是显示器能够显示的像素数量而打印分辨率则是指在每英寸的打印区域内包含的点数通常以DPIDots Per Inch来表示。 色彩深度Color Depth 色彩深度又称为位深度Bit Depth是指每个像素可以表示的颜色数的多少。色彩深度越高表示的颜色就越多图像的色彩层次也就越丰富。色彩深度通常以位数bit来表示例如 1位色彩深度可以表示2^12种颜色通常为黑白。8位色彩深度可以表示2^8256种颜色。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/fb0int 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/fb0int 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高度 假设y5 则表示需要跳过5行* (p_lcdxy*800) color[i] ;}}i ;if (i 3 ){i 0 ;}sleep(1);}// for (size_t i 0; i 800*480; i)// {// * (p_lcdi) color ;// }// 3. 关闭 close(fd_lcd);munmap(p_lcd , 800*480*4 );return 0;
}