第一天:复习实训学的内容(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文件的权限,可以使用3位8进制表示
比如: 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 &");