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

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理②

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理②

  • 第十八章 Linux系统对中断的处理 ②
    • 18.3 Linux中断系统中的重要数据结构
      • 18.3.1 irq_desc数组
      • 18.3.2 irqaction结构体
      • 18.3.3 irq_data结构体
      • 18.3.4 irq_domain结构体
      • 18.3.5 irq_chip结构体
    • 18.4 在设备树中指定中断_在代码中获得中断
      • 18.4.1 设备树里中断节点的语法
        • 18.4.1.1 设备树里的中断控制器
        • 18.4.1.2 设备树里使用中断
      • 18.4.2 设备树里中断节点的示例
      • 18.4.3 在代码中获得中断
        • 18.4.3.1 对于 platform_device
        • 18.4.3.2 对于 I2C设备、SPI设备
        • 18.4.3.3 调用 of_irq_get获得中断号
        • 18.4.3.4 对于 GPIO

第十八章 Linux系统对中断的处理 ②

在这里插入图片描述

18.3 Linux中断系统中的重要数据结构

本节内容,可以从 request_irq(include/linux/interrupt.h)函数一路分析得到。 能弄清楚下面这个图,对 Linux中断系统的掌握也基本到位了。
在这里插入图片描述

最核心的结构体是 irq_desc,之前为了易于理解,我们说在 Linux内核中有一个中断数组,对于每一个硬件中断,都有一个数组项,这个数组就是 irq_desc数组。

注意:如果内核配置了 CONFIG_SPARSE_IRQ,那么它就会用基数树(radix tree)来代替 irq_desc数组。SPARSE的意思是“稀疏”,假设大小为 1000的数组中只用到 2个数组项,那不是浪费嘛?所以在中断比较“稀疏”的情况下可以用基数树来代替数组。

18.3.1 irq_desc数组

irq_desc结构体在 include/linux/irqdesc.h中定义,主要内容如下图:
在这里插入图片描述

每一个 irq_desc数组项中都有一个函数:handle_irq,还有一个 action链表。要理解它们,需要先看中断结构图:
在这里插入图片描述

外部设备 1、外部设备 n共享一个 GPIO中断 B,多个 GPIO中断汇聚到 GIC(通用中断控制器)的 A号中断,GIC再去中断 CPU。那么软件处理时就是反过来,先读取 GIC获得中断号 A,再细分出 GPIO中断 B,最后判断是哪一个外部芯片发生了中断。
所以,中断的处理函数来源有三:
① GIC的处理函数:
假设 irq_desc[A].handle_irq是 XXX_gpio_irq_handler(XXX指厂家),这个函数需要读取芯片的 GPIO控制器,细分发生的是哪一个 GPIO中断(假设是 B),再去调用 irq_desc[B]. handle_irq。
注意:irq_desc[A].handle_irq细分出中断后 B,调用对应的 irq_desc[B].handle_irq。
显然中断 A是 CPU感受到的顶层的中断,GIC中断 CPU时,CPU读取 GIC状态得到中断 A。
② 模块的中断处理函数:
比如对于 GPIO模块向 GIC发出的中断 B,它的处理函数是 irq_desc[B].handle_irq。
BSP开发人员会设置对应的处理函数,一般是 handle_level_irq或 handle_edge_irq,从名字上看是用来处理电平触发的中断、边沿触发的中断。
注意:导致 GPIO中断 B发生的原因很多,可能是外部设备 1,可能是外部设备 n,可能只是某一个设备,也可能是多个设备。所以 irq_desc[B].handle_irq会调用某个链表里的函数,这些函数由外部设备提供。这些函数自行判断该中断是否自己产生,若是则处理。
③ 外部设备提供的处理函数:
这里说的“外部设备”可能是芯片,也可能总是简单的按键。它们的处理函数由自己驱动程序提供,这是最熟悉这个设备的“人”:它知道如何判断设备是否发生了中断,如何处理中断。
对于共享中断,比如 GPIO中断 B,它的中断来源可能有多个,每个中断源对应一个中断处理函数。所以 irq_desc[B]中应该有一个链表,存放着多个中断源的处理函数。
一旦程序确定发生了 GPIO中断 B,那么就会从链表里把那些函数取出来,一一执行。
这个链表就是 action链表。
对于我们举的这个例子来说,irq_desc数组如下:
在这里插入图片描述

