Linux内核-中断知识汇总(重温)

2023-10-27

1. 概述

中断控制是计算机发展中一种重要的技术。最初它是为克服对I/O接口控制采用程序查询所带来的处理器低效率而产生的。中断控制的主要优点是只有在I/O需要服务时才能得到处理器的响应,而不需要处理器不断地进行查询。由此,最初的中断全部是对外部设备而言的,即称为外部中断(或硬件中断)。
  但随着计算机系统结构的不断改进以及应用技术的日益提高,中断的适用范围也随之扩大,出现了所谓的内部中断(或叫异常),它是为解决机器运行时所出现的某些随机事件及编程方便而出现的。因而形成了一个完整的中断系统。

如上图,当一个I/O设备完成它的工作后,它就会产生一个中断, 它通过在总线上声明已分配的信号来实现此目的。主板上的中断控制器芯片会检测到这个信号,然后执行中断操作。

如果在中断前没有其他中断操作阻塞的话,中断控制器将立刻对中断进行处理,如果在中断前还有其他中断操作正在执行,或者有其他设备发出级别更高的中断信号的话,那么这个设备将暂时不处理。在这种情况下,该设备会继续在总线上置起中断信号,直到得到CPU服务。

2. ARM架构中断知识

 补充部分ARM架构中断知识。

2.1 GIC版本

GIC: Generic Interrupt Controller(通用的中断控制器)

  • gic400,支持gicv2架构版本。
  • gic500,支持gicv3架构版本。
  • gic600,支持gicv3架构版本。
  • gic700,  支持gicv4.1架构版本。

2.2 GIC Model

 

 GIC是一个为Cortex-A和Arm Cortex-R设计的标准的中断控制器

2.2.1 GICV3/GICV4的四大组件

  • Distributor
  • Redistributor
  • CPU insterface
  • Interrupt Translation Service

2.2.2 GIC四种类型中断:

  • SGI  软件产生中断(Software-generated interrupts)
  • PPI  私有中断(Private Peripheral interrupts)
  • SPI  共享中断(Share Peripheral interrupts)
  • LPI  区域特定中断(Locality-specific Peripheral Interrupts)

 参考文章:【笔记】Arm CoreLink Generic Interrupt Controller v3 and v4 Overview_伯春岱的博客-CSDN博客

3. Linux内核中断

3.1 中断向量表

代码跟踪:

android/kernel/msm-5.4/arch/arm64/kernel/head.S

android/kernel/msm-5.4/arch/arm64/kernel/entry.S

  • 如果发生异常后并没有exception level切换,并且发生异常之前使用的栈指针是SP_EL0,那么使用第一组异常向量表。
  • 如果发生异常后并没有exception level切换,并且发生异常之前使用的栈指针是SP_EL1/2/3,那么使用第二组异常向量表。
  • 如果发生异常导致了exception level切换,并且发生异常之前的exception level运行在AARCH64模式,那么使用第三组异常向量表。
  • 如果发生异常导致了exception level切换,并且发生异常之前的exception level运行在AARCH32模式,那么使用第四组异常向量表

3.2 中断处理流程

除了响应系统调用外,内核也要响应设备的 服务请求,这称为中断,它会中断当前的执行,如下图所示:

 中断处理

 接收到设备中断响应后,内核处理针对该中断处理流程如下:

3.3 中断申请流程

  TODO

4. 中断上下文

  TODO

5. 中断在驱动中的应用

    TODO

5.1 应用场景

          TODO

5.2 使用流程

中断服务/处理程序,需要通过申请/注册来处理设备中断。这类程序的设计要点是需要运行得进可能快,以减少对活动线程中断的影响。如果中断要做的工作不少,尤其是还可能被锁阻塞,那么最好用中断线程来处理(如:request_threaded_irq),有内核来调度。

 

5.2.1 配置中断IO

  TODO

5.2.2  request_threaded_irq 与 request_irq的使用区别

