嵌入式开发学习(第三阶段 Linux系统开发)

发布于:2025-07-23 ⋅ 阅读:(19) ⋅ 点赞:(0)

第二天:linux系统开发

环境搭建

  1. 安装VScode

    VSCode:严格意义上将,VSCode 它并不算通过完整的IDE,但是VSCode 支持插件安装,且VSCode本身提供了丰富的插件,使得开发者可以快速构建一个轻量级集成开发环境。

  2. 开发环境搭建

    1. 安装VSCode

      VScodeUserSteuup

    2. 安装编译工具链

    3. 安装VSCode插件

硬件设备访问

在这里插入图片描述

设备访问机制:应用程序不能直接访问硬件设备,只能借助系统调用接口来间接冯文硬件

因为linux系统一切皆文件,所以硬件设备访问往往也被转换为文件操作。

设备访问时,首先需要系统中硬件设备对应的设备文件再借助系统的IO函数达到访问的目的。

回顾:

  • 文件操作步骤:

    1. 打开文件
    2. 文件读写操作
    3. 关闭文件
  • 相关概念

    1. 在linux中如何标识一个文件?

      文件描述符(fd):本质是一个非负整数。

      什么是文件?
      简单的说,文件就是存储在硬件磁盘上的数据集合。

      文件通过什么来表示?
      系统中在处理的文件(读、写操作)的时候,需要唯一能够识别这个文件,就需要一个针对文件的标识,以便在其它地方能识别出这个文件,于是就产生了文件描述符。
      文件描述符:
      文件描述符是一些整数,简单的说就是一个文件ID,用于在系统中唯一的标识一个文件。文件描述符的总数也就是系统可以打开文件的最多个数,这取决于系统的配置情况。可打开的文件描述符总数可利用cat /proc/sys/fs/file-max 来查看。

      #define STDIN_FILENO 0 // 标准输入设备文件描述符

      #define STDOUT_FILENO 1 // 标准输出设备文件描述符

      #define STDERR_FILENO 2 // 标准错误设备文件描述符

  • 常用的系统IO函数

    1. access

      函数头文件: #include <fcnt1.h>

      #include <unistd.h> freecontrol

      函数原型: int access(const char *pathname,int mode)

      函数功能: 确认文件的操作权限、文件是否存在

      函数参数: pathname:待操作文件/目录的路径

      ​ mode:待确认的模式,取值如下:

      ​ F_OK:判断文件是否存在

      ​ R_OK:判断文件是否有读权限

      ​ W_OK:判断文件是否有写权限

      ​ X_OK:判断文件是否有执行权限

      函数返回值:0 :成功返回0

      ​ -1:失败返回-1

      ​ 错误码放在errno

    2. open

      函数头文件: #include <fcnt1.h> #include <unistd.h> freecontrol

      函数原型: int open(const char *pathname,int mode)

      int open(const char *pathname,int flag,int mode)

      函数功能: 打开或创建文件,获取文件描述符

      函数参数: pathname:待操作文件的路径

      flags:打开方式,取值如下:

      ​ 必选项:

      O_RDONLY:只读

      O_WRONLY:只写

      O_RDWR:读写

      ​ 附加项(常用):

      ​ O_APPEND

      ​ O_CREAT

      ​ O_TRUNC

      ​ mode:如果创建文件

      以新建方式打开文件,这个参数用于设置文件的访问权限,

      函数返回值:0 :成功返回0

      ​ -1:失败返回-1

      ​ 错误码放在errno

      ​ X_OK:判断文件是否有执行权限

    3. read

      函数头文件: #include <fcnt1.h> #include <unistd.h> freecontrol

      函数原型: ssize_t read(int fd, void *buf, size_t count);

      函数功能:从文件中读取文件内容

      函数参数:

      ​ fd:要操作的文件描述符;

      ​ buf:数据缓冲区,用来临时存放读取到的数据:

      ​ count:设置要读取的字节数

      返回值:

      ​ 成功:返回实际读取到的字节数

      ​ 0 :到达文件尾部,或没有可读的数据

      ​ 出错:返回 -1,并将错误码存入 errno 中

    4. write

      函数头文件: #include <fcnt1.h> #include <unistd.h> freecontrol

      函数原型: ssize_t write(int fd,const void *buf, size_t size);

      函数功能:向文件中写入数据

      函数参数:

      ​ fd:要操作的文件描述符;

      ​ buf:来存储要写入的文件数据

      ​ count:文件数据的长度

      返回值:

      ​ 成功:返回实际读取到的字节数

      ​ 0 :到达文件尾部,或没有可读的数据

      ​ 出错:返回 -1,并将错误码存入 errno 中

    5. close

      函数头文件: #include <fcnt1.h> #include <unistd.h> freecontrol

      函数原型: int close(int fd);

      函数功能:关闭文件,释放文件描述符

      返回值:

      ​ 成功,返回0,

      ​ 失败返回-1,并将错误码放入 errno

    6. lseek

      函数头文件: #include <fcnt1.h> #include <unistd.h> freecontrol

      函数原型: off_t lseek(int fd, off_t offset, int whence)

      函数功能:移动文件指针

      函数参数:

      ​ fd:要操作的文件描述符;

      ​ offset:相对于whence 的偏移量;

      ​ whence :移动方式,可取以下值

      ​ SEEK_SET: 文件头部

      ​ SEEK_CUR: 当前位置

      ​ SEEK_END: 文件末尾

      函数返回值:

    7. mmap/munmap

      函数头文件:include <sys/mman.h>

      函数原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

      int munmap(void *addr, size_t length);

      函数功能:映射/解除映射 文件存储空间到进程的虚拟地址空间

      函数参数:

      ​ addr :待映射的内存首地址,NULL 表示让系统决定;

      ​ length:映射的内存长度

      ​ prot:映射属性,代表了对映射后的内存操作方式(要和文件/设备的打开方式对应)

      ​ PROT_NONE

      ​ PROT_READ

      ​ PROT_WRITE

      ​ PROT_EXEC

      ​ flags: 映射的地址空间的访问标记

      ​ MAP_SHARED

      ​ MAP_PRIVATE

      ​ fd: 待映射的文件/设备的描述符

      ​ offset: 待映射的文件/设备的内容的偏移量(需要是内存页面(4096)的整数倍)

      注:prot,flags参数相见手册

      函数返回值:成功mmap
      返回映射后的首地址
      munmap返回e
      失败mmap返回MAP_FAILED
      munmap返回-1
      错误码存在errno

    8. iocotl

      函数头文件:#include <sys/ioctl.h>

      函数原型: int ioctl(int fd, unsigned long request, ...);

      函数功能: 操作设备参数

      函数参数: fd:待操作设备的文件描述符

      ​ request :设备参数(主要依赖相关设备)

      ​ …:

      函数返回值:成功返回0

      ​ 失败返回-1,错误代码放在errno


网站公告

今日签到

点亮在社区的每一天
去签到