18.3.2 irqaction结构体

irqaction结构体在 include/linux/interrupt.h中定义,主要内容如下图:
在这里插入图片描述

当调用 request_irq、request_threaded_irq注册中断处理函数时,内核就会构造一个 irqaction结构体。在里面保存 name、dev_id等,最重要的是 handler、thread_fn、thread。
handler是中断处理的上半部函数,用来处理紧急的事情。
thread_fn对应一个内核线程 thread,当 handler执行完毕,Linux内核会唤醒对应的内核线程。在内核线程里,会调用 thread_fn函数。
可以提供 handler而不提供 thread_fn,就退化为一般的 request_irq函数。
可以不提供 handler只提供 thread_fn,完全由内核线程来处理中断。
也可以既提供 handler也提供 thread_fn,这就是中断上半部、下半部。
里面还有一个名为 sedondary的 irqaction结构体,它的作用以后再分析。
在 reqeust_irq时可以传入 dev_id,为何需要 dev_id?作用有 2:
① 中断处理函数执行时,可以使用 dev_id
② 卸载中断时要传入 dev_id,这样才能在 action链表中根据 dev_id找到对应项 所以在共享中断中必须提供 dev_id,非共享中断可以不提供。

18.3.3 irq_data结构体

irq_data结构体在 include/linux/irq.h中定义,主要内容如下图:
在这里插入图片描述

它就是个中转站,里面有 irq_chip指针 irq_domain指针,都是指向别的结构体。
比较有意思的是 irq、hwirq,irq是软件中断号,hwirq是硬件中断号。比如上面我们举的例子,在 GPIO中断 B是软件中断号,可以找到 irq_desc[B]这个数组项;GPIO里的第 x号中断,这就是 hwirq。
谁来建立 irq、hwirq之间的联系呢?由 irq_domain来建立。irq_domain会把本地的 hwirq映射为全局的 irq,什么意思?比如 GPIO控制器里有第 1号中断,UART模块里也有第 1号中断,这两个“第 1号中断”是不一样的,它们属于不同的“域”──irq_domain。

18.3.4 irq_domain结构体

irq_domain结构体在 include/linux/irqdomain.h中定义,主要内容如下图:
在这里插入图片描述

当我们后面从设备树讲起,如何在设备树中指定中断,设备树的中断如何被转换为 irq时,irq_domain将会起到极大的作为。
这里基于入门的解度简单讲讲,在设备树中你会看到这样的属性:

interrupt-parent = <&gpio1>; 
interrupts = <5 IRQ_TYPE_EDGE_RISING>; 

它表示要使用 gpio1里的第 5号中断,hwirq就是 5。
但是我们在驱动中会使用 request_irq(irq, handler)这样的函数来注册中断,irq是什么?它是软件中断号,它应该从“gpio1的第 5号中断”转换得来。
谁把 hwirq转换为 irq?由 gpio1的相关数据结构,就是 gpio1对应的 irq_domain结构体。
irq_domain结构体中有一个 irq_domain_ops结构体,里面有各种操作函数,主要是:
① xlate
用来解析设备树的中断属性,提取出 hwirq、type等信息。
② map
把 hwirq转换为 irq。

18.3.5 irq_chip结构体

irq_chip结构体在 include/linux/irq.h中定义,主要内容如下图:
在这里插入图片描述

这个结构体跟“chip”即芯片相关,里面各成员的作用在头文件中也列得很清楚,摘录部分如下:

* @irq_startup: start up the interrupt (defaults to ->enable if NULL) 
* @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL) 
* @irq_enable:  enable the interrupt (defaults to chip->unmask if NULL) 
* @irq_disable: disable the interrupt 
* @irq_ack:  start of a new interrupt 
* @irq_mask:  mask an interrupt source 
* @irq_mask_ack: ack and mask an interrupt source 
* @irq_unmask:  unmask an interrupt source 
* @irq_eoi:  end of interrupt 

