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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2. 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效

文章目录 如何让mybatis-plus的逻辑删除注解TableLogic临时失效1. 场景复现1.1 controller代码1.2 service层代码1.3 entity代码 2. 问题分析3. 解决方案3.1 说明3.2 核心代码3.3 service方法对应修改为3.4 运行结果 如何让mybatis-plus的逻辑删除注解TableLogic临时失效 1. 场…

数学矩阵GCD和lCM(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容&#xff0c;但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数&#xff0c;只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时&#xff0c;才能相乘&#xff0c;否则不允…

移动Web学习05-移动端适配Less预处理器

7、移动端适配 7.1、什么是适配&#xff1f; 简单理解就是、同一个网页&#xff0c;在不同屏幕分辨率的设备下、显示还是一样的&#xff0c;你可以理解为、网页当中的图片&#xff0c;盒子之间的距离、文字的大小、随着屏幕分辨率的变化而变化 前面我们学习了flex布局的方式…

关系型数据库与非关系型数据库、Redis数据库

相比于其他的内存/缓存数据库&#xff0c;redis可以方便的实现持久化的功能&#xff08;保存至磁盘中&#xff09; 一、关系数据库与非关系型数据库 1.1 关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型基础上一般面向于记录 SQL语句 (标准数据查询语言) 就是一种…

二叉树学习

树 树是n个结点的有限集合&#xff0c;当n0时为空树&#xff0c;在任意一颗非空的树中&#xff0c;有且只有一个特定的称为根的结点&#xff0c;当n>1时&#xff0c;其余结点又可以分为m个不相交的有限集&#xff0c;其中每一个集合又是一棵树&#xff0c;并且称为根的子树…

深度学习方法;乳腺癌分类

乳腺癌的类型很多&#xff0c;但大多数常见的是浸润性导管癌、导管原位癌和浸润性小叶癌。浸润性导管癌(IDC)是最常见的乳腺癌类型。这些都是恶性肿瘤的亚型。大约80%的乳腺癌是浸润性导管癌(IDC)&#xff0c;它起源于乳腺的乳管。 浸润性是指癌症已经“侵袭”或扩散到周围的乳…

c# wpf template itemtemplate+dataGrid

1.概要 2.代码 <Window x:Class"WpfApp2.Window8"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend…

《UE5_C++多人TPS完整教程》学习笔记30 ——《P31 摄像机和弹簧臂(Camera And Spring Arm)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P31 摄像机和弹簧臂&#xff08;Camera And Spring Arm&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;…

SpringBoot+ECharts+Html 地图案例详解

1. 技术点 SpringBoot、MyBatis、thymeleaf、MySQL、ECharts 等 此案例使用的地图是在ECharts社区中查找的&#xff1a;makeapie echarts社区图表可视化案例 2. 准备条件 在mysql中创建数据库echartsdb&#xff0c;数据库中创建表t_location_count表&#xff0c;表中设置两个…

梯度下降算法(Gradient Descent)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法引言 梯度下降算法&#xff0c;这个在机器学习中非常常见的算法&#xff0c;可以用下山的例子来形象地解释。想象一下&#xff0c;你在一座…

Type-c转USBA3.0芯片 USBA3.0转Type-c芯片(USB3.1GEN2 多路切换Switch芯片) VL162

VL162具有CC功能的USB Type-C数据开关USB 3.1 Gen2 (10Gbps) VL162 带CC功能的USB Type-C数据开关 支持最高10Gbps 2差分通道&#xff0c;2:1 MUX/DeMUX 兼容10Gbps USB3.1 Gen2 低功耗&#xff0c;6mW在设备模式下有效 高直流共模电压&#xff0c;支持2.0V 28针QFN 3.5 x 4.5m…

[RK3128_LINUX5.1] 关于 RetroArch 使用

问题描述 查看文档 docs\cn\Linux\ApplicationNote\Rockchip_Use_Guide_Linux_RetroArch_CN.pdf&#xff0c;描述为实验 make menuconfig 后勾选选项 Libretro cores and retroarch -> retroarch 但是SDK中并没有这个选项 解决方案&#xff1a; 目前发布的buildroot SDK…

MySQL -- 08_最流行的查询需求分析(日期相关、生日、年份距离等~)

目录 最流行的查询需求分析08演示数据准备的SQL需求演示日期相关的查询函数46、查询各学生的年龄使用 timestampdiff() 函数更精准 47、查询本周过生日的学生简单写法&#xff1a;weekofyear针对不规范日期格式的判断写法&#xff1a; 48、查询下周过生日的学生49、查询本月过生…

STC89C51学习笔记(四)

STC89C51学习笔记&#xff08;四&#xff09; 综述&#xff1a;本文讲述了在STC89C51中数码管、模块化编程、LCD1602的使用。 一、数码管 1.数码管显示原理 位选&#xff1a;对74HC138芯片的输入端的配置&#xff08;P22、P23、P24&#xff09;&#xff0c;来选择实现位选&…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--创建新主题

前言 你可以在wordpress里面下载使用人家打包好的主题&#xff0c;但可能不是很好用&#xff0c;接下来就自己做一个自己的主题。你需要先找到xampp文件夹–htdocs–wordpress(我给更名为wplocal)–wp-content–themes 进入该文件夹之后你可以看到你之前下载导入的所有主题文件…

深度学习十大算法之深度Q网络(DQN)

一、简介 深度Q网络&#xff08;DQN&#xff09;是一种结合了深度学习和强化学习的算法&#xff0c;它在近年来成为了人工智能领域的一个热点。DQN首次被引入是在2013年&#xff0c;由DeepMind的研究人员开发。它标志着深度学习技术在解决高维度决策问题上的一大突破。 DQN的…

Redis -- 缓存穿透问题解决思路

缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&#xff1a; 额外…

Web大并发集群部署之集群介绍

一、传统web访问模型 传统web访问模型完成一次请求的步骤 1&#xff09;用户发起请求 2&#xff09;服务器接受请求 3&#xff09;服务器处理请求&#xff08;压力最大&#xff09; 4&#xff09;服务器响应请求 传统模型缺点 单点故障&#xff1b; 单台服务器资源有限&…

如何用putty通过ssh连接ubuntu

1. 下载和安装PuTTY 访问PuTTY官网下载PuTTY的最新版本。 2. 打开PuTTY 解压下载的文件后&#xff0c;找到PuTTY文件并双击打开。 3. 配置SSH连接 在ubuntu下安装ssh服务在安装ssh时&#xff0c;我一直遇到一个问题&#xff0c;原因是我的虚拟机连不上网&#xff0c;反复实…

Spark-Scala语言实战(13)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的keys和values,reduceByKey,groupByKey三种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢…