粤嵌GEC6818-学习笔记2-屏幕相关及音频播放

2023-10-29

LCD屏幕

简介

  • 屏幕的分辨率是:800480,即屏幕是由800480个像素点组成的。
  • 像素点:可以组成颜色的点!
  • 每个像素点占32bit,由A R G B组成,各占8各bit
像素点 A(透明度) R(red) G(green) B(blue)
color 00 ff 00 00
unsigned int color = 0x00ff0000;
  • 这种模式使得我们可以把颜色数量化 。

操作:打开屏幕

  • 屏幕的路径:“/dev/fb0”
int lcd_fd;
lcd_fd = open("/dev/fb0",O_RDWR);
if(lcd_fd == -1)
{
    printf("open error\n");
    return -1;
}

映射

  • 帧缓冲设备是linux为显存设备提供一个接口,把显存抽象后的一种设备!他允许上次应用程序在图像模式下直接对显示缓冲区进行读写!
int *plcd;   //假设这个指针是指向lcd屏幕的首地址!

*plcd = 0x00ff0000;   //给第一个像素点写入红色
*(plcd+1) = 0x00ff0000 ; //这是给lcd屏幕第二个像素点写入红色

for(int y = 0 ; y < 480 ; y++)
{
    for(int x = 0 ; x < 800 ; x++)
    {
        *(plcd + y * 800 + x) = 0x00ff0000;   // color
    }
}
//写一个画点的封装函数!
void Lcd_Draw_point(int x , int y , int color)
{
    if(x<800&&x>=0&&y<480&&y>=0)
    {
        *(plcd + y * 800 + x) = color;
    }
}

如何让plcd指向屏幕首地址!

  • mmap
NAME
       mmap, munmap - map or unmap files or devices into memory
            映射 ,把屏幕的首地址,镜像给我们!!
SYNOPSIS
       #include <sys/mman.h>
            头文件
       void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
            void *addr  : NULL 它是由系统分配
            size_t length :映射的文件的大小   480*800*4
            int prot    : 权限 
                    PROT_READ : 可读
                    PROT_WRITE : 可写
                    PROT_EXEC : 可执行
                    PROT_READ | PROT_WRITE | PROT_EXEC 
            int flags : 属性  MAP_SHARED
            int fd  : 文件描述符
            off_t offset : 偏移量 , 0
  • 返回值:

    • 失败返回NULL
    • 成功的话就返回该屏幕映射过来的首地址!
  • 例子:

int *plcd = mmap(NULL , 480*800*4 , PROT_READ | PROT_WRITE | PROT_EXEC , MAP_SHARED , lcd_fd , 0);

int munmap(void *addr, size_t length);
    void *addr : plcd   是我们映射lcd屏幕过来的首地址
    size_t length :480*800*4

BMP图片的解析

把一张BMP格式的图片显示在我们的开发板上

  • 打开图片
int bmp_fd ;
bmp_fd = open("./1.bmp",O_RDWR);
if(bmp_fd == -1)
{
    printf("open bmp error\n");
    return -1;
}
  • 图片的类型:bmp,jpg,png
    • bmp 图片是一种最原始的,也是windows下面最常见一种图片,也是最基础的图片。它是没有经过任何算法处理的,或者说是没有经过任何算法压缩的,所以它bmp图片所占的内存是最大的!!!
    • 没有 压缩 的图片 :意味着它保存每个像素点的值!
BITMAP头:
    0x00        2字节          保存BM

DIB:
    0x12        4字节           表示是位图的宽度
    位图的宽度:每一行有多少个像素点!
    int width;
    lseek(bmp_fd,0x12,SEEK_SET);
    int r = read(bmp_fd,&width,4);
    if(r == -1)
    {
        printf("read error\n");
        return -1;
    }
    printf("width == %d\n", width);
    width > 0  :它的像素点的保存顺序就是从左边到右边
          < 0  :则反之

    0x16        4字节           表示是位图的高度
    位图的高度:每一列有多少个像素点!

    high > 0
         < 0
    0x1C        两个字节        表示是位图的色深
    short depth;
    depth == 24    //3个字节
        保存的东西为 R G B   A:默认为0
    depth == 32    //四个字节
        保存的东西为 A R G B

    像素数组的大小:abs(width) * abs(high) * (depth/8)

    0x36        像素数组:保存每个像素点

触摸板的相关操作

  • 在开发板上任意坐标显示一张任意分辨率的bmp图片

  • 触摸屏的路径名: “/dev/input/event0”

    int touch_fd = open("/dev/input/event0",O_RDONLY);
    if(touch_fd == -1)
    {
        printf("open touch error\n");
        return -1;
    }
  • NOTE:
    触摸板文件跟其他文件不同的是,它的内容吧,不是用数组保存,而是用一个结构体!

  • 在linux系统下面,所以的输入事件(鼠标,键盘,触摸板。。。)都用一个结构体来表示的

    struct input_event
    {
        struct timeval time;   //输入事件的时间

        _u16 type ; //事件的类型,如下:
            type == EV_KEY   表示这是一个按键事件
            type == EV_REL      表示这是一个鼠标事件
            type == EV_ABS      表示的是一个触摸板事件
            type == EV_SYN      事件的分割标志

        
        _u16 code;      //要根据type的不同,它表示的含义也就不一样了
                 type == EV_KEY   表示这是一个按键事件
                    code 表示的是按键事件的键值 code == BTN_TOUCH
                 type == EV_REL      表示这是一个鼠标事件
                    //这个暂时我们不讲!!因为我们用不到!
                type == EV_ABS      表示的是一个触摸板事件
                    code 有几个值
                        code == ABS_X   表示这是X轴的坐标
                        code == ABS_Y   表示这是Y轴的坐标
                        code == ABS_PRESSURE   表示这是给触摸板的压力

        _u16 value;         //要根据type和code的不同,它表示的含义就不一样
                type == EV_KEY   
                    code == BTN_TOUCH
                        value == 1  或者value == 0      表示按键按下/按键弹起
                 type == EV_ABS     
                        code == ABS_X   
                                value == x轴坐标
                        code == ABS_Y  
                                value == y轴坐标
                        code == ABS_PRESSURE         
                                value == 压力值
    };
  • NOTE:
    应用程序,通过不断从输入设备文件,读取该结构体!
int xy_read()
{
    int x_read = -1;
    int y_read = -1;

    struct input_event ev;
    while(1)
    {
        read();
        if(ev.type   && ev.code)
        {

        }

    }
}

练习:获取屏幕坐标

//获取坐标
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <unistd.h>
#include <string.h>
#define TOUCH_PATH "/dev/input/event0"
int touch_fd;
int xy_read()
{
    //1.打开触摸屏  
    touch_fd = open(TOUCH_PATH,O_RDONLY);//只读打开
    if(touch_fd<0)
    {
        perror("open fail");
        return 0;
    }

    int x_read = -1;
    int y_read = -1;

    //定义一个结构体叫ev
    struct input_event ev;

    //一直读取触摸板信息
    while(1)
    {
        //读取屏幕
        read(touch_fd, &ev, sizeof(struct input_event));//第三个参数ev
        
        if(ev.type == EV_KEY && ev.code == BTN_TOUCH)
        {
            if(ev.value == 1)
            {
                printf("down\n");
            }
            else
            {
                printf("up\n");
            }
        }

        if(ev.type == EV_ABS)   //触摸事件 
        {
            if(ev.code == ABS_X)
            {
                x_read = ev.value;   //x轴
            }
            if(ev.code == ABS_Y)		//y轴
            {
                y_read = ev.value;
            }
            printf("(%d,%d)\n", x_read, y_read);
        }    
    }
}

int main()
{
    xy_read();
    close(touch_fd);
}

线程进程

  • 我们的一个main就是一个进程

  • 并发:同时进行两个或者两个以上的执行任务

  • 线程就是我们主函数的一个分支,是比进程更加小的活动的单位,执行分支。

  • 线程和进程都是我们平时所说的并发的一种方式!
    指令它必须在函数的内部,线程的指令也会封装在函数的内部, 那么我们封装线程的指令函数叫做线程函数!!!

  • 线程函数的原型:

       typedef void * (*start_routine_t)(void *)
                这样子的一个指针会指向我们的线程函数!!!
                那么线程函数是该长什么样子呢??
                    参数:void *
                    返回值:void *
  • step1 :定义一个线程函数!!
            void * display_adv(void *)
            {
                while(1)
                {
                    //在你们的2048棋盘的旁边显示一个电子相册,用来播放小广告
                    //显示第一个广告
                    sleep(5);
                    //显示第二个广告
                    sleep(5);
                }
            }
  • step2: 开辟这个分支
    • 在linux中pthread的接口函数!
      它可以创建一个线程:pthread_create
      每一个线程都有自己的ID,用来唯一标识一个线程的,也就是每个线程都有一个ID身份证!!
      id的类型:pthread_t ;
      声明一个id: pthread_t id;
NAME
pthread_create - create a new thread
        创建一个新的线程
SYNOPSIS
    #include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

pthread_t *thread : 指向你保存id号的那个空间!!!
const pthread_attr_t *attr : 表示线程的属性,一般为NULL,采用的是默认的属性
void *(*start_routine) (void *)*start_routine : 指向它对应的线程函数
我们上面开创线程的目的就是为了人这个线程去执行线程函数!!
void * arg :其实它就是将要作为线程函数的实参传入!!!

Compile and link with -pthread.编译时加上-pthread
gcc xxx.c -o xxx -pthread
例子:

int main()
{
    pthread_t id;
    pthread_create(&id,NULL,&display_adv,NULL);
    while(1)
    {
        show();
    }
}

练习:创建广告播放的一个线程

    pthrad_t ad_th_num;   // 定义一个线程号
    pthread_create(&ad_th_num,NULL,&ad,NULL);

    //线程任务函数 --- 广告
    void * ad(void * arg)
    {
        while(1)
        {
            bmp_show("");
            sleep(3);
            bmp_show("");
            sleep(3);
        }
    }

音频播放

  • 命令:madplay
    • 查看开发板是否已经安装了madplay
      which madplay
    • 拷贝到/bin/
    • 给权限

播放的方式!!

madplay的用法:madplay 路径

madplay ./mp3/1.mp3
* system
  
NAME
    system - execute a shell command

SYNOPSIS
    #include <stdlib.h>
    
    int system(const char *command);
        const char *command : 是一个字符串,然后整个字符串就是我们要执行的那个命令!
    char cmd[100];
    sprintf(cmd,"madplay ./mp3/1.mp3");
    sprintf(cmd,"madplay %s" , p);

相关

上一篇:
粤嵌GEC6818-学习笔记1-基础篇https://blog.csdn.net/weixin_45735391/article/details/125350683
下一篇:
粤嵌GEC6818-学习笔记3-相关项目https://blog.csdn.net/weixin_45735391/article/details/125820496

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

