I.MX6U嵌入式Linux应用编程学习

〇、备忘

0.0 本文大写字母缩写说明

  • B: Board 开发板串口终端
  • T: Terminal Ubuntu命令行
  • F: Function 函数
  • P: Path 文件路径

0.1 C编译

  • 使能环境变量 T: source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
  • 查看环境变量 T: arm-poky-linux-gnueabi-gcc -v
  • 编译 T: $CC -o v4l2_camera v4l2_camera.c

0.2 NFS与文件夹挂载

  • 挂载 B: mount -t nfs -o nolock,nfsvers=3 192.168.1.110:/home/chorgy/WorkSpace/i.MX6/NFS nfs/
  • 查看 B: df
  • 卸载 B: umount nfs

一、应用编程概念

1.1 系统调用

1.2 库函数

  • 存放在P: /lib目录

1.3 标准C语言函数库

  • Linux使用glibc(GNU C语言函数库)

1.4 传参main函数

  • F: int main(int argc, char **argv)

二、文件I/O基础

2.1 文件描述符

  • 某某函数的返回值

  • 一个进程可打开多个文件,T: ulimit -n指令查看一个进程可打开的最大文件数

  • 打开的文件分配文件描述符是从最小的未被占用的文件描述符(1~1023)开始,关闭时释放

  • F: open()

  • F: write()

  • F: read()

  • F: close()

  • F: lseek():返回从文件头部开始算起的位置偏移量(字节为单位),也就是当前的读写位置

2.2 静态文件

  • 未打开时存储在磁盘
  • 磁盘最小存储单位扇区sector,0.5KB
  • 系统一次性读取一个块block,多个扇区,是文件存取的最小单位,常见为4KB
  • 磁盘分区时分为两个区域
    • 数据区
    • inode区,存放inode table,每个inode对应一个文件
      • T: ls -i查看文件inode号
      • T: stat xxx.c查看某文件属性
      • Windows 快速格式化 就是删除inode表

2.3 动态文件

  • 进程控制块PCB,Process Control Block,每个进程设置一个专门的数据结构进行管理,记录状态
    • PCB有一个指针指向文件描述符表
    • 文件描述符表每一个元素索引到对应的文件表
    • 文件表记录文件的状态,包括i-node指针,指向inode

2.4 返回错误处理

  • F: strerror(),返回对应错误编号的字符串描述信息
  • F: perror(),不需要传入 errno变量

2.5 退出函数

  • 清除其使用的内存空间,销毁其在内核中的各种数据结构,关闭进程的所有文件描述符,并结束进程、将控制权交给操作系统
  • F: exit()
  • F: _exit(),系统调用的
  • F: _Exit(),与_exit()等价

2.6 空洞文件

  • 使用移位函数从中间地址开始写数据,造成空洞空间
  • 有利于多线程共同操作文件

三、标准I/O库

四、文件属性与目录

4.1 Linux系统文件类型

  • 普通文件
    • 文本文件
    • 二进制文件
  • 目录文件
  • 字符设备文件块设备文件
    • 不对应磁盘文件
    • 由文件系统虚拟出来的
    • 由内存维护
    • 路径P: /dev/
  • 符号链接文件
    • 超链接
  • 管道文件
    • 用于进程间通信
  • 套接字文件
    • 网络通信

五、字符串处理

六、系统信息与系统资源

七、信号

基本概念

  • 软件中断
  • 用来通信
  • 发送给对应的进程处理

八、进程

8.1 概念

  • 进程: 应用程序被加载到内存中运行
  • 进程号: process ID,PID,T: ps查看进程号
  • 环境变量:
    • T: env 查看所有环境变量
    • T: export xxx=xxxx 新增环境变量
    • T: export -n xxx 删除环境变量
  • 应用程序获取当前进程的环境变量 C: extern char **environ
  • 虚拟地址:
    • 实际的物理内存有限
    • 通过硬件 MMU(内存管理单元)映射到实际的物理地址空间中
    • 进程与进程、进程与内核相互隔离
    • 多进程能够共享内存

8.2 子进程

  • F: fork(void); 创建子进程
  • 父子进程文件共享
    • 子进程获得父进程所有文件描述符的副本
  • T: ps -aux 查看所有进程
    • 开发板自带程序为进程613 /opt/QDestop
  • 进程终止
    • return
    • exit()
    • _exit()
    • _Exit()
  • 监视子进程
    • F: wait()

    • F: waitpid()

    • 僵尸进程:子进程先结束

    • 孤儿进程:父进程先结束

8.3 进程状态与进程关系

  • 进程状态

    • 就绪态
    • 运行态
    • 僵尸态
    • 可中断睡眠状态
    • 不可中断睡眠状态
    • 暂停态
  • 进程关系

    • 无关系
    • 父子进程关系
    • 进程组:多进程集合

8.4 守护进程

8.5 进程间通信

九、线程

