Articles of 中断

什么是Linux本地计时器中断?

所有的在标题。 任何链接到良好的文件是受欢迎的。

在IRQ合并之前,NAPI有哪些优势?

众所周知,有两种方法可以避免在高负载networking中出现硬件中断的一些开销,当硬件中断太多时,切换到它们需要很多时间。 程序风格的performance和select方法是非常重要的。 NAPI(新API) – 不使用硬件中断 ,每隔一段时间轮询以太网设备。 Linux内核默认使用中断驱动模式,当进入的数据包stream量超过一定的阈值时,只能切换到轮询模式。 http://en.wikipedia.org/wiki/New_API内核可以定期检查传入networking数据包的到达而不中断 ,从而消除了中断处理的开销。 中断合并 – 使用硬件中断 ,但是如果发生中断,则禁止中断并在一段时间内开始轮询 ,之后轮询终止并且中断被激活。 https://en.wikipedia.org/wiki/Interrupt_coalescing一种技术,其中通常会触发硬件中断的事件被阻止 , 直到一定数量的工作挂起,或超时计时器触发。 两种方法都没有明显的中断成本 – 这对于默认的中断驱动模式是有利的。 但是第二种方法 – 中断合并更合理,因为它: 延迟较less – 一旦包到达,立即尝试立即处理中断,或在最近发生中断时轮询。 对面的NAPI将不会立即处理该帧,而是会等待下一轮的一定时间。 较less的CPU使用率 – 仅在至less有一个数据包已经到达的情况下才开始轮询。 但是,即使帧没有收到,也不是徒劳地进行民意调查,就像做了NAPI一样。 在IRQ合并之前,NAPI有哪些优势?

在信号处理程序中,如何知道程序在哪里中断?

在x86(64位或32位)Linux上 – 例如: void signal_handler(int) { // want to know where the program is interrupted … } int main() { … signal(SIGALRM, signal_handler); alarm(5); … printf(…); <——- at this point, we trigger signal_handler … } 在signal_handler中,我们怎么知道我们在main()的printf中被中断?

简单的中断处理程序:request_irq返回错误代码-22

我正在写一个简单的内核模块,它可以注册一个中断并处理它。 但是,当我尝试通过调用request_irq函数来注册中断时,它将返回错误代码-22: 错误:无法请求IRQ 30 – 代码-22,EIO 5,EINVAL 22 我相信,这个错误代码等于EINVAL(无效的参数) 请告诉我,我做错了什么。 这里是一个模块: #include <linux/init.h> #include <linux/module.h> #include <linux/irq.h> #include <linux/io.h> #include <linux/irqdomain.h> #include <linux/interrupt.h> #include <linux/of.h> #include <linux/of_address.h> #include <asm/exception.h> #include <asm/mach/irq.h> void int068_interrupt(int irq, void *dev_id, struct pt_regs *regs) { printk("Interrupt should be handled there\n"); } static int __init clcdint_init(void) { unsigned int irq; unsigned […]

中断被阻止的读取

我的程序经历了这样一个循环: … while(1){ read(sockfd,buf,sizeof(buf)); … } 读取function在等待input时阻塞,恰好来自套接字。 我想处理SIGINT,基本上告诉它如果正在读取,然后调用任意函数,则停止读取函数。 做这个的最好方式是什么?

如何在embedded式Linux中检测GPIO线上的中断?

在pandaboard OMAP4的GPIO_39上每隔10ms产生一个中断。 我已经在Linux驱动代码中注册了一个处理程序,但是由于没有检测到中断,处理程序没有被调用。 我在硬件层面(通过探测gpio引脚)确定中断实际上正在产生。 只是软件无法检测到它。 我有我的驱动程序代码中的以下内容。 #define GPIO_NO 39 iowrite16(0x3, gpio_39_address + 2); /* Configured the pin 22 to be used as gpio. */ ret = gpio_request(GPIO_NO, "Claiming GPIO"); if(ret < 0) { printk(KERN_ALERT "%s: Claiming GPIO_%d failed\n", __func__, GPIO_NO); return -1; } else { printk(KERN_INFO "%s: Claiming GPIO_%d successful\n", __func__, GPIO_NO); } ret = […]

什么是linux irq域名,为什么他们需要?

什么是irq域,我读内核文档( https://www.kernel.org/doc/Documentation/IRQ-domain.txt )他们说: 注册为唯一irqchips的中断控制器的数量呈上升趋势:例如,GPIO控制器等不同types的子驱动程序通过将它们的中断处理程序build模为irqchips(即有效的级联中断控制器),避免重新实现与IRQ核心系统相同的callback机制。 GPIO控制器如何被称为中断控制器?

硬件定时器中断在哪里?

这是“英特尔架构软件开发人员手册”中的例外和中断表(我理解为IDT) 定时器中断在哪里使上下文切换成为可能? (用于多任务) 如果这是一个愚蠢的问题,请修复我的理解。 先谢谢你

如何在linux中知道特定引脚的中断/ GPIO编号

我正在做一个项目,我需要在Linux中处理一个中断。 我使用的主板是基于三星s3c6410 MCU的ARM9Board(arm 11处理器),它具有以下I / O接口: 如图所示,我有EINTx引脚的外部中断和GPxx引脚作为GPIO引脚,我不介意使用其中任何一个,但我没有他们的号码! 对于EINTx引脚: 当我打电话 int request_irq(unsigned int irq, void (*handler)(int, struct pt_regs *), unsigned long flags, const char *device); 我需要中断号作为函数的第一个parameter passing它,所以如何获得irq号码,例如EINT16引脚? 对于GPxx引脚:同样的故事,我需要GPIO引脚编号将它传递给这些function int gpio_request(unsigned gpio, const char *label); int gpio_direction_input(unsigned gpio); int gpio_to_irq(unsigned gpio); 即我如何知道GPP8引脚的GPIO号码? 我search了董事会的文件和数据表,但它不包含任何关于如何获得这些数字,任何想法或帮助在哪里看?

调度程序代码运行在什么上下文中?

有两种情况调用调度程序代码schedule() 当一个进程自动调用schedule() 定时器中断调用schedule() 在情况2中,我认为schedule()运行在中断上下文中,但是第一种情况呢? 它是否在调用它的过程的上下文中运行? 还有没有更多的情况下调用schedule() ?