如下文件:include/linux/interrupt.h 摘取

extern int __must_check
request_threaded_irq(unsigned int irq, irq_handler_t handler,
		     irq_handler_t thread_fn,
		     unsigned long flags, const char *name, void *dev);

static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
	    const char *name, void *dev)
{
	return request_threaded_irq(irq, handler, NULL, flags, name, dev);
}

request_irq与 request_threaded_irq非常类似,request_irq在request_threaded_irq基础上进行了封装,将参数thread_fn可以置为NULL。handler是在发生中断时首先要执行的程序,类似中断处理上文,执行处理费时下文可以增加tasklet或者工作队列实现。thread_fn是要在线程里执行的handler类似中断处理下文。IRQF_ONESHOT用来标明是在中断线程thread_fn执行完后在重新打开该中断。

handler 与 thread_fn的处理差异涉及工作队列与线程处理差异:

编号 差异 详情
1 调度优先级不同 threaded irq handler所在的进程(内核线程),调度类别是SCHED_FIFO,是实时内核线程。
workqueue所依赖的线程池创建的kworker线程调度类别是SCHED_NORMAL,是普通内核线程。
2 多核并发效率不同 workqueue机制是内核启动时会为每个CPU创建几个不同优先级的kworker(worker_thread)内核线程,用以集中处理各种中断的下半部的work。所以多个不同设备中断的work都会由同一个kworker线程来处理(一个CPU处理)。
threaded irq,为每一个中断都创建一个内核线程;多个中断的内核线程可以分配到多个CPU上执行。
所以workqueue机制在多CPU系统中并发效率不如threaded irq。

request_threaded_irq:将中断处理线程化,将上下文缩短为kernel thread 执行后续中断任务,运用调度机制减少延时,提高中断响应,提高处理效率。(在负载较大/系统占用资源高时效果明显,避免了中断丢失情况)。

request_irq:类似于同步处理事务,适合非高频率中断响应,在负载较大/系统占用资源高时会出现处理任务丢失现象。(不具备高可用特性)。

5.2.3 devm_request_threaded_irq/request_threaded_irq 申请中断:

/**
 *	devm_request_threaded_irq - allocate an interrupt line for a managed device
 *	@dev: device to request interrupt for
 *	@irq: Interrupt line to allocate
 *	@handler: Function to be called when the IRQ occurs
 *	@thread_fn: function to be called in a threaded interrupt context. NULL
 *		    for devices which handle everything in @handler
 *	@irqflags: Interrupt type flags
 *	@devname: An ascii name for the claiming device, dev_name(dev) if NULL
 *	@dev_id: A cookie passed back to the handler function
 *
 *	Except for the extra @dev argument, this function takes the
 *	same arguments and performs the same function as
 *	request_threaded_irq().  IRQs requested with this function will be
 *	automatically freed on driver detach.
 *
 *	If an IRQ allocated with this function needs to be freed
 *	separately, devm_free_irq() must be used.
 */
int devm_request_threaded_irq(struct device *dev, unsigned int irq,
			      irq_handler_t handler, irq_handler_t thread_fn,
			      unsigned long irqflags, const char *devname,
			      void *dev_id)
{
	struct irq_devres *dr;
	int rc;

	dr = devres_alloc(devm_irq_release, sizeof(struct irq_devres),
			  GFP_KERNEL);
	if (!dr)
		return -ENOMEM;

	if (!devname)
		devname = dev_name(dev);

	rc = request_threaded_irq(irq, handler, thread_fn, irqflags, devname,
				  dev_id);
	if (rc) {
		devres_free(dr);
		return rc;
	}

	dr->irq = irq;
	dr->dev_id = dev_id;
	devres_add(dev, dr);

	return 0;
}
EXPORT_SYMBOL(devm_request_threaded_irq);
  •   如果只使用中断线程,则参数 handler 可以置为NULL,这时IRQF_ONESHOT标识不可少。IRQF_ONESHOT的作用是保证thread_fn函数执行完整,才会接受下一个中断信号。如果不设置该位,在高低电平触发中断情况下,永远没有机会处理线程thread_fn。
  •   如果只使用中断work,则参数thread_fn可以置为NULL

