当前位置: 首页 > ai >正文

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

第二天: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

http://www.xdnf.cn/news/15988.html

相关文章:

  • 2025年6月GESP(C++五级):最大公因数
  • 【多任务YOLO】A-YOLOM
  • 面试题:sql题一
  • Spring Boot环境搭建与核心原理深度解析
  • 嵌入式开发学习———Linux环境下数据结构学习(一)
  • GitHub 上的开源项目 ticktick(滴答清单)
  • Kotlin伴生对象
  • Kotlin 作用域函数 let 的实现原理
  • 什么是检索增强生成(RAG)?
  • 深入浅出控制反转与依赖注入:从理论到实践
  • 社交电商推客系统全栈开发指南:SpringCloud+分润算法+Flutter跨端
  • 深度学习篇---车道线循迹
  • CMake实践:CMake3.30版本之前和之后链接boost的方式差异
  • Pulsar存储计算分离架构设计之Broker无状态
  • linux: tar解压之后属主和属组不是当前用户问题
  • [c++11]constexpr
  • MCP消息协议和传输协议(Java角度)
  • 【数学建模|Matlab】Matlab「基础知识」和「基础操作」
  • es搜索实现既能模糊查询又能分词查询
  • Linux部署.net Core 环境
  • 8.4 Java 原生 TCP Socket 实现 HTTP 请求解析和请求分发
  • Dify接入MCP案例1:基于Chatflow旅行、吃饭、新闻、学习的AI智能体
  • 公司内部网址怎么在外网打开?如何让外网访问内网的网站呢?
  • 2025 年非关系型数据库全面指南:类型、优势
  • cddlib(用于凸多面体计算和线性不等式系统求解)的开源库
  • JAVA API (三):从基础爬虫构建到带条件数据提取 —— 详解 URL、正则与爬取策略
  • Java 大视界 -- Java 大数据在智能交通自动驾驶车辆与周边环境信息融合与决策中的应用(357)
  • JMeter 实现 Protobuf 加密解密
  • UE5 UI 水平框
  • ansible 批量 scp 和 load 镜像