粤嵌GEC6818-学习笔记2-屏幕相关及音频播放 的相关文章

  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • dpkg 错误:pycompile:未找到

    sudo apt get remove purge mysql server mysql client mysql common 当我尝试使用上述命令删除 mysql 时 出现以下错误 Reading package lists Done
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • Docker Desktop 未安装,提示 docker-ce-cli 无法安装

    在一次在线培训课程中 讲师提到他有 安装了 Docker Desktop 的 Ubuntu 虚拟机 因此 我尝试在 Windows 10 物理主机上安装相同的程序指示 https docs docker com desktop linux
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • 如何使用 PHP 更改文件的标题属性

    用户使用我的 PHP 应用程序上传 PDF 文件 我将它们存储在 S3 上 稍后 其他用户会查看这些文件 我会在他们的浏览器中 内联 显示这些文件 问题在于 PDF 的 标题 属性显示在通常显示网站标题的浏览器选项卡中 由于它是由原始上传的
  • 在 Ubuntu 上使用 Python 获取显示器分辨率

    对于 Ubuntu win32api 中是否有与 GetSystemMetrics 相当的代码 我需要获取显示器的宽度和高度 以像素为单位 我可以建议一些可以使用的方法 不过我还没有使用过 xlib 版本 1 xlib Python 程序的
  • Ubuntu 下使用 rpmbuild 构建

    我需要在 Ubuntu 10 4 下使用补丁构建 yum 原因是我需要为我的虚拟服务器实例提供支持 chroot 的 yum 由于 ubuntu 的 yum src 不可用 第 3 方存储库 我从官方存储库下载了源代码 并从 linux v
  • mongodb 无法在 ubuntu 18.04 上启动

    我在 Windows 10 上运行 ubuntu 18 04 我在 cli 上运行 mongod mongodb 正常启动 然后我尝试运行 mongo 并收到此错误 MongoDB shell version v4 0 2 connecti
  • 终止 ssh 会话会终止正在运行的进程

    我正在使用 ssh 连接到我的 ubuntu 服务器 我使用命令启动编码程序 然而 似乎当我的 ssh 会话关闭时 因为我在进入睡眠状态的笔记本电脑上启动它 有没有办法避免这种情况 当然 阻止我的笔记本电脑休眠并不是永久的解决方案 运行你的
  • gnutls_handshake() 失败:握手失败 GIT

    一切都工作正常 但突然我收到错误 致命 无法访问 https 电子邮件受保护 cdn cgi l email protection name repo name git gnutls handshake 失败 握手失败 我在我的计算机和 E
  • 什么是海湾合作委员会 4.1.3?

    根据 gcc 发布页面 http www gnu org software gcc releases html http www gnu org software gcc releases html 版本4 1 3不存在 不过 我在很多地方
  • 由于握手问题,PerL SSL 连接尝试失败

    我希望有人可以提供帮助 我正在使用 nagios 插件 check ilo2 health 该插件在我们的 OpenSuSE 系统上运行良好 但新的 Ubuntu 14 04 系统有问题 删除 nagios 的东西并运行 perl 基本上是
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我
  • 让 Java 与 Windows 10 Ubuntu 一起使用

    我安装了 Windows 10 周年更新 以便可以在 Windows 上的 Ubuntu 上尝试 Bash 看如何安装 http www howtogeek com 249966 how to install and use the lin