例1:

	error = devm_request_threaded_irq(&client->dev, client->irq,
					  NULL, mxt_interrupt, IRQF_ONESHOT,
					  client->name, data);
	if (error) {
		dev_err(&client->dev, "Failed to register interrupt\n");
		goto err_disable_regulator;
	}

	disable_irq(client->irq);

例2:

ts_data->irq = gpio_to_irq(pdata->irq_gpio);
pdata->irq_gpio_flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
ret = request_threaded_irq(ts_data->irq, NULL, fts_irq_handler,
			pdata->irq_gpio_flags,
			FTS_DRIVER_NAME, ts_data);

摘录://中断标志位

/*
 * These correspond to the IORESOURCE_IRQ_* defines in
 * linux/ioport.h to select the interrupt line behaviour.  When
 * requesting an interrupt without specifying a IRQF_TRIGGER, the
 * setting should be assumed to be "as already configured", which
 * may be as per machine or firmware initialisation.
 */
#define IRQF_TRIGGER_NONE	0x00000000
#define IRQF_TRIGGER_RISING	0x00000001
#define IRQF_TRIGGER_FALLING	0x00000002
#define IRQF_TRIGGER_HIGH	0x00000004
#define IRQF_TRIGGER_LOW	0x00000008
#define IRQF_TRIGGER_MASK	(IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
				 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
#define IRQF_TRIGGER_PROBE	0x00000010

/*
 * These flags used only by the kernel as part of the
 * irq handling routines.
 *
 * IRQF_SHARED - allow sharing the irq among several devices
 * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
 * IRQF_TIMER - Flag to mark this interrupt as timer interrupt
 * IRQF_PERCPU - Interrupt is per cpu
 * IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing
 * IRQF_IRQPOLL - Interrupt is used for polling (only the interrupt that is
 *                registered first in a shared interrupt is considered for
 *                performance reasons)
 * IRQF_ONESHOT - Interrupt is not reenabled after the hardirq handler finished.
 *                Used by threaded interrupts which need to keep the
 *                irq line disabled until the threaded handler has been run.
 * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend.  Does not guarantee
 *                   that this interrupt will wake the system from a suspended
 *                   state.  See Documentation/power/suspend-and-interrupts.rst
 * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
 * IRQF_NO_THREAD - Interrupt cannot be threaded
 * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
 *                resume time.
 * IRQF_COND_SUSPEND - If the IRQ is shared with a NO_SUSPEND user, execute this
 *                interrupt handler after suspending interrupts. For system
 *                wakeup devices users need to implement wakeup detection in
 *                their interrupt handlers.
 */
#define IRQF_SHARED		0x00000080
#define IRQF_PROBE_SHARED	0x00000100
#define __IRQF_TIMER		0x00000200
#define IRQF_PERCPU		0x00000400
#define IRQF_NOBALANCING	0x00000800
#define IRQF_IRQPOLL		0x00001000
#define IRQF_ONESHOT		0x00002000
#define IRQF_NO_SUSPEND		0x00004000
#define IRQF_FORCE_RESUME	0x00008000
#define IRQF_NO_THREAD		0x00010000
#define IRQF_EARLY_RESUME	0x00020000
#define IRQF_COND_SUSPEND	0x00040000

5.2.4  request_irq申请中断 

接口: 

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)

例:

ret = request_irq(irq->irq, emac_isr, 0, "emac-core0", irq);
if (ret) {
	netdev_err(adpt->netdev, "could not request emac-core0 irq\n");
	return ret;
}

 中断处理程序 

