LCD屏幕mmap显示

news2024/12/22 19:09:50

目录

前言

一.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.coloradmin.cn/o/1571493.html

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

相关文章

mac 切换 jdk

查看 mac 上都有哪些版本 /usr/libexec/java_home -V看准版本切换 按前缀切换 比如 export JAVA_HOME/usr/libexec/java_home -v 1.8这样会随机一个 1.8 的 如果想再确定一个比如 openjdk export JAVA_HOME/usr/libexec/java_home -v 1.8.0_292这个方式是临时的&#xff0c…

图像处理入门 3(how to get the pixel pitch / 如何获得单个像素的尺寸)

在这里一节里面&#xff0c;将记录如何获得一个相机传感器中单个像素点的尺寸&#xff0c;为了实现不同相机照片之间的匹配。 如果我们知道了相机传感器的尺寸和分辨率的大小&#xff0c;自然就可以求出单个像素的大小。 在这里插入图片描述&#xff1a; 如何获得相机传感器的…

vue创建项目下载动态路由v-for mounted websocket :style :class store使用说明

在Vue中创建一个项目&#xff0c;并整合动态路由、v-for、mounted生命周期钩子、WebSocket、:style、:class以及Vuex的store&#xff0c;涉及到多个Vue核心特性的使用。下面我将简要说明如何逐步整合这些特性。 1. 创建Vue项目 使用Vue CLI创建项目&#xff1a; 2. 配置动态路…

[蓝桥杯 2017 国 C] 合根植物

[蓝桥杯 2017 国 C] 合根植物 题目描述 w 星球的一个种植园&#xff0c;被分成 m n m \times n mn 个小格子&#xff08;东西方向 m m m 行&#xff0c;南北方向 n n n 列&#xff09;。每个格子里种了一株合根植物。 这种植物有个特点&#xff0c;它的根可能会沿着南北…

spark-hive连接操作流程、踩坑及解决方法

文章目录 1 简介2 版本匹配3 spark hive支持版本源码编译3.1 spark-src下载3.2 maven换源3.3 spark编译 4 hive 安装与mysql-metastore配置4.1 mysql下载安装4.1.1 为mysql设置系统环境变量4.1.2 初次登陆更改root身份密码4.1.3 安装后直接更改密码 4.2 hive初始化4.2.1 编写hi…

Ps:色调均化

色调均化 Equalize命令通过均匀分布图像的亮度值来优化图像的对比度&#xff0c;使得图像色调更加平衡。 Ps菜单&#xff1a;图像/调整/色调均化 Adjustments/Equalize “色调均化”只有调整命令&#xff0c;无调整图层&#xff0c;无选区时无操作选项。 色调均化命令将重新映射…

hbuilderX创建的uniapp项目转移到vscode

场景&#xff1a;一直使用hbuilderX开发的朋友想转移到vscode获取更好的TypeScript支持&#xff0c;所以想把整个项目目录拖到vscode进行开发&#xff0c;但发现运行不了&#xff0c;提示没有package.json等&#xff0c;并且不能执行pnpm命令 首先&#xff0c;我们先来看一下h…

LeetCode刷题实战1:两数之和

从今天开始加入刷题大军&#xff0c;把算法题刷爆&#xff0c;我们直接进入主题。 题目内容 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应…

zdpreact_antdesginpro 研究一下react里面比较流行的一个UI框架,开发后台管理系统

首先看一下最开始的代码&#xff1a; 这里面大部分的东西都可以删掉&#xff0c;比如README&#xff0c;只留下中文的那个就可以了。 之后看看README.md中介绍的特性。 特性 &#x1f4a1; TypeScript: 应用程序级 JavaScript 的语言&#x1f4dc; 区块: 通过区块模板快速…

canvas画图,画矩形、圆形、直线可拖拽移动,可拖拽更改尺寸大小

提示&#xff1a;canvas画图&#xff0c;画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖拽移动 文章目录 前言一、画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖拽移动总结 前言 一、画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖…

