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

Linux系统GPIO应用编程

目录

  • 应用层如何操控GPIO
  • GPIO 应用编程之输出
  • GPIO 应用编程之输入
  • GPIO 应用编程之中断
  • 在开发板上测试
    • GPIO 输出测试
    • GPIO 输入测试
    • GPIO 中断测试

本章介绍应用层如何控制GPIO,譬如控制GPIO 输出高电平、或输出低电平。

应用层如何操控GPIO

与LED 设备一样,GPIO 同样也是通过sysfs 方式进行操控,进入到/sys/class/gpio 目录下,如下所示:

在这里插入图片描述

可以看到该目录下包含两个文件export、unexport 以及5 个gpiochipX(X 等于0、32、64、96、128)命名的文件夹。

⚫ gpiochipX:当前SoC 所包含的GPIO 控制器,我们知道I.MX6UL/I.MX6ULL 一共包含了5 个GPIO控制器,分别为GPIO1、GPIO2、GPIO3、GPIO4、GPIO5,在这里分别对应gpiochip0、gpiochip32、gpiochip64、gpiochip96、gpiochip128 这5 个文件夹,每一个gpiochipX 文件夹用来管理一组GPIO。随便进入到其中某个目录下,可以看到这些目录下包含了如下文件:

在这里插入图片描述

在这个目录我们主要关注的是base、label、ngpio 这三个属性文件,这三个属性文件均是只读、不可写。
base:与gpiochipX 中的X 相同,表示该控制器所管理的这组GPIO 引脚中最小的编号。每一个GPIO引脚都会有一个对应的编号,Linux 下通过这个编号来操控对应的GPIO 引脚。

在这里插入图片描述

label:该组GPIO 对应的标签,也就是名字。

在这里插入图片描述

ngpio:该控制器所管理的GPIO 引脚的数量(所以引脚编号范围是:base ~ base+ngpio-1)。

在这里插入图片描述

对于给定的一个GPIO 引脚,如何计算它在sysfs 中对应的编号呢?其实非常简单,譬如给定一个GPIO引脚为GPIO4_IO16,那它对应的编号是多少呢?首先我们要确定GPIO4 对应于gpiochip96,该组GPIO 引脚的最小编号是96(对应于GPIO4_IO0),所以GPIO4_IO16 对应的编号自然是96 + 16 = 112;同理
GPIO3_IO20 对应的编号是64 + 20 = 84。

⚫ export:用于将指定编号的GPIO 引脚导出。在使用GPIO 引脚之前,需要将其导出,导出成功之后才能使用它。注意export 文件是只写文件,不能读取,将一个指定的编号写入到export 文件中即可将对应的GPIO 引脚导出,譬如:

echo 0 > export # 导出编号为0 的GPIO 引脚(对于I.MX6UL/I.MX6ULL 来说,也就是
GPIO1_IO0)

在这里插入图片描述

导出成功之后会发现在/sys/class/gpio 目录下生成了一个名为gpio0 的文件夹(gpioX,X 表示对应的编号),如图16.1.7 所示。这个文件夹就是导出来的GPIO 引脚对应的文件夹,用于管理、控制该GPIO 引脚,稍后再给大家介绍。

在这里插入图片描述
⚫ unexport:将导出的GPIO 引脚删除。当使用完GPIO 引脚之后,我们需要将导出的引脚删除,同样该文件也是只写文件、不可读,譬如:

echo 0 > unexport # 删除导出的编号为0 的GPIO 引脚

删除成功之后,之前生成的gpio0 文件夹就会消失!

以上就给大家介绍了/sys/class/gpio 目录下的所有文件和文件夹,控制GPIO 引脚主要是通过export 导出之后所生成的gpioX(X 表示对应的编号)文件夹,在该文件夹目录下存在一些属性文件可用于控制GPIO引脚的输入、输出以及输出的电平状态等。

Tips:需要注意的是,并不是所有GPIO 引脚都可以成功导出,如果对应的GPIO 已经在内核中被使用了,那便无法成功导出,打印如下信息:
在这里插入图片描述