static irqreturn_t emac_isr(int _irq, void *data)
{
	struct emac_irq *irq = data;
	struct emac_adapter *adpt =
		container_of(irq, struct emac_adapter, irq);
	struct emac_rx_queue *rx_q = &adpt->rx_q;
	u32 isr, status;

	/* disable the interrupt */
	writel(0, adpt->base + EMAC_INT_MASK);

	isr = readl_relaxed(adpt->base + EMAC_INT_STATUS);

	status = isr & irq->mask;
	if (status == 0)
		goto exit;

	if (status & ISR_ERROR) {
		net_err_ratelimited("%s: error interrupt 0x%lx\n",
				    adpt->netdev->name, status & ISR_ERROR);
		/* reset MAC */
		schedule_work(&adpt->work_thread);
	}

	/* Schedule the napi for receive queue with interrupt
	 * status bit set
	 */
	if (status & rx_q->intr) {
		if (napi_schedule_prep(&rx_q->napi)) {
			irq->mask &= ~rx_q->intr;
			__napi_schedule(&rx_q->napi);
		}
	}

	if (status & TX_PKT_INT)
		emac_mac_tx_process(adpt, &adpt->tx_q);

	if (status & ISR_OVER)
		net_warn_ratelimited("%s: TX/RX overflow interrupt\n",
				     adpt->netdev->name);

exit:
	/* enable the interrupt */
	writel(irq->mask, adpt->base + EMAC_INT_MASK);

	return IRQ_HANDLED;
}

5.2.5  中断处理程序

设备驱动分为两半,上半部用于快速处理中断,到下半部的调度工作在之后处理。上半部快速处理中断很重要,因为上半部运行在中断禁止模式(irq_disable mode),会推迟新的中断产生,如果运行的时间太长,就会造成延时问题。下半部可以作为tasklet或者动作队列,之后由内核线程调度。

注:mutex_lock互斥锁是不能在中断处理中使用,互斥锁是休眠锁,应用在多进程/多线程同步操作。

5.2.6 中断返回值:

/**
 * enum irqreturn
 * @IRQ_NONE        interrupt was not from this device or was not handled
 * @IRQ_HANDLED        interrupt was handled by this device
 * @IRQ_WAKE_THREAD    handler requests to wake the handler thread
 */
enum irqreturn {
    IRQ_NONE        = (0 << 0),
    IRQ_HANDLED        = (1 << 0),
    IRQ_WAKE_THREAD        = (1 << 1),
}; 

 IRQ_HANDLED: 正确收到设备中断,并处理

 IRQ_NONE:中断不是来自此设备或未处理

 5.3 特殊关注点

      TODO

    

6. 总结

      TODO

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核-中断知识汇总(重温) 的相关文章

  • linux用户态使用gpio中断方法

    一 用户空间gpio的调用文件 用户空间访问gpio 即通过sysfs接口访问gpio 下面是 sys class gpio目录下的三种文件 export unexport文件 gpioN指代具体的gpio引脚 gpio chipN指代gp
  • 单片机:按键(使用中断)控制数码管的数字加减(c语言实现)

    本实验的目的 使用中断实现通过编号为8和C的按键控制数码管数字的加减 加至15之后再循环到0 减到0之后保持0不变 include
  • linux内核中断(一)

    一 中断简介 中断是指 CPU 在执行程序的过程中 出现了某些突发事件急待处理 CPU 必须暂停当前程序的执行 转去处理突发事件 处理完毕后又返回原程序被中断的位置继续执行 由于中断的存在极大的提高了 CPU 的运行效率 但是设备的中断会打
  • Linux内核-中断知识汇总(重温)

    1 概述 中断控制是计算机发展中一种重要的技术 最初它是为克服对I O接口控制采用程序查询所带来的处理器低效率而产生的 中断控制的主要优点是只有在I O需要服务时才能得到处理器的响应 而不需要处理器不断地进行查询 由此 最初的中断全部是对外
  • linux中断实验

    文章目录 一 linux中断简介 1 linux中断API函数 1 中断号 2 request irq函数 3 free irq 4 中断处理函数 5 中断使能与禁止函数 2 上半部与下半部 1 软中断 2 tasklet 3 工作队列 3
  • FreeRTOS入门(05):事件组

    文章目录 目的 基础说明 相关函数 使用演示 总结 目的 事件组是RTOS中相对常用的用于任务间交互的功能 这篇文章将对相关内容做个介绍 本文代码测试环境见前面的文章 FreeRTOS入门 01 基础说明与使用演示 基础说明 事件组 Eve
  • Linux中断原理、上半部和下半部、硬中断和软中断

    目录 1 中断简介 1 1 作用 1 2 物理实现 1 3 中断请求线IRQ 1 4 异常 2 中断处理程序 2 1 作用 2 2 上半部和下半部 2 3 中断上下文 3 中断系统 3 1 中断机制的实现 3 2 中断控制 4 下半部和软中
  • 15、STM32 中断应用概览

    15 STM32 中断应用概览 文章目录 15 STM32 中断应用概览 1 异常类型 2 NVIC 简介 2 1 NVIC寄存器简介 2 2 NVIC 中断配置固件库 3 优先级的定义 3 1 优先级定义 3 2 优先级分组 4 中断编程
  • 5.3中断系统中的设备树——中断号的演变与irq_domain

    通过上一节我们知道 在内核中有一个irq desc数组 数组里面的每一项对应一个中断 数组的下标就是对应中断的虚拟中断号 virq 假设只有一个中断控制器 有32个中断 那么中断和irq desc数组可以一一对应 每一个数组项对应一个中断
  • Android/Linux EAS优化-schedtune

    Linux cgroups机制中的cpu cpuset schedtune子系统 跟linux android进程调度策略有关 记录下各项功能参数的用法 SchedTune SchedTune是一项与CPU调频相关的性能提升技术 它实现为一
  • mini2440按键中断

    ARM中断控制系统 按键驱动程序设计 一 Arm中断控制系统 1 查询方式 程序不断地查询设备的状态 并做出相应的反应 该方式实现比较简单 常用在比较单一的系统中 比如 一个温控系统中可以实用查询的方式不断检测温度变化 特点 实现简单 但C
  • 51单片机中断系统的原理和运用

    QX MCS51开发板上使用的是DIP封装 双列直插式 有40只引脚 40只引脚按其功能来分 有三类 一 电源和时钟引脚 Vcc Vss XTAL1 XTAL2 电源引脚接入单片机工作电源 Vcc 40脚 接 5V电源 Vss 20脚 接地
  • linux内核的自旋锁spin_lock和互斥锁mutex_lock

    访问共享资源的代码区域称作临界区 自旋锁 spin lock 和互斥锁 mutex lock 是保护内核临界区的两种基本机制 我们逐个分析 自旋锁可以确保在同时只有一个线程进入临界区 其他想进入临界区的线程必须不停地原地打转 直到第1个线程
  • 快速查找Unity死循环

    我们先建立一个新工程 新建C 文件 然后在Start函数中加入以下代码 void Start while true int i 1 把这个C 文件挂到场景摄像机或其它GameObject上 打开这个工程对应的VS工程 如何用VS编辑unit
  • 【学习记录】STM32利用定时器中断实现定时闪烁指示灯

    任务 定时闪烁指示灯 任务目标 掌握 CubeMX 软件配置定时器实现定时功能的方法 任务内容 控制开发板上的指示灯LED每隔1s闪烁 任务实现 使用的STM32芯片是STM32F407ZET6 第一步 设置高速时钟 设置LED 第二步 配
  • 嵌入式中锁机制杂谈

    在之前的文章中有提到操作系统中锁机制一般依赖于硬件CPU提供的原子数据操作指令 如SWP TEST AND SET等原子原语实现 基于此 才能真正保证锁机制的有效实现 通过上面原子操作 我们比较容易实现所谓的自旋操作 原子性的原地循环判断条
  • Linux内核中断之获取中断号

    目录 一 调用流程 二 应用举例 1 查找中断号 2 dts配置 3 驱动函数 Linux内核中可使用platform get irq 函数获取dts文件中设置的中断号 函数原型 int platform get irq struct pl
  • 8259初始化命令字(ICW1-ICW4)

    8259A的中断操作功能很强 包括中断的请求 屏蔽 排队 结束 级联以及提供中断类型号和查询等操作 并且其操作的方式又有不同 它既能实现向量中断 又能进行中断查询 它可以用于16位机 也可用于8位机 因此 使用起来感到复杂且不好掌握 为此
  • 51单片机中断详解(上)

    一 中断的概念 中断发生 CPU在处理某一事件A时 发生了另一事件B请求CPU迅速去处理 中断响应和中断服务 CPU暂时中断当前的工作 转去处理事件B 中断返回 待CPU将事件B处理完毕后 再回到原来事件A被中断的地方继续处理事件A 这一过
  • STM32中断标志:先清理后清理的区别

    先上总结 再闲聊爬坑过程 进入中断函数后 先清理中断标志 再执行其它动作 爬坑过程 各种教程中 都只解释中断的机制 使用 但对于中断标志的清理顺序 没多少官方准确的资料 今天在F429的代码里 又遇到问题 进中断后卡死跳不出来 各种排查没发