我们在 request_irq后,并不需要手工去使能中断,原因就是系统调用对应的 irq_chip里的函数帮我们使能了中断。
我们提供的中断处理函数中,也不需要执行主芯片相关的清中断操作,也是系统帮我们调用 irq_chip中的相关函数。
但是对于外部设备相关的清中断操作,还是需要我们自己做的。
就像上面图里的“外部设备 1“、“外部设备 n”,外设备千变万化,内核里可没有对应的清除中断操作。

18.4 在设备树中指定中断_在代码中获得中断

18.4.1 设备树里中断节点的语法

参考文档:
内核 Documentation\devicetree\bindings\interrupt-controller\interrupts.txt

18.4.1.1 设备树里的中断控制器

中断的硬件框图如下:
在这里插入图片描述

在硬件上,“中断控制器”只有 GIC这一个,但是我们在软件上也可以把上图中的“GPIO”称为“中断控制器”。很多芯片有多个 GPIO模块,比如 GPIO1、GPIO2等等。所以软件上的“中断控制器”就有很多个:GIC、GPIO1、GPIO2等等。
GPIO1连接到 GIC,GPIO2连接到 GIC,所以 GPIO1的父亲是 GIC,GPIO2的父亲是 GIC。
假设 GPIO1有 32个中断源,但是它把其中的 16个汇聚起来向 GIC发出一个中断,把另外 16个汇聚起来向 GIC发出另一个中断。这就意味着 GPIO1会用到 GIC的两个中断,会涉及 GIC里的 2个 hwirq。
这些层级关系、中断号(hwirq),都会在设备树中有所体现。

在设备树中,中断控制器节点中必须有一个属性:interrupt-controller,表明它是“中断控制器”。 还必须有一个属性:#interrupt-cells,表明引用这个中断控制器的话需要多少个 cell。
#interrupt-cells的值一般有如下取值:
① #interrupt-cells=<1>
别的节点要使用这个中断控制器时,只需要一个 cell来表明使用“哪一个中断”。
② #interrupt-cells=<2>
别的节点要使用这个中断控制器时,需要一个 cell来表明使用“哪一个中断”;
还需要另一个 cell来描述中断,一般是表明触发类型:
第 2个 cell的 bits[3:0] 用来表示中断触发类型(trigger type and level flags):

1 = low-to-high edge triggered,上升沿触发 
2 = high-to-low edge triggered,下降沿触发 
4 = active high level-sensitive,高电平触发 
8 = active low level-sensitive,低电平触发 

示例如下:

vic: intc@10140000 { compatible = "arm,versatile-vic"; interrupt-controller; #interrupt-cells = <1>; reg = <0x10140000 0x1000>; 
}; 

如果中断控制器有级联关系,下级的中断控制器还需要表明它的“interrupt-parent”是谁,用了interrupt-parent”中的哪一个“interrupts”,请看下一小节。

18.4.1.2 设备树里使用中断

一个外设,它的中断信号接到哪个“中断控制器”的哪个“中断引脚”,这个中断的触发方式是怎样的? 这 3个问题,在设备树里使用中断时,都要有所体现。
① interrupt-parent=<&XXXX>
你要用哪一个中断控制器里的中断?
② interrupts
你要用哪一个中断?
Interrupts里要用几个 cell,由 interrupt-parent对应的中断控制器决定。在中断控制器里有
“#interrupt-cells”属性,它指明了要用几个 cell来描述中断。
比如:

i2c@7000c000 { 
gpioext: gpio-adnp@41 { compatible = "ad,gpio-adnp"; 
interrupt-parent = <&gpio>; interrupts = <160 1>; 
gpio-controller; 
#gpio-cells = <1>; }; ...... }; 
interrupt-controller; 
#interrupt-cells = <2>; 

③ 新写法:interrupts-extended
一个“interrupts-extended”属性就可以既指定“interrupt-parent”,也指定“interrupts”,比如: interrupts-extended = <&intc1 5 1>, <&intc2 1 0>;

18.4.2 设备树里中断节点的示例

以 xxxxxx_IMX6ULL开发板为例,在 arch/arm/boot/dts目录下可以看到 2个文件:imx6ull.dtsi、xxxxxx_imx6ull-14x14.dts,把里面有关中断的部分内容抽取出来。
在这里插入图片描述

从设备树反推 IMX6ULL的中断体系,如下,比之前的框图多了一个“GPC INTC”:
在这里插入图片描述

GPC INTC的英文是:General Power Controller, Interrupt Controller。它提供中断屏蔽、中断状态查询功能,实际上这些功能在 GIC里也实现了,个人觉得有点多余。除此之外,它还提供唤醒功能,这才是保留它的原因。

18.4.3 在代码中获得中断

之前我们提到过,设备树中的节点有些能被转换为内核里的 platform_device,有些不能,回顾如下: A. 根节点下含有 compatile属性的子节点,会转换为 platform_device
B. 含有特定 compatile属性的节点的子节点,会转换为 platform_device
如果一个节点的 compatile属性,它的值是这 4者之一: “simple-bus”,“simple-mfd”,“isa”,“arm,amba-bus”,
那么它的子结点(需含 compatile属性)也可以转换为 platform_device。
C. 总线 I2C、SPI节点下的子节点:不转换为 platform_device
某个总线下到子节点,应该交给对应的总线驱动程序来处理, 它们不应该被转换为 platform_device。

18.4.3.1 对于 platform_device

一个节点能被转换为 platform_device,如果它的设备树里指定了中断属性,那么可以从
platform_device中获得“中断资源”,函数如下,可以使用下列函数获得 IORESOURCE_IRQ资源,即中断号:

/** * platform_get_resource - get a resource for a device * @dev: platform device * @type: resource type   // 取哪类资源?IORESOURCE_MEM、IORESOURCE_REG 
*                      // IORESOURCE_IRQ等 * @num: resource index  // 这类资源中的哪一个? */ 
struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num); 
18.4.3.2 对于 I2C设备、SPI设备

对于 I2C设备节点,I2C总线驱动在处理设备树里的 I2C子节点时,也会处理其中的中断信息。一个I2C设备会被转换为一个 i2c_client结构体,中断号会保存在 i2c_client的 irq成员里,代码如下(drivers/i2c/i2c-core.c):
在这里插入图片描述
对于 SPI设备节点,SPI总线驱动在处理设备树里的 SPI子节点时,也会处理其中的中断信息。一个SPI设备会被转换为一个 spi_device结构体,中断号会保存在 spi_device的 irq成员里,代码如下(drivers/spi/spi.c):
在这里插入图片描述

18.4.3.3 调用 of_irq_get获得中断号

如果你的设备节点既不能转换为 platform_device,它也不是 I2C设备,不是 SPI设备,那么在驱动程序中可以自行调用 of_irq_get函数去解析设备树,得到中断号。

18.4.3.4 对于 GPIO

参考:drivers/input/keyboard/gpio_keys.c
可以使用 gpio_to_irq或 gpiod_to_irq获得中断号。 举例,假设在设备树中有如下节点:

gpio-keys { compatible = "gpio-keys"; pinctrl-names = "default"; user { label = "User Button"; gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;     gpio-key,wakeup; linux,code = <KEY_1>; }; 
}; 

那么可以使用下面的函数获得引脚和 flag:

button->gpio = of_get_gpio_flags(pp, 0, &flags); 
bdata->gpiod = gpio_to_desc(button->gpio); 

再去使用 gpiod_to_irq获得中断号:

irq = gpiod_to_irq(bdata->gpiod); 

相关文章:

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理②

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理② 第十八章 Linux系统对中断的处理 ②18.3 Linux中断系统中的重要数据结构18.3.1 irq_desc数组18.3.2 irqaction结构体18.3.3 irq_data结构体18.3.4 irq_domain结构体18.3.5 irq_chip结构体 18.4 在设备树中指定中断_在…...

Kolmogorov-Smirnov正态性检验

Kolmogorov-Smirnov正态性检验是一种统计方法&#xff0c;用于检验数据集是否服从正态分布。其基本原理和用途如下&#xff1a; 基本原理&#xff1a; 假设检验&#xff1a;Kolmogorov-Smirnov检验基于一个假设&#xff0c;即待检验的数据集服从特定的理论正态分布。计算累积…...

BI神器Power Query(25)-- 使用PQ实现表格多列转换(1/3)

实例需求&#xff1a;原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中&#xff0c;att1、att3、att5为一组&#xff0c;att2、att3、att6为另一组&#xff0c;数据如下所示。 更新表格数据 原始数据表&#xff1a; Col1Col2Att1Att2Att3Att4Att5Att6AAADD…...

windows系统一键开启和关闭虚拟化

说明 跟虚拟化相关的三个程序 一键开启脚本 REM 开启 Hyper-V 服务 pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%Sy…...

NSSCTF做题(5)

[NSSCTF 2022 Spring Recruit]babyphp 代码审计 if(isset($_POST[a])&&!preg_match(/[0-9]/,$_POST[a])&&intval($_POST[a])){ if(isset($_POST[b1])&&$_POST[b2]){ if($_POST[b1]!$_POST[b2]&&md5($_POST[b1])md5($_POST[b2])){…...

java基础题——二维数组的基本应用

1.设计程序按照各个学生的 Java 成绩进行排序 ( 降序 ) 2.设计程序&#xff0c;根据学生总成绩进行排序(降序排列)&#xff0c;并输出学生姓名、每门课程的名称和该学生的成绩、该学生的总成绩 public static void main(String[] args) {String[] names {"安琪拉",…...

Leetcode 2119.反转两次的数字

反转 一个整数意味着倒置它的所有位。 例如&#xff0c;反转 2021 得到 1202 。反转 12300 得到 321 &#xff0c;不保留前导零 。 给你一个整数 num &#xff0c;反转 num 得到 reversed1 &#xff0c;接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num &#x…...

BI神器Power Query(27)-- 使用PQ实现表格多列转换(3/3)

实例需求&#xff1a;原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中&#xff0c;att1、att3、att5为一组&#xff0c;att2、att3、att6为另一组&#xff0c;数据如下所示。 更新表格数据 原始数据表&#xff1a; Col1Col2Att1Att2Att3Att4Att5Att6AAADD…...

VUE3照本宣科——认识VUE3

VUE3照本宣科——认识VUE3 前言一、命令创建项目1.中文官网2.菜鸟教程 二、VUE3项目目录结构1.public2.src&#xff08;1&#xff09;assets&#xff08;2&#xff09;components 3. .eslintrc.cjs4. .gitignore5. .prettierrc.json6.index.html7.package.json8.README.md9.vit…...

《计算机视觉中的多视图几何》笔记(12)

12 Structure Computation 本章讲述如何在已知基本矩阵 F F F和两幅图像中若干对对应点 x ↔ x ′ x \leftrightarrow x x↔x′的情况下计算三维空间点 X X X的位置。 文章目录 12 Structure Computation12.1 Problem statement12.2 Linear triangulation methods12.3 Geomet…...

TFT LCD刷新原理及LCD时序参数总结(LCD时序,写的挺好)

cd工作原理目前不了解&#xff0c;日后会在博客中添加这一部分的内容。 1.LCD工作原理[1] 我对LCD的工作原理也仅仅处在了解的地步&#xff0c;下面基于NXP公司对LCD工作原理介绍的ppt来学习一下。 LCD(liquid crystal display,液晶显示屏) 是由液晶段阵列组成&#xff0c;当…...

基于Java的电影院购票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

Linux基础指令(六)

目录 前言1. man 指令2. date 指令3. cal 指令4. bc 指令5. uname 指令结语&#xff1a; 前言 欢迎各位伙伴来到学习 Linux 指令的 第六天&#xff01;&#xff01;&#xff01; 在上一篇文章 Linux基本指令(五) 中&#xff0c;我们通过一段故事线&#xff0c;带大家感性的了…...

Anderson-Darling正态性检验【重要统计工具】

Anderson-Darling正态性检验是一种用于确定数据集是否服从正态分布&#xff08;也称为高斯分布或钟形曲线分布&#xff09;的统计方法。它基于Anderson和Darling于1954年提出的检验统计量。该检验的基本原理和用途如下&#xff1a; 基本原理&#xff1a; 零假设&#xff08;Nu…...

Ubuntu基于Docker快速配置GDAL的Python、C++环境

本文介绍在Linux的Ubuntu操作系统中&#xff0c;基于Docker快速配置Python、C等不同编程语言均可用的地理数据处理库GDAL的方法。 首先&#xff0c;我们访问GDAL库的Docker镜像官方网站&#xff08;https://github.com/OSGeo/gdal/tree/master/docker&#xff09;。其中&#x…...

<C++> 哈希表模拟实现STL_unordered_set/map

哈希表模板参数的控制 首先需要明确的是&#xff0c;unordered_set是K模型的容器&#xff0c;而unordered_map是KV模型的容器。 要想只用一份哈希表代码同时封装出K模型和KV模型的容器&#xff0c;我们必定要对哈希表的模板参数进行控制。 为了与原哈希表的模板参数进行区分…...

【数据结构与算法】通过双向链表和HashMap实现LRU缓存 详解

这个双向链表采用的是有伪头节点和伪尾节点的 与上一篇文章中单链表的实现不同&#xff0c;区别于在实例化这个链表时就初始化了的伪头节点和伪尾节点&#xff0c;并相互指向&#xff0c;在第一次添加节点时&#xff0c;不需要再考虑空指针指向问题了。 /*** 通过链表与HashMa…...

MySQL的内置函数

文章目录 1. 聚合函数2. group by子句的使用3. 日期函数4. 字符串函5. 数学函数6. 其它函数 1. 聚合函数 COUNT([DISTINCT] expr) 返回查询到的数据的数量 用SELECT COUNT(*) FROM students或者SELECT COUNT(1) FROM students也能查询总个数。 统计本次考试的数学成绩分数去…...

数据结构与算法-(7)---栈的应用-(3)表达式转换

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

Lilliefors正态性检验(一种非参数统计方法)

Lilliefors检验&#xff08;也称为Kolmogorov-Smirnov-Lilliefors检验&#xff09;是一种用于检验数据是否符合正态分布的统计检验方法&#xff0c;它是Kolmogorov-Smirnov检验的一种变体&#xff0c;专门用于小样本情况。与K-S检验不同&#xff0c;Lilliefors检验不需要假定数…...

【云原生】配置Kubernetes CronJob自动备份MySQL数据库(单机版)

文章目录 每天自动备份数据库MySQL【云原生】配置Kubernetes CronJob自动备份Clickhouse数据库 每天自动备份数据库 MySQL 引用镜像:databack/mysql-backup,使用文档:https://hub.docker.com/r/databack/mysql-backup 测试、开发环境:每天0点40分执行全库备份操作,备份文…...

基于PSO算法的功率角摆动曲线优化研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

数论知识点总结(一)

文章目录 目录 文章目录 前言 一、数论有哪些 二、题法混讲 1.素数判断,质数,筛法 2.最大公约数和最小公倍数 3.快速幂 4.约数 前言 现在针对CSP-J/S组的第一题主要都是数论,换句话说,持数论之剑,可行天下矣! 一、数论有哪些 数论 原根,素数判断,质数,筛法最大公约数…...

知识分享 钡铼网关功能介绍:使用SSLTLS 加密,保证MQTT通信安全

背景 为了使不同的设备或系统能够相互通信&#xff0c;让旧有系统和新的系统可以集成&#xff0c;通信更加灵活和可靠。以及将数据从不同的来源收集并传输到不同的目的地&#xff0c;实现数据的集中管理和分发。 通信网关完美克服了这一难题&#xff0c;485或者网口的设备能通过…...

asp.net core mvc区域路由

ASP.NET Core 区域路由&#xff08;Area Routing&#xff09;是一种将应用程序中的路由划分为多个区域的方式&#xff0c;类似于 MVC 的控制器和视图的区域划分。区域路由可以帮助开发人员更好地组织应用程序的代码和路由&#xff0c;并使其更易于维护。 要使用区域路由&#…...

KNN(下):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…...

Servlet开发-session和cookie理解案例-登录页面

项目展示 进入登录页面&#xff0c;输入正确的用户名和密码以后会自动跳到主页 登录成功以后打印用户名以及上次登录的时间&#xff0c;如果浏览器和客户端都保存有上次登录的信息&#xff0c;则不需要登录就可以进入主页 编码思路 1.首先提供一个登录的前端页面&…...

Polygon Miden:扩展以太坊功能集的ZK-optimized rollup

1. 引言 Polygon Miden定位为zkVM&#xff0c;定于2023年Q4上公开测试网。 zk、zkVM、zkEVM及其未来中指出&#xff0c;当前主要有3种类型的zkVM&#xff0c;括号内为其相应的指令集&#xff1a; mainstream&#xff08;WASM, RISC-V&#xff09;EVM&#xff08;EVM bytecod…...

[题]宝物筛选 #单调队列优化

五、宝物筛选&#xff08;洛谷P1776&#xff09; 题目链接 好家伙&#xff0c;找到了一个之前学习多重背包优化时的错误…… 之前记的笔记还是很有用的…… #include<bits/stdc.h> using namespace std; const int N 1e5 10; int f[N]; int n, m; int v, w, s; int l…...

.NET的键盘Hook管理类,用于禁用键盘输入和切换

一、MyHook帮助类 此类需要编写指定屏蔽的按键&#xff0c;灵活性差。 using System; using System.Runtime.InteropServices; using System.Diagnostics; using System.Windows.Forms; using Microsoft.Win32;namespace MyHookClass {/// <summary>/// 类一/// </su…...

基层组织建设部 网站/什么是互联网销售

html网页的主体标签是&#xff1a;body标签。body标签是一个网页的身体部分&#xff0c;用于定义网页的主体内容&#xff0c;是一个HTML文档中必须的部分。body元素中包含文档的所有内容(比如文本、超链接、图像、表格和列表等等)。HTML的主体标记是&#xff0c;在和中放置的是…...

如何使用ftp上传网站/搜索引擎快速优化排名

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、简介二、电机执行器类型1.力控电动电机执行器2.液压执行机构3.系列弹性执行机构三、执行电机设计1.模块化2.电控性能要求3…...

山东网站建设优化技术/无锡seo培训

今天同事给了两个SQL&#xff0c;超级大&#xff0c;一个表8000多万&#xff0c;一个表7800万&#xff0c;原语句如下&#xff1a;[more]update CHANNEL_CHENGDU.o_user_CONS partition(p201011) ASET unuser_flag (SELECT unuser_flagFROM CHANNEL_CHENGDU.o_user partition(…...

wordpress有商城吗/谷歌seo搜索

前言 相信遇到这个问题的小伙伴&#xff0c;一定很无奈&#xff0c;要想知道这个问题的原因&#xff0c;并根治这个问题&#xff0c;需要研究fragment系列的大部分源码。网上很多文章&#xff0c;只是简单描述了这个问题如何出现&#xff08;使用的方法很麻烦&#xff0c;下面…...

深圳网站开发建设/域名解析在线查询

<!--表示容器启动第一个加载该servlet --><load-on-startup>1</load-on-startup></servlet><!--全路径 /service/*.do 请求必须以/service开头 并且以.do结尾后缀型路径: *.do 要求以.do结尾的请求前缀型路径: /service/* 拦截以service开…...

建站的平台/seo服务外包客服

API技巧集&#xff08;一&#xff09; 一、拖动无标题窗体&#xff1a; 包含头文件&#xff1a; #include $#60;winuser.h$#62; 在窗体或组件的 OnMouseDown 事件中加入以下代码: if(Button mbLeft) { ReleaseCapture(); SendMessage( Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0…...