LCD屏幕mmap显示

目录

前言

一.LCD显示

二.LCD颜色显示

2.1 直接显示

2.2 mmap映射显示


前言

mmap是一种内存映射文件的方法,它允许将文件或其它对象映射到进程的地址空间

使用mmap映射函数进行映射显示,与屏幕普通直接显示相比有很大的优势

一.LCD显示基础

像素、分辨率和色彩深度是数字图像处理和计算机图形学中三个非常重要的概念,它们共同决定了图像的质量和细节。下面将对这三个概念进行详细解释:

  1. 像素(Pixel) 像素是“picture element”的缩写,指的是构成数字图像的最小单位。每个像素代表图像中的一个点,并且具有特定的颜色值。在数字图像中,像素是按照网格状排列的,每个像素的位置由其在水平和垂直方向上的坐标来确定。图像的尺寸通常由像素的数量来表示,例如,一个1920x1080的图像意味着它在水平方向上有1920个像素,在垂直方向上有1080个像素。

  2. 分辨率(Resolution) 分辨率是指图像中像素的密度,通常以每英寸像素数(Pixels Per Inch,PPI)来衡量。分辨率越高,意味着在相同的物理尺寸下,图像包含的像素点越多,图像的细节也就越丰富。屏幕分辨率和打印分辨率是分辨率的两种常见类型。屏幕分辨率通常指的是显示器能够显示的像素数量,而打印分辨率则是指在每英寸的打印区域内包含的点数,通常以DPI(Dots Per Inch)来表示。

  3. 色彩深度(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的一些相关内容:

  1. 原理概述:mmap将用户空间的虚拟内存地址与文件进行映射,使得对这些内存地址的读写操作等同于对文件的读写操作。这样,可以通过指针来读写映射的内存区域,而系统会自动处理脏页的回写,即将修改过的数据同步到文件所在的磁盘上。
  2. 映射类型:内存映射可以分为两种类型,一种是将虚拟内存映射到匿名物理内存页,通常用于分配和释放内存;另一种是将虚拟内存映射到文件页,用于文件的读写操作。
  3. 优势:mmap的优势在于它提供了一种高效的方式来访问文件,因为它减少了数据在用户空间和内核空间之间的拷贝。此外,它还可以实现不同进程间的文件共享,因为多个进程可以映射同一个文件的不同部分到它们的虚拟地址空间中。
  4. 使用方式:mmap通常通过mmap()munmap()系统调用接口来实现。mmap()用于创建映射,而munmap()用于解除映射。需要注意的是,mmap必须以页(PAGE_SIZE)为单位进行映射。
  5. 缺点:虽然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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/795868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树进阶——手撕二叉搜索树

troop主页&#xff1a;troop 手撕二叉搜索树 1.二叉搜索树的定义2.实现&#xff08;非递归&#xff09;补充结构2.1查找2.2插入2.3删除&#xff08;重要&#xff09;情况1(无孩子&&一个孩子&#xff09; 3.二叉搜索树的应用3.1K模型3.2KV模型3.2.1KV模型的实现 总结二叉…

Github 2024-04-05Java开源项目日报Top9

根据Github Trendings的统计,今日(2024-04-05统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9TypeScript项目1OpenAPI 生成器:基于规范自动生成API工具 创建周期:2155 天开发语言:Java协议类型:Apache License 2.0Star数量:1…

linux操作系统安装及命令初识,上岸蚂蚁金服

310 包&#xff09; desktop 1800个包左右 内容必须大于 768M 系统设置 分区设置 挂载点 /boot / swap 交换分区–占用磁盘容量 网络配置 网卡配置 设置为ON 主机名配置 Begin installation 设置 root 用户密码 命令初识 命令 选项 参数&#xff1a; 命令选项参数…

独角数卡对接码支付收款教程

1、到码支付后台找到支付配置。2、将上面的复制依次填入&#xff0c;具体看下图&#xff0c;随后点立即添加 商户ID商户PID 商户KEY异步不能为空 商户密钥商户密钥

【Python使用】嘿马头条完整开发md笔记第4篇:数据库,1 方案选择【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;课程简介&#xff0c;ToutiaoWeb虚拟机使用说明1 产品介绍,2 原型图与UI图,3 技术架构,4 开发,1 需求,2 注意事项。数据库&#xff0c;理解ORM1 简介,2 安装,3 数据库连接…

六、从零实战企业级K8S本地部署ThingsBoard专业版集群

1、从 docker hub 拉取 ThingsBoard PE 映像(所有节点) 1.1、查看k8s信息(主节点) kubectl cluster-info #查看k8s集群信息 kubectl get node #查看节点信息 kubectl get pod -A #查看内部组件1.2、从 docker hub 拉取 ThingsBoard PE 映像(所有…

《QT实用小工具·十六》IP地址输入框控件

1、概述 源码放在文章末尾 该项目为IP地址输入框控件&#xff0c;主要包含如下功能&#xff1a; 可设置IP地址&#xff0c;自动填入框。 可清空IP地址。 支持按下小圆点自动切换。 支持退格键自动切换。 支持IP地址过滤。 可设置背景色、边框颜色、边框圆角角度。 下面…

【35分钟掌握金融风控策略5】风控策略开发1

目录 风控策略开发 策略类型划分 单维度策略开发 风控策略开发 在风控过程中&#xff0c;风控策略最终是要直接参与风控决策的&#xff0c;风控策略的好坏会对风控结果产生直接影响&#xff0c;因此&#xff0c;开发有效的风控策略至关重要。 策略类型划分 在实际生产中&…

Redis Desktop Manager可视化工具

可视化工具 Redis https://www.alipan.com/s/uHSbg14XmsL 提取码: 38cl 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 官网下载&#xff08;不推荐&#xff09;&#xff1a;http…

selenium 遮罩层

之前写智联自动投简历 和boss自动投简历的时候 发现操作到上限之后就有个遮罩层&#xff0c;会在当前页面有个顶层得div 没办法获取下面的内容 # 假设遮罩层元素有一个特定的ID或者其他属性 没有id xpath 或者class 都可以mask_element WebDriverWait(driver, 10).until(EC.…

网络网络层之(3)IPv6地址

网络网络层之(3)IPv6协议 Author: Once Day Date: 2024年4月2日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

C语言-------内存函数

前面向大家介绍了C语言中的字符函数和字符串函数&#xff0c;今天再向大家介绍一下类似的函数———— C语言中的内存函数。 1. memcpy函数的使用和模拟实现 memcoy函数是一种通过内存来复制内容的一种函数&#xff0c;以字节为基本单位进行&#xff0c;斌并且是一个可以复制…

git可视化工具

Gitkraken GitKraken 是一款专门用于管理和协作Git仓库的图形化界面工具。它拥有友好直观的界面&#xff0c;使得Git的操作变得更加简单易用&#xff0c;尤其适合那些不熟悉Git命令行的开发者。GitKraken提供了丰富的功能&#xff0c;如代码审查、分支管理、仓库克隆、提交、推…

如何使用CSS构建一个瀑布流布局

如何使用CSS构建一个瀑布流布局 瀑布流布局是一种常见的网页布局方式&#xff0c;其中元素以不同的大小排列&#xff0c;且行与列之间没有不均匀的间隙。在瀑布流布局中&#xff0c;即使某一行或列中的元素较短&#xff0c;下一个元素也会占据空间。 如何实现瀑布流布局 实现…

java框架学习——反射概述及简易版框架搭建

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 反射 反射&#xff08;Reflection&#xff09;&#xff1a;加载类&#xff0c;并允许以编程的方式解剖类中的各种成分&#xff08;成员变量&#xff0c;方法&#xff0c;构造器等&#xff09; 1&…

C++之类和对象(上)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1访问限定符 4.2 类的两种定义方式 第一种&#xff1a; 第二种&#xff1a; 4.3封装 5.类的实例化 6.类对象模型 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;…

出门一笑, “栈” 落江横 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

03-自媒体文章发布

自媒体文章发布 1)自媒体前后端搭建 1.1)后台搭建 ①&#xff1a;资料中找到heima-leadnews-wemedia.zip解压 拷贝到heima-leadnews-service工程下&#xff0c;并指定子模块 执行leadnews-wemedia.sql脚本 添加对应的nacos配置 spring:datasource:driver-class-name: com…

23年蓝桥杯省赛 动态规划DP

动态规划 就是:给定一个问题&#xff0c;我们把它拆成一个个子问题&#xff0c;直到子问可以直接解决。然后把子问题的答案保存起来&#xff0c;以减少重量计算&#xff0c;再根据子问题答察反推&#xff0c;得出问解的一种方法。 题目&#xff1a; 这天&#xff0c;一只蜗牛…

QT串口接收数据并进行波形显示(含源码)

**使用QT在串口调试助手基础上实现波形显示&#xff08;含源码&#xff09; 评论比较多留言需要源码的&#xff0c;逐个发邮箱比较麻烦也不能及时回复&#xff0c;现将源码上传至链接&#xff08;无需积分下载&#xff09;https://download.csdn.net/download/m0_51294753/877…