随机推荐

  • echarts 折现图和柱状图 样式修改 设置折线样式 背景(文末附带完整代码)

    1 设置折线图样式 修改后 背景竖条纹间隔 去掉边框 设置折线和节点颜色 设置数据字体颜色 设置折线样式 设置折线图的背景样式 2 设置柱状图样式 修改后 设置柱子的样式 设置柱状图背景 完整代码 路径配置 require config p
  • postman中,发送接口请求,报错Error: connect ECONNREFUSED 10.10.10.33:1111(未完成)

    1 问题 postman发送接口请求 报错Error connect ECONNREFUSED 10 10 10 33 1111 postman执行接口 用的是ip 端口 接口路径进行访问 图1 拒绝连接 图2 2 解决 在网上找了一个 说
  • 野蛮生长的前端,从杂牌军到正规军

    笔者从事后台研发多年 对前端实在是没有多少发言权 下面就斗胆以门外汉的角度聊聊近来对前端技术的一些见解 也自当整理一下思路 使前端技术如何更好的融入到整个产品研发架构中来 这里的前端语言不仅限于js 还是css html等等 来看一看201
  • Java动态绑定和静态绑定

    Java动态绑定和静态绑定 程序绑定 静态绑定 动态绑定 程序绑定 程序绑定 一个方法的调用与方法所在的类 方法主题 关联起来 即计算机要明确最终执行的方法是谁的方法 对Java来说 绑定分为静态绑定和动态绑定 或者叫做前期绑定和后期绑定
  • bash: scp: 未找到命令 lost connection

    通过ssh免密通道上传备份时报错 bash scp 未找到命令 lost connection 解决 分别查看发送端服务器 接收端服务器 1 查找命令是否存在 whereis scp 不存在就重新安装 yum install openssh
  • PyQt5实现父窗口内点击按钮显示子窗口(窗口嵌套功能)

    摘要 在软件中 常会有点击某个按钮 显示一个新的子界面的需求 本文介绍如何在PyQt5中实现这一功能 主要涉及知识点是 信号与槽函数的自动绑定 程序说明 1 开发环境 win10系统 pycharm2021 python3 7 2 实现功能
  • RGBLCD显示实验————复习到这

    目录 LCD 和eLCDIF 简介 LCD 简介 eLCDIF 接口 硬件原理分析 实验程序编写 编译下载验证 编写Makefile 和链接脚本 编译下载 LCD 液晶屏是常用到的外设 通过LCD 可以显示绚丽的图形 界面等 提高人机交互的
  • 图书管理系统 ——mysql数据库

    java图形化 图书管理系统 使用mysql数据库 此博客是本人一次Java实验课作业 1 管理员操作 能够实现图书的增 删 改 查操作 2 普通注册用户操作 1 借阅图书 借阅成功后 对应图书在馆数量相应减1 2 归还图书 归还成功后 对
  • Flutter 自定义steps(横向步骤条,纵向步骤条)

    近期做flutter开发 实现一个自定义进度条功能 直接上代码 import package flutter material dart import package flutter screenutil flutter screenuti
  • C++之大数相乘

    1 问题描述 两个大数相乘 输入是两个字符串 如 99 99 实现两个数的相乘 返回结果也是一个字符串 结果是 9801 因为是C 所以使用string 输入描述 输入两个字符串 输出描述 输出为一行 2 代码 分析在代码中 include
  • qt学习笔记4:QMainWindow 菜单栏、工具栏、状态栏、铆接部件、

    在创建基类的时候 有三大选择 一个是QWidge 空窗口 另一个就是QMainWindow QMainWindow是一个为用户提供主窗口的类 包含一个菜单栏 多个工具栏 多个链接部件 一个状态栏以及一个中心部件 是许多应用程序的基础 如文本
  • 深度学习实战之车牌识别项目

    车牌识别项目 不经常上线 既然有人想要代码 现在我将它发出来 不过需要你们下载 具体下载方法 我想你们都懂得 https download csdn net download weixin 43648821 11423543 本博客关于深度
  • 为什么MySql喜欢B+树

    目录 怎样的索引的数据结构是好的 什么是二分查找 什么是二分查找树 什么是自平衡二叉树 什么是 B 树 什么是 B 树 1 单点查询 2 插入和删除效率 3 范围查询 MySQL 中的 B 树 总结 参考文献 为什么 MySQL 采用 B
  • filter、map函数的区别

    1 def even num 2 if num 2 0 3 return True 4 return False 5 lis 1 2 3 4 5 6 7 8 9 6 res filter even lis 7 print filter li
  • 华为申请注册盘古大模型商标;京东推出言犀大模型,率先布局产业应用

    7月14日科技新闻早知道 一分钟速览 1 华为申请注册盘古大模型商标 据天眼查 App 显示 7 月 7 日 华为技术有限公司申请注册 华为云盘古 Huawei Cloud Pangu Models 文字及图形商标 国际分类为网站服务 社会
  • 未知的生成错误“因为没有预加载,所以无法解析程序集“System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f1

    搜索System Drawing dll 添加到工程中
  • EVE上传Dynamips、IOL和QEMU镜像

    1 镜像保存目录 opt unetlab addons dynamips Dynamips镜像保存目录 iol IOL镜像保存目录 运行IOU的镜像 qemu QEMU镜像 运行ASAv ISE F5等等镜像 2 上传dynamips镜像
  • 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)

    k近邻算法 kNN 本博客来源于CSDN http blog csdn net niuwei22007 article details 49703719 本博客源代码下载地址 CSDN免费下载 GitHub下载地址 均带有详细注释和测试数据
  • C语言 指针

    1 变量的地址 变量对应内存中的一段存储空间 该段存储空间占用一定的字节数 可能是 1个字节 也可能是 4 或是 8 个字节 用这段存储空间的第一个字节的地址表示变量的地址 即低位字节的地址 变量的地址 可以通过 Reference 引用运
  • Linux内核-中断知识汇总(重温)

    1 概述 中断控制是计算机发展中一种重要的技术 最初它是为克服对I O接口控制采用程序查询所带来的处理器低效率而产生的 中断控制的主要优点是只有在I O需要服务时才能得到处理器的响应 而不需要处理器不断地进行查询 由此 最初的中断全部是对外