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

嵌入式开发学习(第三阶段 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.lryc.cn/news/596569.html

相关文章:

  • Model Control Protocol 使用MCP进行各种任务适配,调用工具和资源进行客户端开发
  • 基于AD7147电容触摸芯片与STC12C5A60S2单片机方案
  • SQL基础④ | 多表查询篇
  • AG32 mcu+cpld 联合编程(概念及流程)
  • OpenMVG OpenMVS 安装全流程常见问题与解决方法总结
  • 学习软件测试的第十九天
  • imx6ull-系统移植篇18——linux顶层 Makefile(下)
  • API是什么,如何保障API安全?
  • Springboot和postman的使用
  • XSS内容分享
  • 智能泵房监控系统:物联网应用与智能管理解决方案
  • Qt中QObject类的核心作用与使用
  • Qt 事件处理机制深入剖析
  • List<UserInfo> list = new ArrayList<>();为什么要这样创建数组?
  • 如何用keepAlive实现标签页缓存
  • 从 COLMAP 到 3D Gaussian Splatting
  • 滑动窗口经典问题整理
  • langchain4j之RAG 检索增强生成
  • Linux操作系统之线程(六):线程互斥
  • TCP day39
  • 质量即服务:从测试策略到平台运营的全链路作战手册
  • 重生学AI第十九集:VGG16的使用以及模型的保存与加载
  • 【期末考试复习】计算机组成原理 - 直接补码阵列乘法器
  • 【接口自动化】pytest的基本使用
  • CSS+JavaScript 禁用浏览器复制功能的几种方法
  • web登录页面
  • 黑马点评练习题-给店铺类型查询业务添加缓存(String和List实现)
  • kafka4.0集群部署
  • 数据结构01:链表
  • docker compose 安装使用笔记