第一天:复习实训学的内容(linux命令,交叉开发,文件IO,音频播放,触摸屏的输入事件,BMP图片)

第一天:复习实训学的内容(linux命令,交叉开发,文件IO,音频播放,触摸屏的输入事件,BMP图片)

linux命令

ls 列举

查看当前路径下的文件信息,如果要查看详细信息,可以使用ls -l

cd 切换路径

切换工作路径到指定的目录

cd /mnt/hgfs/share

cp 复制文件

cp 1.mp3 ../mp3/2.mp3

mv 移动文件

mv 1.mp3 ../mp3/2.mp3

rm 删除文件

rm 1.mp3

touch 新建文件

touch main.c

mkdir 创建目录

mkdir work

编译命令

gcc(g++) 要编译的源文件 -o 要执行的文件名 -I头文件搜索路径 -L库文件搜索路径 -l库名

交叉编译

arm-linux-gcc(g++) 要编译的源文件 -o 要执行的文件名 -I头文件搜索路径 -L库文件搜索路径 -l库名

交叉开发

1.编写源代码nyzs412614

2.交叉编译

3.将程序通过串口传输到开发板

rx 文件名

执行命令之后,在pc选择对应的文件 开始传输

4.修改文件权限

chmod 修改文件权限

chmod 权限码 文件名

权限码可以是3位八进制数

比如 0777 0664

也可以是单独的权限 +x

chmod 0777 hello
chmod +x hello

5.执行程序

./hello

.文件IO

在这里插入图片描述

open 打开或者创建一个文件

NAME
       open, openat, creat - open and possibly create a file

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);
			@pathname:字符串,带路径的文件名,指定要打开的文件
			@flags:标志位,表示文件的打开方式,位或多个
			但是,下面三个只能选择一个
			O_RDONLY, O_WRONLY,  O_RDWR
			只读打开 ,只写打开,读写打开
			然后可以再选择性的位或0个或者多个宏
			O_CREAT 创建标志,如果指定的文件不存在,先创建再打开
			O_TRUNC	截断标志,打开文件并清空文件内容
			@mode:当创建文件时,需要指定mode文件的权限,可以使用38进制表示
			比如: 0777 0664 
			返回值:
			成功返回 非负数,在程序中象征一个被打开的文件,称为文件描述符,后续所有对该文件的操作,都是通				过文件描述符进行
			失败返回-1,并且errno被设置,可以借助perror打印出错的信息

关闭 close

NAME
       close - close a file descriptor

SYNOPSIS
       #include <unistd.h>

       int close(int fd);
		@fd:文件描述符,指定要关闭的文件
		返回值:成功是0
		失败 -1,errno被设置

read 读取文件内容

NAME
       read - read from a file descriptor

SYNOPSIS
       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);
		@fd:文件描述符,指定从哪个文件中读取数据
        @buf:指向一个缓冲区,用来保存从文件中读取到的内容
        @count:整数,单位字节,表示实际从文件中读取到的字节数
        返回值:
            成功返回>=0的整数,表示实际从文件中读取到的字节数
            失败返回-1,并且errno被设置

write 写入数据到文件中

NAME
       write - write to a file descriptor

SYNOPSIS
       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t count);
		@fd:文件描述符,指定数据要写入那个文件中
        @buf:指针,指向的空间中的数据就是要写入到文件中去的数据
        @count:整数,表示想要写入到文件中的数据大小
        返回值:
            成功返回 >=0的整数,表示实际写入文件中的字节数
            失败返回-1,并且errno被设置

eg:从打开的./1.txt文件中读取数据,将数据排序后写入./2.txt中

LCD屏幕

lcd屏幕文件处在"/dev/fb0"

映射 将打开的文件内容,映射到进程的存储空间中

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);
       @aadr:指定用来映射的内存地址空间,一般为NULL,表示让系统自行选择
       @length:指定用于映射的空间大小,取决于要映射的文件内容的大小,单位字节
       @prot:指定映射内存地址的访问权限,要求与被映射的文件open时的权限一致
           		PROT_EXEC  执行权限
                PROT_READ  读权限
                PROT_WRITE 写权限
			宏可以位或使用
        @flags:标志位,指定映射方式
            MAP_SHARED 共享映射
        @fd:文件描述符。指定要映射的文件
        @offset:文件偏移量,指定从文件的那个位置开始映射
            0 从文件头开始映射
        返回值 成功返回映射内存首地址
            失败 返回 MAP_FAILED (that is,(void *) -1)
            
       int munmap(void *addr, size_t length);
			@addr:指向要解除映射的映射内存空间首地址,即mmap的返回值
            @length:指定要解除映射的空间大小,单位字节
            返回值
                成功0
                失败-1

BMP图片

在这里插入图片描述

lseek 用来控制文件中文件偏移量(光标)的位置

NAME
       lseek - reposition read/write file offset