9.1 概念

  • 线程:

    • 系统调度的最小单位
    • 进程中有主线程
    • 进程不能运行,运行的是进程中的线程
    • 进程是容器,包含线程需要的数据结构、环境变量等信息
    • 同一进程的多个线程共享系统的全部资源,虚拟地址空间、文件描述符、信号处理等
  • 并发和并行:

    • 并发强调时分复用,可打断当前任务切换到下一任务

    你吃饭吃到一半,电话来了,你一直到吃完了以后才去接电话,这就说明你不支持并发也不支持并行,仅仅只是串行

    你吃饭吃到一半,电话来了,你停下吃饭去接了电话,电话接完后继续吃饭,这说明你支持并发

    你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行

线程同步

十、高级I/O

十一、网络基本知识

11.1 网络通信三个层次

  • 硬件层
    • 网卡设备
    • 手法网络数据
  • 驱动层
    • Linux内核网卡驱动
  • 应用层
    • 内核提供的接口
    • socket接口
    • http接口

11.2 OSI七层模型

  • Open System Interconnection
  • 物理层
  • 数据链路层
    • 物理寻址
    • 建立和管理节点间逻辑连接
    • 差错检测
    • 接收来自物理层的位流形式的数据,并封装成帧,传送到上一层
  • 网络层(IP层)
    • 逻辑地址寻址
    • 不同网络间路径选择
    • IP协议(IPv4,IPv6),ICMP,IGMP
  • 传输层
    • 定义传输数据的端口号
    • 端到端的流控和差错校验
    • TCP、UDP协议
    • 端口号的端
  • 会话层
    • 建立、管理、终止表示层实体之间的会话
  • 表示层
    • 提供应用层数据编码和转换功能
  • 应用层
    • 为用户提供应用接口、网络服务
    • 常见网络服务协议:
      • HTTP
      • FTP
      • TFTP
      • SMTP
      • SNMP
      • DNS
      • TELNET
      • HTTPS
      • POP3
      • DHCP

11.3 TCP/IP五层/四层模型

11.4 IP地址

  • IP地址是软件地址

  • 硬件MAC地址是存储在网卡中的

    • 用于局域网寻找目标主机
  • IPv4地址

    • 4*8 - 32位地址长度
    • 网络地址
    • 主机地址
    • 子网掩码
      • 确定网络地址、主机地址各占多少位
    • 网络标识 = IP地址 & 子网掩码
      • 标识相同,就处于同一网络
  • IPv6地址(暂时不讨论)

    • 8*16 - 128位地址长度

11.5 TCP/IP协议

  • TCP/IP是一个协议族,包含

    • 应用层协议HTTP、FTP、MQTT
    • 传输层协议TCP、UDP
  • HTTP超文本传输协议

    • Hyper Text Transfer Protocol
    • 浏览器作为HTTP客户端
    • 通过URL向HTTP服务器(WEB服务器)发送请求
  • FTP文件传输协议

    • File Transfer Protocol
  • TCP协议

    • Transmission Control Protocol,传输控制协议
    • 面向连接的、可靠的、基于IP的传输协议
    • 工作在传输层
      • 对上服务socket接口
      • 对下调用IP层
    • 建立连接
      • 三次握手
      • 四次挥手
  • UDP协议

    • User Datagram Protocol
    • 用户数据报协议

11.6 端口号

  • 网络进程不止一个
  • 如何确定是哪个进程对应的接收数据 - 端口号

应用一、LED

1.1 应用层操控硬件的两种方式

  • 通过文件I/O

  • 设备节点方式:

    • P: /dev 设备节点
    • 字符设备文件:串口设备、音频设备
    • 块设备文件:存储设备
    • 设备文件就是硬件向应用层提供的接口
  • sysfs文件系统

    • 挂载在P: /sys 目录下
    • 与devfs、proc一样,为虚拟文件系统
    • 将内核信息以文件的方式提供给应用层

文件夹 说明
./devices 存放系统设备
./block 存放块设备,与./device功能重合,已过时
./bus 设备按照总线类型分类
./class 设备按照功能分类
./dev 设备按照设备号放置
./firmware 内核固件
./fs 描述系统所有的文件系统
./kernel 内核可调参数
./module 系统所有模块信息
./power 电源选项

应用二、视频监控

2.1 流媒体传输协议

  • RTSP,Real-Time Stream Protocol
    • 实时性好
    • 视频聊天、视频监控
  • RTMP,Real-Time Message Protocol
    • 低延迟
    • 高稳定
    • 支持所有摄像头格式
    • 浏览器加载flash即可播放

2.2 RTMP简介

  • 推流端

    • FFmpeg
  • 流媒体服务器

    • Nginx
  • 拉流端

    • VLC播放器
  • Nginx移植

应用三、4G模块-EC20

3.1 4路ttyUSB

3.2 ppp拨号上网

需要固化最新系统