众所周知,有两种方法可以避免高载网络中的一些硬件中断的开销,当硬件中断太多时,切换到它们的时间太多.对于性能和选择程序风格的方法非常重要. napi(new api) - - 不使用硬件中断 ,and polls 在某个一定时间段内以太网. Linux内核默认使用中断驱动的模式,并且在传入数据包的流程超过一定阈值时仅切换到轮询模式. http://en.wikipedia.org/wiki/wiki/new_api >定期 检查是否到达即将到来的网络数据包 中断,消除了中断处理的开销. 中断融合 - 使用硬件中断 ,然后禁用中断并启动 poll ,在一定时间段内被终止并激活中断. https://en.wikipedia.org/wiki/wiki/interrupt_coalescing 哪些通常会触发硬件中断的事件是 退缩,要么直到一定数量的工作正在待处理,要么 超时计时器触发. 两种方法都没有大量中断成本 - 这是默认中断驱动模式的优势. 但是第
以下是关于 interrupt 的编程技术问答
我有一个python 2.7程序在循环时运行一个无限的程序,我想整合一个计时器中断. 我要做的是在循环中的某个时刻设置一个计时器,当5秒钟过去时,我希望代码分支到While循环的特定部分. 到目前为止,我一直在做的是以下内容: 在while循环的每次迭代中,我都在检查使用 到达代码中的那一点时已经经过了多少时间 time.clock() ,如果差异超过5,则我的意思是运行代码的一部分 但是,在我评估时间之前,可能会通过7秒,这将是> 5秒,但是当5秒通过 时,我想去那里 另外,我需要以1个以上的计数器(可能达到100个)来工作,但我不希望中断彼此中断.使用计时器也无法正常工作. 我知道这可以使用汇编中的计时器中断可以完成,但是我该如何在Python中执行此操作? 解决方案 如果要处理一个事件,那么最简单的方法是使用signal框架,即 python的标准模块. 但是,如果我们需要一个完整的调度程序,则必须求助于另一个模块:sched. 在这里是
分配给特定中断的过程是什么? 例如,我在RT内核上的FF过程的一部分是: 98 FF 95 135 - [irq/23-ehci_hcd] 96 FF 85 125 - [irq/16-uhci_hcd] 94 FF 85 125 - [irq/20-ehci_hcd] 8 FF 1 41 - [rcu_preempt] 56 FF 99 139 - [irq/8-rtc0] 它是一个中断处理程序吗? 根据这个线程, 如何在Linux Linux内核不会优先考虑APIC中断.但是,如果两个中断同时发生怎么办?处理器如何知道执行什么处理程序,如果在APIC级别上所有中断都是相同的优先级? 在上方的线程链接中,一个人建议编写内核模块获取功能设置APIC中断优先级.这对于RT-Audio处理是有用的,还是仅将计时器和AudioCard中断为更高的优先级会是有用的吗? 解决方案 仅当两个不同的中断正
我正在为Mikeos港口制定一些代码.它用NASM X86 16位组件编写.我正在尝试更改我所拥有的变量,以具有不同的价值.它没有错误编译,但是当我调用OS_PRINT_STRING时,它会打印一些Wierd ASCII字符.这是代码: BITS 16 ORG 32768 %INCLUDE "mikedev.inc" start: mov si, test2 ; give si test 2 value mov [test1], si ; give test 1 si's value mov si, test1 ;now give test1's value to si call os_print_string ; and print test2 db "adsfasdfasdf", 0 test1 db "asdf", 0 我知道,此代码是多余的.我只需要关于
我正在研究一个项目,我需要在TIM中断执行2件代码.其中一个的优先级略高于另一个,并且两个都将在2个不同的计时器上运行(当然不是在同一时间间隔).由于两个计时器与另一个计时器成正比(一个是1kHz,一个是8kHz)都会同时触发. 由于我已经在其他目的使用RTOS中间软件(优先级的线程也低得多),所以我正在考虑创建每个例程的一个线程. 但是,看看CubeMX如何生成代码,我什至想知道这是否可能. 我可以从任何线程中启动/停止这些计时器,但是只有一个hal_tim_periodelapsedCallback,您通常会填充IF语句: if(htim->实例== tim2) 我是否正确地假设,无论计时器是从哪个线程开始的,tim回调将始终发生在RTOS环境的"外部"? ? 如果是这样,什么是实现与我需要的东西的更好策略? 欢呼 解决方案 中断会triger.但是请记住: 如果您想使用任何...fromISR RTOS函数,则其优先级(不是
出于某种原因,当迭代线程列表并中断所有这些时,它们都没有通过InterruptedException执行捕获块. 在以下存储库中: https://github.com/ranisalt/liuthread/liuthread/liuthread 我有两个线程,每个线程都有执行者服务,其中一个人掌握了读者,另一位读作家.作家应每100毫秒产卵,写入缓冲区,然后退出/停止/任何东西都不再写.读者是4个尝试阅读的线程,如果可以的话,他们也应该退出,因此还有其他读者的空间. 我有100个(读者和作家),如果他们不读写或写作,他们等待60秒. 然后,我有一个协调员线程,可以继续测试缓冲区是否为空(并打断作家)或完整(中断读者),因此他们永远不应该等待60年代.缓冲区知道其状态. 问题是,由于某种原因,此片段: for (ThreadAzul azul : threadsAzuis) { azul.interrupt(); } 没有中断线程!我已经使
有人知道TAS的实施吗? 此代码稍后应能够保护从状态的基于多线程的损失中获取和发布之间的代码. typedef volatile long lock_t; void acquire(lock_t* lock){ while(TAS(lock)) ; } void release(lock_t* lock){ *lock = 0; } lock_t REQ_lock = 0; int main(){ acquire(&REQ_lock); //not Atomar Code release(&REQ_lock); } 解决方案 C11标准将原子类型带入语言. 其中是atomic_flag类型,它具有关联的函数atomic_flag_test_and_set 这里是标准: C11工作草案第7.17.8.1节: 概要 #include _Bool atomic_
我想知道为什么给定线程中断.它是由我打断的(我的代码的一部分),其他库还是其他原因? 现在我可以通过 中断线程 Thread.interrupt() 取消未来 Future.cancel(boolean mayInterruptIfRunning) 通过 关闭执行人 ExecutorService.shutdown() or ExecutorService.shutdownNow() 但是,它们都没有给我一个选择的选择(信息为什么执行中断).换句话说,我无法用更详细的消息或原因扔和抓住InterruptedException. 编辑: 基于胶质溶液,我准备了类似的溶液,但是使用可召唤 public class MyCallable implements Callable { private final Callable callable; private volatile Thread thread;
在我看来,一旦线程开始通过System.console().readLine()或System.in.read()读取输入,宇宙中绝对没有办法在功能上中断读取,除了System.exit()或提供输入. interrupt()读取线程无济于事.即使stop()它也无能为力. close() System.in在System.in.read()期间,直到读取完成后通过提供输入才能完成.读取方法不使用任何超时参数,也不会单独使用时间. 是否根本没有办法"解锁"线程,等待永远不会出现的控制台输入? 解决方案 我创建了一个基于此 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.concurrent.Callable; public class ConsoleInputReadTask implements
要求: 当内存位置更改或写入时,我需要生成中断.从ISR中,我可以触发一个蓝色屏幕,该屏幕为我提供了带有方法名称的不错的堆栈跟踪. 方法: 测试计时器ISR中的值.显然,这并不能带来令人满意的结果. 我发现了 bochs"> bochs 虚拟机.它具有基本的内置调试器,可以设置数据断点并停止程序.但是那时我似乎无法产生一个中断. Bochs允许一个人将GDB连接到它.我无法通过GDB支持来构建它. 其他想法: 一种"预览指令"中断,在执行该指令之前会触发每个指令.一组二手的内存写作说明应该非常易于管理,但是我认为提取地址仍然是PITA.我认为没有这种打扰. 一种"预览内存访问"中断.再说一次,我不认为它在那里. 滥用分页.将感兴趣的页面标记为不存在的页面,并在页面故障处理程序中测试地址.人们仍然必须区分读写操作,我认为,页面故障处理程序不知道确切的地址,只是页码. 解决方案 请参阅Intel的软件开发人员手册3a .它提供了有关使用调试寄存器
嗨,我正在编写一个内核,并计划将MSI中断用于PCI设备. 但是,我也对文档感到困惑. 我对MSI的理解如下: 从PCI设备的角度来看: 文档表明我 需要查找Capabillty ID = 0x05以找到3个寄存器:消息控制(MCR),消息地址(MAR)和消息数据(MDR)寄存器 MCR为MSI中断提供控制功能, Mar提供PCI设备的物理地址 中断后会写作 MDR构成将写入物理地址的实际数据 从CPU的角度来看: 文档显示,消息地址寄存器包含0xFee的固定顶部,按目标ID(Lapic ID)和其他控制位按以下方式进行: 消息数据寄存器将包含以下信息,包括中断向量: 阅读了所有这些内容后,我在想APIC_ID是否为0x0H,消息地址是否会与本地APIC内存映射冲突?尽管保留了费用00000〜费用的地址. 此外,MDR中的向量编号确实与IDT矢量号相对应.换句话说,如果我将mar = 0xFee0000c(目的地ID = 0,使
(如何)我可以激活python中的周期性计时器中断?例如,有一个主循环和一个计时器中断,应定期触发: def handler(): # do interrupt stuff def main(): init_timer_interrupt(, ); while True: # do cyclic stuff if __name__ == "__main__": main(); 我尝试了在 解决方案 任何解决方案都会阻止main(),或者如果不是过程,则会产生新线程. 最常用的解决方案是: threading.Timer( t, function).start() 可以递归地使用,一个简单的应用程序是: import threading import time class Counter(): def __init__(self, increment):
我有一个队列,当发生不同的中断时,将调用队列的put和拉功能.在这种情况下,有没有办法防止比赛状况? 虽然我们无法在中断服务例程中等待信号量,这是创建类似功能的最佳方法. 我们使用Zynq FPGA的ARM-Cortex A5处理器来开发代码. 解决方案 假设每个中断会导致处理器的"中断"状态打开,并且假设您正在处理的中断具有相同的优先级(也就是说,不能中断执行其他),那么已经没有种族条件,您的ISR可以访问共享队列. (当发生中断时,处理器进入中断模式,将所有寄存器推到堆栈上,跳到ISR入口点并继续执行此处.一旦完成ISR," IRET"指令将逆转.条目.此简单描述可以在不同的处理器和平台中以不同的方式实现.)
在编写特定地址时可以使X86 CPU中断吗? 我想要一种硬件机制来监视某些地址的更改. 解决方案 我想知道是否有可能在编写特定地址时使X86 CPU中断? 这是可能的. 您将调试寄存器之一(DR0 DR4)设置为要监视的地址,然后在DR7中配置DR7中的相应标志为"全局断点,仅在数据写入中,只需打破数据写入,1 - 字节大小".完成此操作后,该CPU完成的任何正常数据都会触发调试异常(中断1),并且调试异常处理程序可以弄清楚发生了什么并执行您想要的任何操作(例如,向用户报告写入吗?)./p> 但是,有限制 - 您不能在用户空间中自己做这个,需要依靠内核的支持;而且内核的支持将需要包括在任务开关期间保存/还原调试寄存器(这样,当您的任务在另一个CPU上运行时,断点就不会停止工作,以便您的断点不会给其他任务带来问题).因此(除非您完全控制计算机/CPU - 例如,您正在编写自己的内核),通常必须依靠OS提供的任何API. 如果其他修改内存(例如,磁盘控制
我正在寻找一种通话的方法,大约需要20-120秒: final Area image = ... final AffineTransform transform = new AffineTransform(); transform.scale... image.transform(transform); //this specific line takes that long 如果thread.interrupt()停止; 因为我只想打电话一次,所以我无法在一段时间内运行一些东西(thread.currentthread.isinterrupted())循环并抛出一个intruptedException.我可以在通话之前和之后不介入,但是如何停止这条代码? 解决方案 Java中的线程中断是合作的. ,但我相信你明白这一点.如果您的仿射变换需要这么长时间运行,并且您尝试一次运行它,甚至不检查中断的标志,您的转换将愉快地转换. 没有Thread.kill(
考虑以下宏: pixelFast MACRO ; This macro draws a pixel, assuming the coordinates are already loaded in cx&dx and the color is in al. xor bh, bh mov ah, 0ch int 10h ENDM drawRect MACRO x1, y1, x2, y2, color LOCAL @@loop, @@row_loop xor cx, cx mov dx, y1 mov al, BYTE PTR [color] @@loop: mov cx, x1 @@row_loop: pixelFast inc cx cmp cx, x2 jna @@row_lo
我有一个函数a执行某些任务,另一个功能b是对某些事件的回调.每当发生事件时,函数b被调用,我想使其能够中断函数a的执行.这两个功能都在同一类中声明. 函数a不应该调用函数b.函数b是完全独立的,它是对来自ROS:ROS:机器人操作系统的"用户脸检测到"的外部事件的回调. 我需要的基本上是类似Ctrl+C的东西,可以从Python中调用,并且仅列出目标功能而不是整个程序. 可以在python中完成吗? 解决方案 通常建议不要使用流量控制的异常.相反,请查看Python stdlib的仅计划使用单个线程(即使是最基本的Python程序也使用至少一个线程). 这个答案函数(函数b)可以中断另一个(函数a). 这是一些重要部分,总结了其他答案. 设置线程库: from threading import Event global exit exit = Event() 这是time.sleep(60)的一个很好的替代品,因为它可以中断:
Libuv和操作系统如何实际安排Node.js中的settimeout和setInterval等计时器?我看到节点过程没有使用CPU,直到计时器启动为止.这是否表示OS计划计时器,并在触发计时器时醒来节点过程?如果是这样,操作系统如何安排计时器以及硬件如何执行? 解决方案 计时器回调作为NodeJS事件循环的一部分执行.当您调用setTimeout或setInterval>时,Libuv(实现Nodejs事件循环的C库)将在"最小堆"数据结构中创建一个计时器,该数据结构称为计时器堆.在此数据结构中,它跟踪每个计时器到期的时间戳. 在事件循环的每个新鲜迭代开始时,libuv呼叫uv__update_time,uv__update_time又调用SYSCALL以获取当前时间,并将当前循环时间更新至毫秒精度. ( https://github.com/nodejs/node/blob/master/deps/uv/src/unix/core.c#l375 ) 在此步骤之后,
我正在寻找RISC-V处理器如何中断请求. 我查看了Internet上的指令集手册和信息.重点是确切解释标题集:指令集.在我看来,如何处理中断是处理器的"程序员模型"的问题.它并不清楚地适合有关指令集的文档,因为中断处理的一部分未在说明中表达.显然,跳入ISR是不是的指令,该指令显示了程序代码中的任何位置.指令集手册提供了Say mret和mstatus的描述,但没有提供整体视图. 对于假设的架构,可以这样描述中断处理: If the IRQ line is high and the I-bit in the status register is set, the processor executes the following steps atomically: - Push the PC of the next instruction onto the stack. - Push the status register onto the stack. - C
嗅探urb_interruptions 我嗅着某些应用程序(SoundLab)和设备(带USB的Sonometer)之间的通信.我发现一个数据包负责返回当前状态: USB URB [Source: host] [Destination: 1.1.2] USBPcap pseudoheader length: 27 IRP ID: 0xffff858d126f4a60 IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000) URB Function: URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER (0x0009) IRP information: 0x00, Direction: FDO -> PDO 0000 000. = Reserved: 0x00 .... ...0 = Direction: FDO ->