随机推荐

  • Godot 4 应用 - 图形绘制

    花了两天时间 做了一个初步的图形软件效果 先占个坑 以后再叙
  • python3导入urllib2_两种兼容Python2和Python3的导入库的方法

    Python3和Python2是不兼容的 但是由于一些历史遗留问题 比如一些服务器只安装有Python2 一些安装有Python3 所以我们在实际写代码的时候就不得不考虑兼容Python2和Python3了 下面简单介绍两种兼容Python
  • Android 10.0 PackageManagerService(二)权限扫描-[Android取经之路]

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • Python:小球反弹

    问题描述 已知一球从高空落下时 每次落地后反弹至原高度的四分之一再落下 编写一程序 从键盘输入整数n和m 求该球从n米的高空落下后 第m次落地时共经过的路程以及第m次落地后反弹的高度 并输出结果 输入形式 从键盘输入整数n和m 输出形式 输
  • 毕业设计 基于python的网络爬虫-基于python的网络爬虫

    一 从小说网站抓取一本小说 import urllib2 python库 提供一系列针对url的操作方法 import re re正则表达式 提供了一系列针对正则表达式的方法 BeautifulSoup4库 from bs4 import
  • Android 日志分析01-命令篇

    我回来了 很久没更新博客了 各种原因吧 但现在我决定回归博客 继续写写文章 分享分享技术 用过很多语言 涉及前后端 一时也不知从何讲起 往后慢慢梳理吧 慢慢把自己想分享的东西写下来 也是一种整理和记录吧 今天先分享Android知识 分享一
  • automake创建Makefile

    autoconf automake主要用于创建makefile 本文主要介绍一下automake的简单用法 Ubuntu下安装automake sudo apt get install automake 即可安装automake的相关工具
  • win10安装Mathtype报错处理,找不到MPlugin.dll

    在Mathtype官方中文网下载mathtype后 双击exe文件进行安装 不使用默认安装路径 安装后会弹出如下错误 由于找不到MPlugin dll 无法继续执行代码 重新安装程序可能会解决此问题 查看mathtype的安装目录 可以发现
  • CSDN社区之星专访:我的蜕变之路

    摘要 社区之星第49期采访了爱奇艺研发总监陆其明 他分享了个人生涯 管理和程序员素养等方面的看法 管理上他认为对人要领导 要管的是事 而在程序员素养上 他则引用Jeff Atwood的话称 成为优秀程序员的方法就是抛开编程 原文链接 htt
  • SRNet:Deep Residual Network for Steganalysis of Digital Images

    Abstract 现有的网络架构包括手工设计元素 比如固定域或限制卷积核 关键 有效扩展检测器前端 计算噪声残差 池化会不可避免地压制隐写噪声 在频域中有一个较好的结果 相对空域 更进一步提升是将选择通道作为第二通道 I 介绍 1 隐写术介
  • Ubuntu16.04桌面突然卡住怎么办?

    不知道有没有小伙伴和我一样 正在Ubuntu上工作呢 突然桌面就卡住了 键盘也没了反应 鼠标那个箭头只能移动 但是点击时却没有反应 作为一个Ubuntu小白 在最近的学习过程中遇到了好多问题 我把这些问题需要注意的地方记录下来 希望可以帮助
  • JMC性能监测

    文章目录 一 打开JMC 二 界面说明 三 配置java监测 四 总结 性能监测图形化 通过jdk自带的JMC工具即可轻松实现 JMC的全称为java mission control 意思为java程序任务控制台 一 打开JMC 在你下载好
  • 图解通信原理与案例分析-9:SFP光通信案例--数字信号的2-ASK光调制解调

    文本以SFP光模块的内部实现为案例 介绍数字电信号的光信号调制解调的基本原理 即如何把二进制的数字电信号调制到光信号上进行传输 反之 如何从光信号中解调出二进制的数字电信号 这部分的调制解调 完全是有SFP硬件实现的 不需要软件的编码 1
  • 关于Qt关闭程序但保持程序后台运行的坑(非常棘手)

    1 先说说我的后台程序的应用场景 关闭当前程序 隐藏 调用另一个ui ui的类型是悬浮窗 Qt Tool 并且在系统通知栏可以见到图标 后台程序逻辑都正常执行 2 实现后台运行的两种主要方式 1 重写closeEvent 并设置event
  • javaswing 设置背景图片

    背景图片的路径用自己的 改一下 package com gao import java awt import java awt event ActionEvent import java awt event ActionListener i
  • 树莓派不能上网解决方案

    判断自己的树莓派能不能上网 用这条命令试试 ping www baidu com ping www baidu com Temporary failure in name resolution 出现了以上错误 说明树莓派不能上网 解决思路
  • css3实现hover颜色,背景色,宽度等平滑变动(transition)

  • webpack 和html-webpack-plugin版本对应问题

    为了实现功能 配置生成预览页面 以前是 要实现的效果是 直接打开设置的首页 这里由于版本对应问题 一直报错 当前版本 devDependencies html webpack plugin 2 30 1 webpack 3 6 0 webp
  • idea使用lombok插件不能生效的原因

    要成功的使用lombok插件 需要3个步骤 一 需要先在idea中下载Lombok plugin 点击File gt settings gt plugins gt 然后点击以下图中所示 接着 在输入框输入lombok进行搜索 之后点击安装便
  • 粤嵌GEC6818-学习笔记2-屏幕相关及音频播放

    这里写目录标题 LCD屏幕 简介 操作 打开屏幕 映射 如何让plcd指向屏幕首地址 BMP图片的解析 把一张BMP格式的图片显示在我们的开发板上 触摸板的相关操作 练习 获取屏幕坐标 线程进程 练习 创建广告播放的一个线程 音频播放 播放