2024最新在线工具箱/ 站长IT工具箱/网站系统源码下载

2024最新在线工具箱/ 站长IT工具箱/网站系统源码下载- 更多详情及下载地址请访问https://a5.org.cn/a5_ziyuan/39525.html 转载请注明出处!

Android Studio gradle-8.4 配置 GreenDao

1.配置项目下的build buildscript {repositories {mavenCentral()}dependencies {classpath ("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0")classpath ("org.greenrobot:greendao-gradle-plugin:3.3.1") // 使用最新版本} } 2.配置app下的build i…

泰坦尼克号幸存者数据分析

泰坦尼克号幸存者数据分析 1、泰坦尼克号数据集2、数据集加载与概览3、泰坦尼克号幸存者数据分析4、哪些人可能成为幸存者&#xff1f; 1、泰坦尼克号数据集 泰坦尼克号的沉没是世界上最严重的海难事故之一&#xff0c;造成了大量的人员伤亡。这是一艘号称当时世界上最大的邮轮…

深入浅出 -- 系统架构之分布式CAP理论和BASE理论

科技进步离不开理论支撑&#xff0c;而当下大行其道的分布式架构&#xff0c;透过繁荣昌盛表象&#xff0c;底层同样离不开诸多分布式理论撑持。当然&#xff0c;相信诸位在学习分布式相关技术时&#xff0c;必然学到过两个分布式领域中的基础理论&#xff0c;即&#xff1a;CA…

Java零基础入门-递归

一、概述 上一期&#xff0c;我们是具体学习了File类的一些概念基础知识点&#xff0c;以及对于该类的常用方法进行了一个全量举例演示&#xff0c;这也是考虑到有的小伙伴在阅读的同时&#xff0c;没有时间去实际测试&#xff0c;所以我也就顺带的给大家去做了实例演示&#x…

自动驾驶涉及相关的技术

当科幻走进现实&#xff0c;当影视照进生活&#xff0c;无数次憧憬的自动驾驶&#xff0c;正在慢慢的梦想成真。小时候天马星空的想象&#xff0c;现在正悄无声息的改变着我们的生活。随着汽车电动化进程的加快&#xff0c;自动驾驶技术映入眼帘&#xff0c;很多人可能感觉遥不…

软考 系统架构设计师系列知识点之数据库基本概念(1)

所属章节&#xff1a; 第6章. 数据库设计基础知识 第1节 数据库基本概念 数据&#xff08;Data&#xff09;是描述事务的符号记录&#xff0c;它具有多种表现形式&#xff0c;可以是文字、图形、图像、声音和语言等。信息&#xff08;Information&#xff09;是现实世界事物的…

使用SVD将图像压缩四分之一(MATLAB)

SVD压缩前后数据量减少的原因在于&#xff0c;通过奇异值分解&#xff08;SVD&#xff09;&#xff0c;我们将原始数据&#xff08;如图像&#xff09;转换成了一种更加紧凑的表示形式。这种转换依赖于数据内部的结构和相关性&#xff0c;以及数据中信息的不均匀分布。 让我们…

10-用PySpark建立第一个Spark RDD

目录 RDD概念RDD特点建立RDD的方式不同工具建立RDD的方式使用PySpark Shell(交互环境)建立RDD使用VSCode编程建立RDD使用Jupyter Notebook建立RDD 总结 PySpark实战笔记系列第一篇 RDD概念 Apache Spark的核心组件的基础是RDD。所谓的RDD&#xff0c;即弹性分布式数据集&#…

FL Studio 21.2.2官方中文破解版2024年最新图文安装激活教程 FL Studio 21免费激活

FL Studio 21.2.2官方中文破解版&#xff0c;中文别名水果编曲软件&#xff0c;是一款全能的音乐制作软件&#xff0c;包括编曲、录音、剪辑和混音等诸多功能&#xff0c;让你的电脑编程一个全能的录音室&#xff0c;它为您提供了一个集成的开发环境&#xff0c;使用起来非常简…