那也就是意味着该引脚已经被内核使用了,譬如某个驱动使用了该引脚,那么将无法导出成功!

gpioX
将指定的编号写入到export 文件中,可以导出指定编号的GPIO 引脚,导出成功之后会在/sys/class/gpio目录下生成对应的gpioX(X 表示GPIO 的编号)文件夹,以前面所生成的gpio0 为例,进入到gpio0 目录,该目录下的文件如下所示:
在这里插入图片描述
我们主要关心的文件是active_low、direction、edge 以及value 这四个属性文件,接下来分别介绍这四个属性文件的作用:

⚫ direction:配置GPIO 引脚为输入或输出模式。该文件可读、可写,读表示查看GPIO 当前是输入还是输出模式,写表示将GPIO 配置为输入或输出模式;读取或写入操作可取的值为"out"(输出模式)和"in"(输入模式),如下所示:
在这里插入图片描述
⚫ value:在GPIO 配置为输出模式下,向value 文件写入"0"控制GPIO 引脚输出低电平,写入"1"则控制GPIO 引脚输出高电平。在输入模式下,读取value 文件获取GPIO 引脚当前的输入电平状态。譬如:

# 获取GPIO 引脚的输入电平状态
echo "in" > direction
cat value# 控制GPIO 引脚输出高电平
echo "out" > direction
echo "1" > value

⚫ active_low:这个属性文件用于控制极性,可读可写,默认情况下为0,譬如:

# active_low 等于0
echo "0" > active_low
echo "out" > direction
echo "1" > value 	#输出高
echo "0" > value 	#输出低# active_low 等于1
$ echo "1" > active_low
$ echo "out" > direction
$ echo "1" > value 	#输出低
$ echo "0" > value 	#输出高

由此看出,active_low 的作用已经非常明显了,对于输入模式来说也同样适用。
⚫ edge:控制中断的触发模式,该文件可读可写。在配置GPIO 引脚的中断触发模式之前,需将其设置为输入模式:
非中断引脚:echo “none” > edge
上升沿触发:echo “rising” > edge
下降沿触发:echo “falling” > edge
边沿触发:echo “both” > edge

当引脚被配置为中断后可以使用poll()函数监听引脚的电平状态变化,在后面的示例中将向大家介绍。

GPIO 应用编程之输出

上一小节已经向大家介绍了如何通过sysfs 方式控制开发板上的GPIO 引脚,本小节我们编写一个简单地测试程序,控制开发板上的某一个GPIO 输出高、低不同的电平状态,其示例代码如下所示:

本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->16_gpio->gpio_out.c。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>static char gpio_path[100];static int gpio_config(const char *attr, const char *val)
{char file_path[100];int len;int fd;sprintf(file_path, "%s/%s", gpio_path, attr);if (0 > (fd = open(file_path, O_WRONLY))) {perror("open error");return fd;}len = strlen(val);if (len != write(fd, val, len)) {perror("write error");close(fd);return -1;}close(fd);  //关闭文件return 0;
}int main(int argc, char *argv[])
{/* 校验传参 */if (3 != argc) {fprintf(stderr, "usage: %s <gpio> <value>\n", argv[0]);exit(-1);}/* 判断指定编号的GPIO是否导出 */sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出int fd;int len;if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {perror("open error");exit(-1);}len = strlen(argv[1]);if (len != write(fd, argv[1], len)) {//导出gpioperror("write error");close(fd);exit(-1);}close(fd);  //关闭文件}/* 配置为输出模式 */if (gpio_config("direction", "out"))exit(-1);/* 极性设置 */if (gpio_config("active_low", "0"))exit(-1);/* 控制GPIO输出高低电平 */if (gpio_config("value", argv[2]))exit(-1);/* 退出程序 */exit(0);
}

执行程序时需要传入两个参数,argv[1]指定GPIO 的编号、argv[2]指定输出电平状态(0 表示低电平、1 表示高电平)。

上述代码中首先使用access()函数判断指定编号的GPIO 引脚是否已经导出,也就是判断相应的gpioX目录是否存在,如果不存在则表示未导出,则通过"/sys/class/gpio/export"文件将其导出;导出之后先配置了GPIO 引脚为输出模式,也就是向direction 文件中写入"out";接着再配置极性,通过向active_low 文件中写入"0"(不用配置也可以);最后再控制GPIO 引脚输出相应的电平状态,通过对value 属性文件写入"1"或"0"来使其输出高电平或低电平。

使用交叉编译工具编译应用程序,如下所示:

在这里插入图片描述

GPIO 应用编程之输入

本小节我们编写一个读取GPIO 电平状态的测试程序,其示例代码如下所示:
本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->16_gpio->gpio_in.c。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>static char gpio_path[100];static int gpio_config(const char *attr, const char *val)
{char file_path[100];int len;int fd;sprintf(file_path, "%s/%s", gpio_path, attr);if (0 > (fd = open(file_path, O_WRONLY))) {perror("open error");return fd;}len = strlen(val);if (len != write(fd, val, len)) {perror("write error");close(fd);return -1;}close(fd);  //关闭文件return 0;
}int main(int argc, char *argv[])
{char file_path[100];char val;int fd;/* 校验传参 */if (2 != argc) {fprintf(stderr, "usage: %s <gpio>\n", argv[0]);exit(-1);}/* 判断指定编号的GPIO是否导出 */sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出int len;if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {perror("open error");exit(-1);}len = strlen(argv[1]);if (len != write(fd, argv[1], len)) {//导出gpioperror("write error");close(fd);exit(-1);}close(fd);  //关闭文件}/* 配置为输入模式 */if (gpio_config("direction", "in"))exit(-1);/* 极性设置 */if (gpio_config("active_low", "0"))exit(-1);/* 配置为非中断方式 */if (gpio_config("edge", "none"))exit(-1);/* 读取GPIO电平状态 */sprintf(file_path, "%s/%s", gpio_path, "value");if (0 > (fd = open(file_path, O_RDONLY))) {perror("open error");exit(-1);}if (0 > read(fd, &val, 1)) {perror("read error");close(fd);exit(-1);}printf("value: %c\n", val);/* 退出程序 */close(fd);exit(0);
}

执行程序时需要传入一个参数,argv[1]指定要读取电平状态的GPIO 对应的编号。
上述代码中首先使用access()函数判断指定编号的GPIO 引脚是否已经导出,若未导出,则通过
“/sys/class/gpio/export"文件将其导出;导出之后先配置了GPIO 引脚为输入模式,也就是向direction 文件中写入"in”;接着再配置极性、设置GPIO 引脚为非中断模式(向edge 属性文件中写入"none")。
最后打开value 属性文件,读取GPIO 的电平状态并将其打印出来。
使用交叉编译工具编译应用程序,如下所示:
在这里插入图片描述

GPIO 应用编程之中断

在应用层可以将GPIO 配置为中断触发模式,譬如将GPIO 配置为上升沿触发、下降沿触发或者边沿触发,本小节我们来编写一个测试程序,将GPIO 配置为边沿触发模式并监测中断触发状态。其示例代码如下所示:
本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->16_gpio->gpio_intr.c。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <poll.h>static char gpio_path[100];static int gpio_config(const char *attr, const char *val)
{char file_path[100];int len;int fd;sprintf(file_path, "%s/%s", gpio_path, attr);if (0 > (fd = open(file_path, O_WRONLY))) {perror("open error");return fd;}len = strlen(val);if (len != write(fd, val, len)) {perror("write error");return -1;}close(fd);  //关闭文件return 0;
}int main(int argc, char *argv[])
{struct pollfd pfd;char file_path[100];int ret;char val;/* 校验传参 */if (2 != argc) {fprintf(stderr, "usage: %s <gpio>\n", argv[0]);exit(-1);}/* 判断指定编号的GPIO是否导出 */sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出int len;int fd;if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {perror("open error");exit(-1);}len = strlen(argv[1]);if (len != write(fd, argv[1], len)) {//导出gpioperror("write error");exit(-1);}close(fd);  //关闭文件}/* 配置为输入模式 */if (gpio_config("direction", "in"))exit(-1);/* 极性设置 */if (gpio_config("active_low", "0"))exit(-1);/* 配置中断触发方式: 上升沿和下降沿 */if (gpio_config("edge", "both"))exit(-1);/* 打开value属性文件 */sprintf(file_path, "%s/%s", gpio_path, "value");if (0 > (pfd.fd = open(file_path, O_RDONLY))) {perror("open error");exit(-1);}/* 调用poll */pfd.events = POLLPRI; //只关心高优先级数据可读(中断)read(pfd.fd, &val, 1);//先读取一次清除状态for ( ; ; ) {ret = poll(&pfd, 1, -1);    //调用pollif (0 > ret) {perror("poll error");exit(-1);}else if (0 == ret) {fprintf(stderr, "poll timeout.\n");continue;}/* 校验高优先级数据是否可读 */if(pfd.revents & POLLPRI) {if (0 > lseek(pfd.fd, 0, SEEK_SET)) {//将读位置移动到头部perror("lseek error");exit(-1);}if (0 > read(pfd.fd, &val, 1)) {perror("read error");exit(-1);}printf("GPIO中断触发<value=%c>\n", val);}}/* 退出程序 */exit(0);
}

执行程序时需要传入一个参数,argv[1]指定要读取电平状态的GPIO 对应的编号。
上述代码中首先使用access()函数判断指定编号的GPIO 引脚是否已经导出,若未导出,则通过
"/sys/class/gpio/export"文件将其导出。
对GPIO 进行配置:配置为输入模式、配置极性、将触发方式配置为边沿触发。
打开value 属性文件,获取到文件描述符,接着使用poll()函数对value 的文件描述符进行监视,这里为什么要使用poll()监视、而不是直接对文件描述符进行读取操作?这里简单的描述一下。
13.2.3 小节给大家详细介绍了poll()函数,这里不再重述!poll()函数可以监视一个或多个文件描述符上的I/O 状态变化,譬如POLLIN、POLLOUT、POLLERR、POLLPRI 等,其中POLLIN 和POLLOUT 表示普通优先级数据可读、可写,而POLLPRI 表示有高优先级数据可读取,中断就是一种高优先级事件,当中断触发时表示有高优先级数据可被读取。当然,除此之外还可使用13.4 小节所介绍的异步I/O 方式来监视
GPIO 中断触发。
使用交叉编译工具编译应用程序,如下所示:
在这里插入图片描述

在开发板上测试

前面我们编写了3 个测试程序,并编译得到了对应的可执行文件,本小节一个一个进行测试。在测试之前,选择一个测试引脚,这里笔者以板子上的GPIO1_IO01 引脚为例,该引脚在底板上已经引出,如下所示:
在这里插入图片描述
Mini 开发板可以通过背面丝印标注的名称或原理图进行确认。

GPIO 输出测试

将示例代码16.2.1 编译的到的可执行文件拷贝到开发板Linux 系统用户家目录下,执行该应用程序控制开发板上的GPIO1_IO01 引脚输出高或低电平:

./testApp 1 1 		#控制GPIO1_IO01 输出高电平
./testApp 1 0 		#控制GPIO1_IO01 输出低电平

在这里插入图片描述
执行相应的命令后,可以使用万用表或者连接一个LED 小灯进行检验,以验证实验结果!

GPIO 输入测试

将示例代码16.3.1 编译的到的可执行文件拷贝到开发板Linux 系统用户家目录下,执行该应用程序以读取GPIO1_IO01 引脚此时的电平状态,是高电平还是低电平?
首先通过杜邦线将GPIO1_IO01 引脚连接到板子上的3.3V 电源引脚上,接着执行命令读取GPIO 电平状态:
在这里插入图片描述
打印出的value 等于1,表示读取到GPIO 的电平确实是高电平;接着将GPIO1_IO01 引脚连接到板子上的GND 引脚上,执行命令:
在这里插入图片描述
打印出的value 等于0,表示读取到GPIO 的电平确实是低电平;测试结果与实际相符合!

GPIO 中断测试

将示例代码16.4.1 编译的到的可执行文件拷贝到开发板Linux 系统用户家目录下,执行该应用程序可以监测GPIO 的中断触发。
执行应用程序监测GPIO1_IO01 引脚的中断触发情况,如下所示:

./testApp 1 	# 监测GPIO1_IO01 引脚中断触发

在这里插入图片描述
当执行命令之后,我们可以使用杜邦线将GPIO1_IO01 引脚连接到GND 或3.3V 电源引脚上,来回切换,使得GPIO1_IO01 引脚的电平状态发生由高到低或由低到高的状态变化,以验证GPIO 中断的边沿触发情况;当发生中断时,终端将会打印相应的信息,如上图所示。

Tips:测试完成后按Ctrl+C 退出程序!

相关文章:

Linux系统GPIO应用编程

目录应用层如何操控GPIOGPIO 应用编程之输出GPIO 应用编程之输入GPIO 应用编程之中断在开发板上测试GPIO 输出测试GPIO 输入测试GPIO 中断测试本章介绍应用层如何控制GPIO&#xff0c;譬如控制GPIO 输出高电平、或输出低电平。应用层如何操控GPIO 与LED 设备一样&#xff0c;G…...

手敲Mybatis-反射工具天花板

历时漫长的岁月&#xff0c;终于鼓起勇气继续研究Mybatis的反射工具类们&#xff0c;简直就是把反射玩出花&#xff0c;但是理解起来还是很有难度的&#xff0c;涉及的内容代码也颇多&#xff0c;所以花费时间也比较浩大&#xff0c;不过当了解套路每个类的功能也好&#xff0c…...

Java -数据结构,【优先级队列 / 堆】

一、二叉树的顺序存储 在前面我们已经讲了二叉树的链式存储&#xff0c;就是一棵树的左孩子和右孩子 而现在讲的是&#xff1a;顺序存储一棵二叉树。 1.1、存储方式 使用数组保存二叉树结构&#xff0c;方式即将二叉树用层序遍历方式放入数组中。 一般只适合表示完全二叉树&a…...

Python+Qt指纹录入识别考勤系统

PythonQt指纹录入识别考勤系统如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<PythonQt指纹录入识别考勤系统>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学…...

K_A14_004 基于STM32等单片机驱动旋转角度传感器模块 串口与OLED0.96双显示

K_A14_004 基于STM32等单片机驱动旋转角度传感器模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RC旋转角度传感器模块1.2、STM32F103C8T6旋转角度传感器模块五、…...

2023年全国最新机动车签字授权人精选真题及答案12

百分百题库提供机动车签字授权人考试试题、机动车签字授权人考试预测题、机动车签字授权人考试真题、机动车签字授权人证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 11.注册登记前所有机动车都应进行安全技术检验。 答案…...

Linux小黑板(10):信号

我们写在linux系统环境下写一个程序&#xff0c;唔&#xff0c;"它的功能是每隔1s向屏幕打印hello world。"这时&#xff0c;我们在键盘上按出"Ctrl C"后,进程会发生什么&#xff1f;&#xff1f;我们清晰地看到&#xff0c;进程已经在我们按出"Ctrl…...

GO 语言基础语法一 (快速入门 Go 语言)

Go语言基础语法一. golang 标识符&#xff0c;关键字&#xff0c;命名规则二. golang 变量三. golang 常量四. golang 数据类型五. golang 布尔类型六. golang 数字类型七. golang 字符串1. go语言字符串字面量2. go语言字符串连接(1). 使用加号(2). 使用 fmt.Sprintf() 函数(3…...

Java高效率复习-SpringMVC[SpringMVC-2]

SpringMVC获取请求参数 SpringMVC获取请求参数的两种方式↓ 通过ServletAPI获取请求参数 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 通过request的API——getParameter(String s)方法来获取…...

【前端】一个更底层库-React基础知识点

目录Reat是什么&#xff1f;为什么要使用React类库比较容易学习&#xff0c;API非常少。组件内聚&#xff0c;容易组合原生组件和自定义组件融合渲染状态/属性驱动全局更新commonjs生态圈/工具栏完善React基础知识JSX概述JSX嵌入变量Event事件组合组合CHILDREN总结大家好&#…...

C++ 之枚举类型

文章目录参考描述枚举类型枚举类型枚举变量的声明及定义细节枚举常量的默认初始值枚举常量不可被修改赋值运算枚举常量与数据类型为枚举常量指定数据类型可选择的数据类型特殊的 Bool强枚举类型命名冲突强枚举类型参考 项目描述菜鸟教程C 枚举类型详解精通C &#xff08;第九版…...

软件测试用例(3)

按照测试对象划分: 一)界面测试: 1)软件只是一种工具&#xff0c;软件和人的信息交流是通过界面来进行的&#xff0c;界面是软件和用户交流的最直接的一层&#xff0c;界面的设计决定了用户对于我们设计软件的第一映像&#xff0c;界面如同人的面孔&#xff0c;具有最吸引用户的…...

Spring——Bean管理-注解方式进行属性注入

Spring针对Bean管理中创建对象提供的注解有哪些&#xff1f;Component&#xff1a;普通Service&#xff1a;业务逻辑层Controller&#xff1a;controller层Repository&#xff1a;dao层用注解的方式是为什么&#xff1f;简化xml方式开发&#xff0c;只需要注解就可以完成在配置…...

【设计模式之美 设计原则与思想:设计原则】20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?

上几节课中&#xff0c;我们学习了经典的 SOLID 原则。今天&#xff0c;我们讲两个设计原则&#xff1a;KISS 原则和 YAGNI 原则。其中&#xff0c;KISS 原则比较经典&#xff0c;耳熟能详&#xff0c;但 YAGNI 你可能没怎么听过&#xff0c;不过它理解起来也不难。 理解这两个…...

Java代码弱点与修复之——Copy-paste error(复制粘贴错误)

弱点描述 Copy-paste error,复制粘贴错误。 是指在复制和粘贴代码时产生的错误。这种错误通常是由于程序员在复制代码时未正确编辑所复制的代码或编辑复制后的代码时忘记更改一些值或参数而导致的。复制粘贴错误可能会导致程序逻辑错误、编译错误或运行时错误。 示例代码 …...

Editor.md 的使用方法及图片处理

目录1. 资源下载2. 生成页面2.1 编辑和预览页面2.2 文本渲染页面3. 图片上传3.1 前端配置3.2 后端接口4. 图片粘贴[^2]1. 资源下载 官网下载 gitee 下载 2. 生成页面 2.1 编辑和预览页面 将资源&#xff08;精简后 Editor.md 资源1&#xff09;导入项目&#xff1a; 按照官…...

剑指 Offer II 018. 有效的回文

题目链接 剑指 Offer II 018. 有效的回文 easy 题目描述 给定一个字符串 s&#xff0c;验证 s是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 本题中&#xff0c;将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan, …...

Elasticsearch分析器(Analyzer)

Elasticsearch分析器&#xff08;Analyzer&#xff09; 文章目录Elasticsearch分析器&#xff08;Analyzer&#xff09;分析器概念内置分析器&#xff08;8.6版本&#xff09;自定义分析器elasticsearch-analysis-ik&#xff08;简称ik&#xff0c;&#x1f495;14.8k&#xff…...

P6入门:了解P6 Professional 工具栏及地图分享

目录 引言 相关分享 引言 凭借更大的灵活性和增强的自定义功能&#xff0c;最新版本的 Oracle Primavera P6 Professional 的界面比早期版本有了巨大改进。对于有经验的伙伴来说&#xff0c;它仍然是熟悉的领域&#xff0c;几乎所有预期的功能都显示在前面。该界面可以更好地…...

习题30 if elif else 语句

people 30#变量people赋值30 cars 40#变量cars赋值40 buses 15#变量buses赋值 if cars > people:#如果出租车比人多print("We should take the cars")#我们坐出租车 elif cars < people:#elif后面必须跟条件&#xff0c;print("We should not take the…...

32 openEuler使用LVM管理硬盘-管理卷组

文章目录32 openEuler使用LVM管理硬盘-管理卷组32.1 创建卷组32.2 查看卷组32.3 修改卷组属性32.4 扩展卷组32.5 收缩卷组32.6 删除卷组32 openEuler使用LVM管理硬盘-管理卷组 32.1 创建卷组 可在root权限下通过vgcreate命令创建卷组。 vgcreate [option] vgname pvname ...…...

Jackson CVE-2017-17485 反序列化漏洞

0x00 前言 同CVE-2017-15095一样&#xff0c;是CVE-2017-7525黑名单绕过的漏洞&#xff0c;主要还是看一下绕过的调用链利用方式。 可以先看&#xff1a; Jackson 反序列化漏洞原理 或者直接看总结也可以&#xff1a; Jackson总结 涉及版本&#xff1a;2.8.10和2.9.x至2.…...

十大排序(C++版)

测试排序的题目&#xff1a; 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 堕落的做法&#xff1a; class Solution { public:vector<int> sortArray(vector<int>& nums) {sort(nums.begin(),nums.end());return nums;} };视频推荐&#xff1a; …...

SpringMVC中的常用注解

Java知识点总结&#xff1a;想看的可以从这里进入 目录3.2、常用的注解3.2、常用的注解 Controller&#xff1a;代表此类是一个控制器&#xff0c;需要配置包的扫描。Spring MVC 是通过组件扫描机制查找应用中的控制器类的 在Spring6.0之后要求控制层必须添加该注解才会被识别成…...

English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一

English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一课前活动练习方法大小元音总结小元音准备工作[ʌ] 中元音发音技巧对应单词的发音对应句子的发音常见的字母组合[ɒ] 后元音发音技巧对应单词的发音对应句子的发音常见的字母组合…...

fastadmin后台登录页修改

直接替换就行 <!DOCTYPE html> <html lang"{$config.language}"> <head>{include file"common/meta" /}<style type"text/css">body {color: #999;background-color: #f1f4fd;background-size: cover;}a {color: #444;…...

Java 面向对象(OOP)的三大特性

封装 所谓封装&#xff0c;意思就是隐藏内部细节&#xff0c;在编程中&#xff0c;指利用抽象数据类型将数据和基于数据的操作封装在一起&#xff0c;使其构成一个不可分割的独立实体&#xff0c;并尽可能地隐藏内部的细节&#xff0c;只保留一些对外接口使之与外部发生联系。…...

Java:openjdk: error: Student is abstract; cannot be instantiated;java编译环境

文章目录编译环境jdkopenjdk错误代码小心javac -verbos编译环境 jdk 需要安装的javac 在java-devel 包里 [root10 ~]# rpm -qf /usr/bin/javac file /usr/bin/javac is not owned by any package [root10 ~]# ll /usr/bin/javac lrwxrwxrwx. 1 root root 23 Jun 15 09:52 /us…...

28个案例问题分析---019---临时解决方案和最终解决方案--思想

临时解决方案与最终解决方案一&#xff1a;背景介绍二&#xff1a;临时解决方案&#xff1f;最终解决方案&#xff1f;概念如何选择三&#xff1a;总结一&#xff1a;背景介绍 项目中&#xff0c;出现了一个线上问题。 用户登陆之后看不到课程。重新登陆就可以看到课程。出现这…...

计算机网络的166个概念你知道几个 第四部分

HTML&#xff1a;HTML 称为超文本标记语言&#xff0c;是一种标识性的语言。它包括一系列标签&#xff0e;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的 Internet 资源连接为一个逻辑整体。HTML 文本是由 HTML 命令组成的描述性文本&#xff0c;HTML 命令可以说…...