分成两步来判断: 判断线段的两个端点是否在矩形内,如果两个端点至少有一个在矩形内,说明线段与矩形相交。 如果两个端点都不在矩形内,那么需要再判断线段是否与矩形的对角线是否相交。...那么关键就在于两个子算法:判断点在矩形内和判断线段相交。判断点在矩形内非常简单,就是比较点是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。 2....line1.startPoint + line1.direction * t1; //这样计算得到的Z值是不准确的 return true; } //线段与矩形相交
中断控制器 8259A 执行如下操作: 监视中断线,检查产生的中断请求(IRQ)信号。 如果在中断线上产生了一个中断请求信号。 把接受到的 IRQ 信号转换成一个对应的向量。...当某个异常被响应后,CPU 清除 eflag 的中 IF 位,禁止任何可屏蔽中断。 Intel x86 处理器发布了大约 20 种异常(具体数字与处理器模式有关)。...中断请求队列的初始化: 让每个中断源都必须占用一条中断线是不现实的,在 Linux 设计中,专门为每个中断请求 IRQ 设置了一个队列,这就是我们所说的中断 请求队列。...中断线是中断请求的一种物理描述 中断线逻辑上对应一个中断请求号(或简称中断号) 第 n 个中断号(IRQn)的缺省中断向量是 n+32。...与堆栈有关的常量、数据结构及宏: 常量 存放在栈中的寄存器结构 pt_regs 保存现场的宏 SAVE_ALL 恢复现场的宏 RESTORE_ALL 将当前进程的 task_struct 结构的地址放在寄存器中
这篇文章以按键为例子讲解linux的中断原理,中断的架构,中断的实现。 在我们的开发中,检测按键是否触发,无非就两种方法—轮询和中断。作者认为两种方法最大的区别就是CPU的利用率。...dev:与request_irq的参数dev必须一致,将request_irq指定的dev传递给这个参数; Linux中断处理分析: 第一种方式:应用层的读,不管什么情况下,都会返回。...其中:IRQ_EINT0:按键对应引脚的中断号。与加载的中断号一致。...&pins_desc[0]:用于共享中断线,与加载时保持一致 static int button_close(struct inode *inode, struct file *file) { free_irq...其中函数参数:irq:中断对应的中断号。 Dev_id:与请求中断函数的第五个参数保持一致。 通过wake_up_interruptible()函数实现等待队列的唤醒。
中断线程化 标准内核中,中断具有最高优先级,可以无条件抢占当前任务,而且中断来临的时机以及执行的时间长短都是未知的,这样就会影响系统线程的执行时间,使得系统的处理增加了不确定因素,导致无法满足实时性的要求...中断线程化流程的分析 下面将对中断线程化进行简要分析。...在初始化阶段,中断线程化的中断初始化与常规中断初始化大体上相同,在 start_kernel() 函数中都调用了 trap_init() 和 init_IRQ() 两个函数来初始化 irq_desc_t...结构体,不同点主要体现在内核初始化创建 init 线程时,中断线程化的中断在 init() 函数中还将调用 init_hardirqs(kernel/irq/manage.c(已经打过上文提到的补丁)...) curr_irq_prio = param.sched_priority - 1; …… } 如果某个中断号状态位中的 IRQ_NODELAY 被置位,那么该中断不能被线程化。
很多人在学习中断子系统的过程中,在对基本概念与整体不太了解的情况下,过早的陷入了各种架构的实现细节,如同盲人摸象。这里主要给大家明确中断的各个基本概念,希望从这个角度能让大家更好的理解中断子系统。...另一方面,考虑到系统中可能存在多个中断控制器,使得单一中断控制器的中断号不足以区分中断事件,所以引入了软件中断号的概念。...驱动程序 API 与中断通用逻辑 对于中断事件本身,内核使用 struct irq_desc 进行描述,它包含着所有的信息。而对于中断控制器与中断源的驱动来说,关注的信息都只是其中的一部分。...中断源驱动获取到 irq,还需要将 irq 与中断处理函数建立映射: request_irq/request_threaded_irq:驱动将中断处理函数注册到 irq。...armv8 arm 核心拥有 2 个外部中断线,IRQ 和 FIQ;这两根中断线连接到中断控制器上,中断控制器通过拉高和拉低这两根中断线触发中断。
RT PATCH + Linux 为了RT 线程能实时的抢占从而保证系统的实时性,RT patch 主要做了如下工作, 中断线程化,内核中处理中断下半段的函数,几乎都使用内核线程执行中断处理函数。...中断线程化 中断线程化是使用内核线程执行中断处理函数,内核线程的名称是“irq/irq>-”(irq>是Linux中断号,是设备名称),调度策略是SCHED_FIFO...在实时内核中,软中断由软中断线程执行,或者在进程开启软中断的时候执行。中断处理程序的后半部分唤醒当前处理器上的软中断线程....在非实时内核中,rwlock和raw_rwlock完全相同。 选择rwlock和raw_rwlock的原则,与选择spinlock和raw_spinlock的原则相同。...业界使用 三星与特斯拉合作发布了一组23个补丁,用于使特斯拉的完全自动驾驶(FSD)SoC适用于主线Linux内核。
4.中断线程化 中断线程化是使用内核线程执行中断处理函数,内核线程的名称是“irq/irq>-”(irq>是Linux中断号,是设备名称),调度策略是SCHED_FIFO...在实时内核中,软中断由软中断线程执行,或者在进程开启软中断的时候执行。中断处理程序的后半部分唤醒当前处理器上的软中断线程,代码如下。...在实时内核中,软中断全部由软中断线程执行,RCU-bh保护的读端临界区是可以抢占的,只需和当前处理器上的软中断线程互斥。函数rcu_read_lock_bh()的代码如下。...在非实时内核中,rwlock和raw_rwlock完全相同。 选择rwlock和raw_rwlock的原则,与选择spinlock和raw_spinlock的原则相同。...https://mp.weixin.qq.com/s/U9okzKGuhKlSZyeKmI4Q4g (10)Linux硬实时和Preempt-RT补丁(中断、软中断、调度、内存与调试),https://
初步分析 看了下cpu占用率,除了主应用之外,有一个名为irq/38-twi0的进程引起了我们的注意,因为它竟然占据了10%的cpu。 这个irq开头的进程是做什么的呢?...中断线程化回顾 让我们来回顾下中断线程化的知识。 在Linux上,中断的优先级比进程高,一旦中断过来普通进程实时进程通通都要让路,让CPU先运行对应的中断处理程序,这就会对实时性造成很大的影响。...中断线程化之后,中断来了虽然还是会打断实时进程,但所执行的操作只是唤醒中断线程,原本的中断服务程序被放到了一个内核线程中,延迟执行。...中断线程化的机制虽好,也要分情况来使用,不然反而会造成系统的巨大负担。 代码改动是在request_irq时,传入IRQF_NO_THREAD标志,即可避免这个中断被线程化。...本文地址:https://www.cnblogs.com/zqb-all/p/12229990.html 公众号:https://sourl.cn/SSP3Rq
通过以上优化策略,可以使得Django中的WebSocket实现更加高效和稳定。WebSocket断线重连在实际应用中,WebSocket连接可能会由于网络问题或服务器问题而断开。...为了提高应用的健壮性,我们可以实现WebSocket的断线重连机制。...实时消息处理与缓存优化在实时应用中,消息的处理和存储是至关重要的。在Django中,我们可以结合缓存技术来优化消息处理的性能。...优化策略包括断线重连、WebSocket认证、实时消息处理与缓存优化以及数据库优化。...这种方法更加灵活,可以更好地与Django的其他部分集成。无论选择哪种方法,都可以在Django应用中轻松实现WebSocket,为用户提供更好的实时通信体验。
#号(占位符) 在MyBatis中使用#号会将相应参数做为占位符形式如: select * from user where name = #{name} and age >= #{age}; 会转为占位符形式...; #号的功能非常强大,如果有自定义类型需要调整,如将java中自定义的枚举类型转换为数据库中的数字时,只需要自定义一个typeHandler,在参数中指定就可以。...$号(字符串替换) 在MyBatis参数语法中$符号表示字符串替换,也可以理解为是模板替换。
在linux中可以通过/proc/interrupts查看当前系统中所有中断的统计信息,在/proc/irq/xxx(中断号)下面,可以看到该中断的详细信息。...典型的场景是使用两个8259A级联,理论最多16个中断号(就是ISA IRQs),实际能提供对15个中断线的处理(master的IRQ2用于连接slave),其具体的分配见下图。...针对X86中断控制器硬件和linux对这些硬件的初始化,在《interrupt in linux》中有很详细的描述。...irq号的),该irq在该中断的生命周期内都不会改变,且和该中断的中断处理函数关联;内核使用一个bitmap allocated_irqs来标识当前系统已经分配的irq;irq号的管理与底层中断设备和配置无关...2、这里没有分配vector,是因为这里使用的irq号范围为0-16,是ISA IRQs,其与vector的对应关系简单:vector = IRQ0_VECTOR + irq,并在系统初始化过程中,已经通过
支持的软中断类型,可以认为是软中断号, 其中从上到下优先级递减。...[],通过软中断号可以找到对应的 handler 进行处理。...每个CPU维护 irq_cpustat_t 状态结构,当某个软中断需要进行处理时,会将该结构体中的 __softirq_pending 字段或上 1UL << XXX_SOFTIRQ。...DEFINE_PER_CPU(struct task_struct *, ksoftirqd); 注册软中断 中断处理流程中设备驱动通过request_irq/request_threaded_irq...什么是中断线程化处理?上面我们讲到 Linux 内核会为每个 CPU 都创建一个内核线程 ksoftirqd,当需要中断线程化处理的时候,会通过 wakeup_softirqd 唤醒内核线程来执行。
注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...我们把与中断控制器相连的每条线叫做中断线,要使用中断线,就得进行中断线的申请,就是IRQ(Interrupt ReQuirement ),我们也常把申请一条中断线称为申请一个IRQ 或者是申请一个中断号...IRQ 线是从0 开始顺序编号的,因此,第一条IRQ线通常表示成IRQ0。IRQn 的缺省向量是 n+32;如前所述,IRQ 和向量之间的映射可以通过中断控制器端口来修改。 ?...Linux 内核在系统的初始化阶段要进行大量的初始化工作,其与中断相关的工作有:初始化可编程控制器8259A;将中断向量IDT 表的起始地址装入IDTR 寄存器,并初始化表中的每一项。...• 分两步进行有效性检查:首先是“段”级检查,将CPU 的当前特权级CPL(存放在CS寄存器的最低两位)与IDT 中第 i 项中的段选择符中的RPL 相比较,如果RPL(3)大于CPL(0),就产生一个
1 -> connect的断线重连 客户端会面临服务器崩溃的情况,我们可以试着写一个客户端重连的代码,模拟并理解一些客户端行为,比如游戏客户端等。
Linux的开放性和低成本是实时Linux发展的优势,越来越多的研究机构和商业团体开展了实时Linux的研究与开发,其中最著名的就是FSMLab的Rtlinux和TimeSys Linux。...二、中断线程化 中断线程化是实现Linux实时性的一个重要步骤,在Linux标准内核中,中断是最高优先级的执行单元,不管内核当时处理什么,只要有中断事件,系统将立即响应该事件并执行相应的中断处理代码,除非当时中断关闭...在Ingo Molnar的实时补丁中,中断线程化的实现方法是: 对于IRQ,在内核初始化阶段init(该函数在内核源码树的文件init/main.c中定义)调用init_hardirqs(该函数在内核源码树的文件...中,名称为__do_IRQ。...,但是对一些架构,这种方法缺乏灵活性,尤其是一些架构中断处理比较特别时,可能会是IRQ子系统的中断线程化代码部分变的越来越丑陋,因此对于这种架构,后一种方法就有明显优势,当然在后一种方法中仍然可以拷贝IRQ
这几张图比较清晰地描述了在Linux操作系统中,关于中断的一些基本概念。 这张图的结构还是比较清晰的,基本上概括了Linux系统中的中断分类。...中断号和中断向量 这张图只要记住中断号与中断向量的关系就可以了: 中断号与中断控制器(PIC/APIC)相关; 中断向量与 CPU 相关,用来查找中断处理函数的入口地址; 中断服务例程 ISR 中断服务程序...驱动程序可以通过函数 request_irq(),向操作系统注册,并且激活指定的中断线: int request_irq(unsigned int irq, irq_handler_t...与往常一样,操作的目录位于:tmp/linux-4.15/drivers 目录下。...向驱动程序传参 示例代码中,在调用 request_irq 时,需要指定中断号和驱动程序的名称。 这两个参数是在加载驱动模块的时候,从命令行传入的。
一、简介 Ingo Molnar 的实时补丁是完全开源的,它采用的实时实现技术完全类似于Timesys Linux,而且中断线程化的代码是基于TimeSys Linux的中断线程化代码的。...二、中断线程化 中断线程化是实现Linux实时性的一个重要步骤,在Linux标准内核中,中断是最高优先级的执行单元,不管内核当时处理什么,只要有中断事件,系统将立即响应该事件并执行相应的中断处理代码,除非当时中断关闭...在Ingo Molnar的实时补丁中,中断线程化的实现方法是: 对于IRQ,在内核初始化阶段init(该函数在内核源码树的文件init/main.c中定义)调用init_hardirqs(该函数在内核源码树的文件...标准linux内核就是这么做的,中断线程化之后,中断失效就没有必要,因为遇到这种状况后,中断线程将挂在等待队列上并放弃CPU让别的线程或进程来运行。...,但是对一些架构,这种方法缺乏灵活性,尤其是一些架构中断处理比较特别时,可能会是IRQ子系统的中断线程化代码部分变的越来越丑陋,因此对于这种架构,后一种方法就有明显优势,当然在后一种方法中仍然可以拷贝IRQ
:使能/禁止电源管理中的唤醒功能 irq_bus_lock:慢速芯片总线上的锁 irq_bus_sync_unlock:同步释放慢速总线芯片的锁 struct irq_domain 与中断控制器对应,完成硬件中断号...irq_domain 的匹配 map:用于硬件中断号与 Linux 中断号的映射 xlate:通过 device_node,解析硬件中断号和触发方式 struct irqaction 主要是用来存设备驱动注册的中断处理函数...,私有中断入口为 handle_percpu_devid_irq 最后,我们可以通过 /proc/interrupts 下的值来看下它们的关系: 现在,我们已经知道内核为硬件中断号与 Linux 中断号做了映射...0x00040000 //与NO_SUSPEND的用户共享中断时,执行本设备的中断处理函数 创建完成后,通过 ps 命令可以查看系统中的中断线程,注意这些线程是实时线程 SCHED_FIFO...ret; } 进入中断上下文 根据 hwirq 去查找 linux 中断号 通过中断号找到全局中断描述符数组 irq_desc[NR_IRQS] 中的一项,然后调用 generic_handle_irq_desc
在执行中断处理程序时,本条中断线上的中断是否会被屏蔽? 3. 如果该条中断线被屏蔽了,那么是否一直要到该中断返回(即执行iter指令)时才开启? 4. 禁止中断后,异常还会执行吗?...当一个中断服务结束后,CPU可利用中断结束命令EOI通知8259A,以便复位ISR中的相应位。因此当调用handle_IRQ_event()时,即使开中断,该条中断线的中断也是关闭的。...如果在desc->handler->ack(irq);和desc->handler->end(irq);之间,该条中断线上再次发生中断,该中断是否会被丢失? 2. ...在do_IRQ()中,将会调用irq_enter()()和irq_exit()两个函数。... 《Linux内核源代码情景分析》 浙江大学出版社,2001 [4] Robert Love 《Linux内核设计与实现》 机械工业出版社 ,2004
中断线程(threaded_irq) 前面讲的硬中断,它是外设中断处理中必不可少的一部分。...我们这节先讲中断线程,其接口如下: /include/linux/interrupt.h extern int __must_check request_threaded_irq(unsigned int...其中handler是硬中断,是处理与硬件密切相关的事物。其处理完成后,可以把接收到的数据、要继续处理的事情放到某个位置,然后返回是否需要唤醒对应的中断线程。...linux中断线程化(threaded irq)和工作队列(work queue)的异同 两者差异: 1、调度优先级不同: threaded irq handler所在的进程(内核线程),调度类别是SCHED_FIFO...机制分析与应用 threaded irq的引入 我们知道,工作队列可以用来处理中断的一些耗时的事情,但是他又一个缺点,就是如果有多个事件同时放入工作队列中,如果前面的事件处理得太久,那么就会影响到后面的事件的执行
领取专属 10元无门槛券
手把手带您无忧上云