SYNOPSIS
       #include <sys/types.h>
       #include <unistd.h>

       off_t lseek(int fd, off_t offset, int whence);
		@fd:文件描述符,指定要操作的文件
		@offset:指定偏移量,即将光标移动多少个字节
			0 表示不动
			正数,将光标向后移动
			负数,将光标向前移动
		@whence:整数,表示将光标从那个地方开始移动
			SEEK_SET:从文件头开始移动
			SEEK_END:从文件末尾开始移动
			SEEK_CUR:从光标当前位置开始移动
			返回值 成功返回光标距离文件头的位置 单位字节
			失败返回-1,并且errno被设置

eg:解析BMP图片中的位图数据宽度

lseek(bmpfd,0x12,SEEK_SET);
read(bmpfd,ch,4);
wight=ch[0]&0xff |(ch[1]&0xff)<<8 |(ch[2]&0xff)<<16 |(ch[3]&0xff)<<24

触摸屏的输入事件

输入设备和输入事件

Linux系统将所有的输入设备统统交给input core输入子系统去管理和维护

即扎起 Linux系统中的任意一个输入设备,都会被系统转换为输入事件

输入事件是输入子系统捕捉到 输入设备状态发生变化后,向Linux上报的一种输入结果

在上层应用开发中,输入事件由结构体struct input_event来描述,在"/usr/include/linux/input.h"中定义

结构体原型如下:

用户每触发一次输入事件,在应用程序中就能获得一个结构体的数据

struct input_event {
	struct timeval time;//记录输入事件触发的时间
	__u16 type;//输入事件类型
	__u16 code;//输入类型事件编码
	__s32 value;输入事件的值
};

type:输入事件的类型

在应用层所有的输入设备的事件,都交给struct input_event来描述,为了区分不同的输入设备,该结构体提供了type这个成员变量,用来区分不同的输入设备,type不同,代表输入设备也不同

具体那种设备对应那个值,参考头文件"input-event-codes.h"

在这里插入图片描述

EV_SYN 同步事件,在输入设备的一次输入动作的所有事件全部上报完成后,会主动生成一次同步事件,用来告诉Linux本次动作结束

EV_KEY :按键事件

EV_ABS:绝对坐标事件

每种事件都有自己不同的事件编码,因为同一个输入事件可能产生不同的输入信息

就像手指滑动,X轴坐标和Y轴坐标都会发生变化

每个事件在头文件中都提供了不同的事件编码

在这里插入图片描述

EV_KEY事件中的BTN_TOUCH是触摸按键(把屏幕当按键)的事件编码

EV_ABS下的

在这里插入图片描述

ABS_X 触摸点的X轴事件编码

ABS_Y 触摸点的Y轴事件编码

音频播放

这里放一个麻烦下载歌曲MP3的网站:

https://tool.liumingye.cn/music/?page=searchPage#/artist/k7jl

常见的音乐格式

mp3,wav

开发板中有一个内置的程序 madplay

可以直接播放音频

which madplay

音频播放操作:

madplay 音乐路径文件名

eg:

madplay ./1.mp3

madplay -Q ./1.mp3

madplay -Q ./1.mp3 &

代码怎么写?

通过一个函数辅助播放

system

NAME
       system - execute a shell command

SYNOPSIS
       #include <stdlib.h>

       int system(const char *command);
DESCRIPTION
       The  system()  library  function  uses fork(2) to create a child process that executes the shell
       command specified in command using execl(3) as follows:

           execl("/bin/sh", "sh", "-c", command, (char *) 0);

       system() returns after the command has been completed.

       During execution of the command, SIGCHLD will  be  blocked,  and  SIGINT  and  SIGQUIT  will  be
       ignored,  in  the  process that calls system() (these signals will be handled according to their
       defaults inside the child process that executes command).

       If command is NULL, then system() returns a status indicating whether a shell  is  available  on
       the system.


播放:

前台播放,一定要等到歌曲播放完毕后才执行后面的代码

system("madplay -Q ./1.mp3");

后台播放,不会干扰到后面的代码的执行

system("madplay -Q ./1.mp3 &");

暂停:

killall -STOP madplay
system("killall -STOP madplay");

继续:

killall -CONT madplay
system("killall -STOP madplay");

退出:

killall -KILL madplay
system("killall -KILL madplay");

播放音频之前记得 先退出再播放

system("killall -KILL madplay");
system("madplay -Q ./1.mp3 &");

台播放,不会干扰到后面的代码的执行

system("madplay -Q ./1.mp3 &");

暂停:

killall -STOP madplay
system("killall -STOP madplay");

继续:

killall -CONT madplay
system("killall -STOP madplay");

退出:

killall -KILL madplay
system("killall -KILL madplay");

播放音频之前记得 先退出再播放

system("killall -KILL madplay");
system("madplay -Q ./1.mp3 &");
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎明的前夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值