中断处理

【中断机制】什么是中断?使用中断的原因、注意事项 阅读详情

Linux设备驱动程序学习(11)-中断处理

可以让设备在产生某个事件时通知处理器的方法就是中断。一个“中断”仅是一个信号,当硬件需要获得处理器对它的关注时,就可以发送这个信号。 Linux 处理中断的方式非常类似在用户空间处理信号的方式。 大多数情况下,一个驱动只需要为它的设备的中断注册一个处理例程,并当中断到来时进行正确的处理。本质上来讲,中断处理例程和其他的代码并行运行。因此,它们不可避免地引起并发问题,并竞争数据结构和硬件。 透彻地理解并发控制技术对中断来讲非常重要。


安装中断处理例程

内核维护了一个中断信号线的注册表,类似于 I/O 端口的注册表。模块在使用中断前要先请求一个中断通道(或者 IRQ中断请求),并在使用后释放它。所用的函数声明在 <linux/interrupt.h> (在此文件中并未真正包含,是通过它include的文件间接包含的,函数在/kernel/irq/Manage.h中),中断注册和释放的函数接口如下:

int request_irq(unsigned int irq,
             irqreturn_t (*handler)(int, void *, struct pt_regs *),
                unsigned long flags,

                const char *dev_name,
                void *dev_id);

void free_irq(unsigned int irq, void *dev_id);

request_irq 的返回值: 0 指示成功,或返回一个负的错误码,如 -EBUSY 表示另一个驱动已经占用了你所请求的中断线。

函数的参数如下:

unsigned int irq :请求的中断号 irqreturn_t (*handler) :安装的处理函数指针。 unsigned long flags :一个与中断管理相关的位掩码选项。 const char *dev_name :传递给 request_irq 的字符串,用来在 /proc/interrupts 来显示中断的拥有者。 void *dev_id :用于共享中断信号线的指针。它是唯一的标识,在中断线空闲时可以使用它,驱动程序也可以用它来指向自己的私有数据区(来标识哪个设备产生中断)。若中断没有被共享,dev_id 可以设置为 NULL,但推荐用它指向设备的数据结构。
flags 中可以设置的位如下:
SA_INTERRUPT :快速中断标志。快速中断处理例程运行在当前处理器禁止中断的状态下。 SA_SHIRQ : 在设备间共享中断标志。 SA_SAMPLE_RANDOM :该位 表示产生的中断能对 /dev/random 和 /dev/urandom 使用的熵池(entropy pool)有贡献。 读取这些设备会返回真正的随机数,从而有助于应用程序软件选择用于加密的安全密钥。 若设备以真正随机的周期产生中断,就应当设置这个标志。若设备中断是可预测的,这个标志不值得设置。可能被攻击者影响的设备不应当设置这个标志。更多信息 看 drivers/char/random.c 的注释。

中断处理例程可在驱动初始化时或在设备第一次打开时安装。推荐在设备第一次打开、硬件被告知产生中断前时申请中断,因为可以共享有限的中断资源。这 样调用 free_irq 的位置是设备最后一次被关闭、硬件被告知不用再中断处理器之后。但这种方式的缺点是必须为每个设备维护一个打开计数。

 以下是中断申请的示例(并口):

if (short_irq >= 0)
{
        result = request_irq(short_irq, short_interrupt,
                             SA_INTERRUPT, "short", NULL);
        if (result) {
                printk(KERN_INFO "short: can't get assigned irq %i/n",
                       short_irq);

                short_irq = -1;
        } else { /*打开中断硬件的中断能力*/
                outb(0x10,short_base+2);
        }
}

i386 和 x86_64 体系定义了一个函数来查询一个中断线是否可用:

int can_request_irq(unsigned int irq, unsigned long flags); /*当能够成功分配给定中断,则返回非零值。但注意,在 can_request_irq 和 request_irq 的调用之间给定中断可能被占用*/

快速和慢速处理例程

快速中断是那些能够很快处理的中断,而处理慢速中断会花费更长的时间。在处理慢速中断时处理器重新使能中断,避免快速中断被延时过长。在现代内核 中,快速和慢速中断的区别已经消失,剩下的只有一个:快速中断(使用 SA_INTERRUPT )执行时禁止所有在当前处理器上的其他中断。注意:其他的处理器仍然能够处理中断。

 除非你充足的理由在禁止其他中断情况下来运行中断处理例程,否则不应当使用SA_INTERRUPT.

 x86中断处理内幕

这个描述是从 2.6 内核 arch/i386/kernel/irq.c, arch/i386/kernel/ apic.c, arch/i386/kernel/entry.S, arch/i386/kernel/i8259.c, 和 include/asm-i386/hw_irq.h 中得出,尽管基本概念相同,硬件细节与其他平台上不同。

底层中断处理代码在汇编语言文件 entry.S。在所有情况下,这个代码将中断号压栈并且跳转到一个公共段,公共段会调用 do_IRQ(在 irq.c 中定义)。do_IRQ 做的第一件事是应答中断以便中断控制器能够继续其他事情。它接着获取给定 IRQ 号的一个自旋锁,阻止其他 CPU 处理这个 IRQ,然后清除几个状态位(包括IRQ_WAITING )然后查找这个 IRQ 的处理例程。若没有找到,什么也不做;释放自旋锁,处理任何待处理的软件中断,最后 do_IRQ 返回。从中断中返回的最后一件事可能是一次处理器的重新调度。

 IRQ的探测是通过为每个缺乏处理例程的IRQ设置 IRQ_WAITING 状态位来完成。当中断发生, 因为没有注册处理例程,do_IRQ 清除这个位并且接着返回。 当probe_irq_off被一个函数调用,只需搜索没有设置 IRQ_WAITING 的 IRQ。

/proc 接口

当硬件中断到达处理器时, 内核提供的一个内部计数器会递增,产生的中断报告显示在文件 /proc/interrupts中。这一方法可以用来检查设备是否按预期地工作。此文件只显示当前已安装处理例程的中断的计数。若以前request_irq的一个中断,现在已经free_irq了,那么就不会显示在这个文件中,但是它可以显示终端共享的情况。

/proc/stat记录了几个关于系统活动的底层统计信息, 包括(但不仅限于)自系统启动以来收到的中断数。 stat 的每一行以一个字符串开始, 是该行的关键词:intr 标志是中断计数。第一个数是所有中断的总数, 而其他每一个代表一个单独的中断线的计数, 从中断 0 开始(包括当前没有安装处理例程的中断),无法显示终端共享的情况。

以上两个文件的一个不同是:/proc/interrupts几乎不依赖体系,而/proc/stat的字段数依赖内核下的硬件中断,其定义在<asm/irq.h>中。ARM的定义为:

#define NR_IRQS    128

 


自动检测 IRQ 号

驱动初始化时最迫切的问题之一是决定设备要使用的IRQ 线,驱动需要信息来正确安装处理例程。自动检测中断号对驱动的可用性来说是一个基本需求。有时自动探测依赖一些设备具有的默认特性,以下是典型的并口中断探测程序:

if (short_irq < 0) /* 依靠使并口的端口号,确定中断*/
 switch(short_base) {
 case 0x378: short_irq = 7; break;
 case 0x278: short_irq = 2; break;
 case 0x3bc: short_irq = 5; break;
 }

有的驱动允许用户在加载时覆盖默认值:

insmod xxxxx.ko irq=x

当目标设备有能力告知驱动它要使用的中断号时,自动探测中断号只是意味着探测设备,无需做额外的工作探测中断。

但不是每个设备都对程序员友好,对于他们还是需要一些探测工作。这个工作技术上非常简单: 驱动告知设备产生中断并且观察发生了什么。如果一切顺利,则只有一个中断信号线被激活。尽管探测在理论上简单,但实现可能不简单。有 2 种方法来进行探测中断: 调用内核定义的辅助函数和DIY探测。

(1)调用内核定义的辅助函数

Linux 内核提供了一个底层设施来探测中断号,且只能在非共享中断模式下工作,它包括 2 个函数, 在<linux/interrupt.h> 中声明( 也描述了探测机制 ):

unsigned long probe_irq_on(void); 
/*这个函数返回一个未分配中断的位掩码。驱动必须保留返回的位掩码, 并在后面传递给 probe_irq_off。在调用probe_irq_on之后, 驱动应当安排它的设备产生至少一次中断*/

int probe_irq_off(unsigned long); 
/* 在请求设备产生一个中断后, 驱动调用这个函数, 并将 probe_irq_on 返回的位掩码作为参数传递给probe_irq_off。probe_irq_off 返回在"probe_on"之后发生的中断号。如果没有中断发生, 返回 0 ;如果产生了多次中断,probe_irq_off 返回一个负值*/

程序员应当注意在调用 probe_irq_on 之后启用设备上的中断, 并在调用 probe_irq_off 前禁用。此外还必须记住在 probe_irq_off 之后服务设备中待处理的中断。
以下是LDD3中的并口示例代码,(并口的管脚 9 和 10 连接在一起,探测五次失败后放弃):

int count = 0;
do
{
        unsigned long mask;
        mask = probe_irq_on();
        outb_p(0x10,short_base+2); /* enable reporting */
        outb_p(0x00,short_base); /* clear the bit */
        outb_p(0xFF,short_base); /* set the bit: interrupt! */
        outb_p(0x00,short_base+2); /* disable reporting */
        udelay(5); /* give it some time */
        short_irq = probe_irq_off(mask);

        if (short_irq == 0) { /* none of them? */
                printk(KERN_INFO "short: no irq reported by probe/n");
                short_irq = -1;
        }
} while (short_irq < 0 && count++ < 5);
if (short_irq < 0)
        printk("short: probe failed %i times, giving up/n", count);

最好只在模块初始化时探测中断线一次。
大部分体系定义了这两个函数( 即便是空的 )来简化设备驱动的移植。

(2)DIY探测

DIY探测与前面原理相同: 使能所有未使用的中断, 接着等待并观察发生什么。我们对设备的了解:通常一个设备能够使用3或4个IRQ 号中的一个来进行配置,只探测这些 IRQ 号使我们能不必测试所有可能的中断就探测到正确的IRQ 号。

下面的LDD3中的代码通过测试所有"可能的"中断并且察看发生的事情来探测中断。 trials 数组列出要尝试的中断, 以 0 作为结尾标志; tried 数组用来跟踪哪个中断号已经被这个驱动注册。

int trials[] = {3, 5, 7, 9, 0};
int tried[] = {0, 0, 0, 0, 0};
int i, count = 0;


for (i = 0; trials[i]; i++)
        tried[i] = request_irq(trials[i], short_probing,
                               SA_INTERRUPT, "short probe", NULL);
do
{
        short_irq = 0; /* none got, yet */
        outb_p(0x10,short_base+2); /* enable */
        outb_p(0x00,short_base);
        outb_p(0xFF,short_base); /* toggle the bit */
        outb_p(0x00,short_base+2); /* disable */
        udelay(5); /* give it some time */
         /* 等待中断,若在这段时间有中断产生,handler会改变 short_irq */
        /* the value has been set by the handler */
        if (short_irq == 0) { /* none of them? */
                printk(KERN_INFO "short: no irq reported by probe/n");
        }
 } while (short_irq <=0 && count++ < 5);

/* end of loop, uninstall the handler */
for (i = 0; trials[i]; i++)
        if (tried[i] == 0)
                free_irq(trials[i], NULL);

if (short_irq < 0)
        printk("short: probe failed %i times, giving up/n", count);

以下是handler的源码:

irqreturn_t short_probing(int irq, void *dev_id, struct pt_regs *regs)
{
    if (short_irq == 0) short_irq = irq; /* found */
 if (short_irq != irq) short_irq = -irq; /* ambiguous */
 return IRQ_HANDLED;
}

若事先不知道"可能的" IRQ ,就需要探测所有空闲的中断,所以不得不从 IRQ 0 探测到 IRQ NR_IRQS-1 。


处理例程的参数及返回值

传递给一个中断处理例程的参数有: int irq、void *dev_id和 struct pt_regs *regs。

int irq (中断号):若要打印 log 消息时,是很有用。

void *dev_id:一种用户数据类型(驱动程序可用的私有数据),传递给 request_irq的 void* 参数,会在中断发生时作为参数传给处理例程。我们通常传递一个指向设备数据结构的指针到 dev_id 中,这样一个管理若干相同设备的驱动在中断处理例程中不需要任何额外的代码,就可以找出哪个设备产生了当前的中断事件。

struct pt_regs *regs很少用到。

中断处理例程的典型使用如下:

static irqreturn_t sample_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
        struct sample_dev *dev = dev_id;
        /* now `dev' points to the right hardware item */
        /* .... */
}

和这个处理例程关联的打开代码如下:

static void sample_open(struct inode *inode, struct file *filp)
{
        struct sample_dev *dev = hwinfo + MINOR(inode->i_rdev);
        request_irq(dev->irq, sample_interrupt,0 /* flags */, "sample", dev /* dev_id */);
        /*....*/
        return 0;
}


中断处理例程应当返回一个值指示是否真正处理了一个中断。如果处理例程发现设备确实需要处理, 应当返回 IRQ_HANDLED; 否则返回值 IRQ_NONE。以下宏可产生返回值:

IRQ_RETVAL(handled) /*若要处理中断,handled应是非零*/

有位网友在处理返回值是按惯例return 0;,导致了oops。吸取经验教训,我们应特别注意这种返回值,以下是有关中断处理例程的返回值的内核定义(#include <linux/irqreturn.h> ),看了就知道导致oops的原因了,以后应多多注意:

typedef int irqreturn_t;
#define IRQ_NONE    (0)
#define IRQ_HANDLED    (1)
#define IRQ_RETVAL(x)    ((x) != 0)


实现中断处理例程

中断处理例程唯一的特别之处在中断时运行,它能做的事情受到了一些限制. 这些限制与我们在内核定时器上看到的相同:
(1)中断处理例程不能与用户空间传递数据, 因为它不在进程上下文执行;
(2)中断处理例程也不能做任何可能休眠的事情, 例如调用 wait_event, 使用除 GFP_ATOMIC 之外任何东西来分配内存, 或者锁住一个信号量;
(3)处理者不能调用schedule()。

中断处理例程的作用是将关于中断接收的信息反馈给设备并根据被服 务的中断的含义读、写数据。中断处理例程第一步常常包括清除设备的一个中断标志位,大部分硬件设备在清除"中断挂起"位前不会再产生中断。这也要根据硬件 的工作原理决定, 这一步也可能需要在最后做而不是开始; 这里没有通用的规则。一些设备不需要这步, 因为它们没有一个"中断挂起"位; 这样的设备是少数。

一个中断处理的典型任务是:如果中断通知它所等待的事件已经发生(例如新数据到达),就会唤醒休眠在设备上的进程。


不管是快速或慢速处理例程,程序员应编写执行时间尽可能短的处理例程。 如果需要进行长时间计算, 最好的方法是使用 tasklet 或者 workqueue 在一个更安全的时间来调度计算任务。

 


启用和禁止中断

有时设备驱动必须在一段时间(希望较短)内阻塞中断发生。并必须在持有一个自旋锁时阻塞中断,以避免死锁系统。注意:应尽量少禁止中断,即使是在设备驱动中,且这个技术不应当用于驱动中的互斥机制。

禁止单个中断
有时(但是很少!)一个驱动需要禁止一个特定中断。但不推荐这样做,特别是不能禁止共享中断(在现代系统中, 共享的中断是很常见的)。内核提供了 3 个函数,是内核 API 的一部分,声明在 <asm/irq.h>:

void disable_irq(int irq);/*禁止给定的中断, 并等待当前的中断处理例程结束。如果调用 disable_irq 的线程持有任何中断处理例程需要的资源(例如自旋锁), 系统可能死锁*/
void disable_irq_nosync(int irq);/*禁止给定的中断后立刻返回(可能引入竞态)*/
void enable_irq(int irq);

 
调用任一函数可能更新在可编程控制器(PIC)中的特定 irq 的掩码, 从而禁止或使能所有处理器特定的 IRQ。这些函数的调用能够嵌套,即如果 disable_irq 被连续调用 2 次,则需要 2 个 enable_irq 重新使能 IRQ 。可以在中断处理例程中调用这些函数,但在处理某个IRQ时再打开它是不好的做法。
 
禁止所有中断
在 2.6 内核, 可使用下面 2 个函数中的任一个(定义在 <asm/system.h>)关闭当前处理器上所有中断:

void local_irq_save(unsigned long flags);/*在保存当前中断状态到 flags 之后禁止中断*/
void local_irq_disable(void);/* 关闭中断而不保存状态*/
/*如果调用链中有多个函数可能需要禁止中断, 应使用 local_irq_save*/
/*打开中断使用:*/
void local_irq_restore(unsigned long flags); 

void local_irq_enable(void);
/*在 2.6 内核, 没有方法全局禁用整个系统上的所有中断*/

 

顶半部和底半部

中断处理需要很快完成并且不使中断阻塞太长,所以中断处理的一个主要问题是如何在处理例程中完成耗时的任务。
Linux (
连同许多其他系统)通过将中断处理分为两部分来解决这个问题:
“
顶半部”是实际响应中断的例程(request_irq 注册的那个例程)。

“底半部”是被顶半部调度,并在稍后更安全的时间内执行的函数。

他们最大的不同在底半部处理例程执行时,所有中断都是打开的(这就是所谓的在更安全的时间内运行)。典型的情况是:顶半部保存设备数据到一个设备特定的缓存并调度它的底半部,最后退出: 这个操作非常快。底半部接着进行任何其他需要的工作。这种方式的好处是在底半部工作期间,顶半部仍然可以继续为新中断服务。

Linux 内核有 2 个不同的机制可用来实现底半部处理:

(1) tasklet (首选机制),它非常快, 但是所有的 tasklet 代码必须是原子的;

(2)工作队列, 它可能有更高的延时,但允许休眠。

tasklet和工作队列在《时间、延迟及延缓操作》已经介绍过,具体的实现代码请看实验源码!


中断共享

Linux 内核支持在所有总线上中断共享。

安装共享的处理例程

通过 request_irq 来安装共享中断与非共享中断有 2 点不同:

(1)当request_irq 时,flags 中必须指定SA_SHIRQ 位;

(2)dev_id 必须唯一。任何指向模块地址空间的指针都行,但 dev_id 绝不能设置为 NULL。

内核为每个中断维护一个中断共享处理例程列表,dev_id 就是区别不同处理例程的签名。释放处理例程通过执行free_irq实现。  dev_id 用来从这个中断的共享处理例程列表中选择正确的处理例程来释放,这就是为什么 dev_id 必须是唯一的.

请求一个共享的中断时,如果满足下列条件之一,则request_irq 成功:

(1)中断线空闲;

(2)所有已经注册该中断信号线的处理例程也标识了IRQ是共享。

一个共享的处理例程必须能够识别自己的中断,并且在自己的设备没有被中断时快速退出(返回 IRQ_NONE )。

共享处理例程没有探测函数可用,但使用的中断信号线是空闲时标准的探测机制才有效。

一个使用共享处理例程的驱动需要小心:不能使用 enable_irq 或 disable_irq,否则,对其他共享这条线的设备就无法正常工作了。即便短时间禁止中断,另一设备也可能产生延时而为设备和其用户带来问题。所以程序员必须记住:他的驱动并不是独占这个IRQ,它的行为应当比独占这个中断线更加"社会化"。


中断驱动的 I/O

当与驱动程序管理的硬件间的数据传送可能因为某种原因而延迟,驱动编写者应当实现缓存。一个好的缓存机制需采用中断驱动的 I/O,一个输入缓存在中断时被填充,并由读取设备的进程取走缓冲区的数据,一个输出缓存由写设备的进程填充,并在中断时送出数据。

为正确进行中断驱动的数据传送,硬件应能够按照下列语义产生中断:

输入:当新数据到达时并处理器准备好接受时,设备中断处理器。

输出:当设备准备好接受新数据或确认一个成功的数据传送时,设备产生中断。


ARM9开发板实验

这次的实验和硬件相关,利用了友善之臂SBC2440V4提供的四个中断按键。

K1:中断+tasklet

K2:中断+工作队列

K3:中断+共享工作队列

K4:中断+linux内核缓冲kfifo

具体的实现方法请看源码!

中断模块源码:IO_irq.tar.gz

测试程序:IO_irq_test.tar.gz

实验数据:


[Tekkaman2440@SBC2440V4]#cd /lib/modules/
[Tekkaman2440@SBC2440V4]#insmod IO_irq.ko
[Tekkaman2440@SBC2440V4]#cat /proc/devices
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 14 sound
 81 video4linux
 89 i2c
 90 mtd
116 alsa
128 ptm
136 pts
153 spi
180 usb
189 usb_device
204 s3c2410_serial
252 IO_irq
253 usb_endpoint
254 rtc

Block devices:
  1 ramdisk
256 rfd
  7 loop
 31 mtdblock
 93 nftl
 96 inftl
179 mmc
[Tekkaman2440@SBC2440V4]#mknod -m 666 IO_irq c 252 0
[Tekkaman2440@SBC2440V4]#/tmp/IO_irq_test
IO_irq: opened !
IO_irq: the module can not lseek!
please input the command :
**************KEY = 1*****************
NO prevkey
now jiffies =0x00059ae5
count = 1

**************KEY = 1 END*****************

**************key1_tasklet_start*****************
time:00059ae7 delta: 2 inirq:1 pid: 0 cpu:0 command:swapper

**************key1_tasklet_end*****************

**************KEY = 2*****************
prevkey=1 at 0x00059ae5
NO prekey2
now jiffies =0x00059c54
count = 1
result = 1
**************KEY = 2 END*****************

**************key2_workqueue_start*****************
time:00059c5f delta: 11 inirq:0 pid:832 cpu:0 command:tekkamanwork/0

**************key2_workqueu_end*****************

**************KEY = 3*****************
prevkey=2 at 0x00059c54
NO prekey3
now jiffies =0x00059f63
count = 1
result = 1
**************KEY = 3 END*****************

**************key3_workqueue_start*****************
time:00059f66 delta: 3 inirq:0 pid: 5 cpu:0 command:events/0

**************key3_workqueu_end*****************

IO_irq: Invalid input ! only 1、2、3、4、5、6、7、8、q !

please input the command :6
IO_irq: ioctl IO_KFIFO_SIZE len=414
please input the command :8

**********KEY = 4**********
prevkey=3 at 0x00059f63
NO prekey4
now jiffies =0x0005a2fd
count = 1
*********KEY = 4 END***********

**********KEY = 4**********
prevkey=4 at 0x0005a2fd
prekey4 at 0x0005a2fd
now jiffies =0x0005a304
count = 2
*********KEY = 4 END***********

**********KEY = 4**********
prevkey=4 at 0x0005a304
prekey4 at 0x0005a304
now jiffies =0x0005a304
count = 3
*********KEY = 4 END***********
please input the command :6
IO_irq: ioctl IO_KFIFO_SIZE len=142
please input the command :7
IO_status= 1f !
IO_irq: ioctl IO_KFIFO_RESET 
please input the command :6
IO_irq: ioctl IO_KFIFO_SIZE len=0
please input the command :8
please input the command :q
IO_irq: release !
[Tekkaman2440@SBC2440V4]#

Linux中的中断处理 与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq(), request_irq()的原型为: int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irq 阅读详情

相关推荐

MicroPython的中断处理

中断是计算机系统中非常重要的一种机制,简单的说就是当有I/O或其它因素发出中断信号后,CPU会暂定执行当前代码保护好现场,然后执行中断处理程序。CPU执行完中断处理程序后,返回原来的执行点,恢复现场,继续执行原来的代码。MicroPython也支持在合适的硬件上(与硬件和固件有相关性)编写中断处理程序。中断处理程序(也称为中断服务程序ISR),通常被定义为回调函数。当定时器或引脚电平变化等事件触发中断后,中断处理程序将被执行。

superatom01的博客 3277

【linux驱动】中断

文章目录一、linux内核中断1.1 概念1.2 中断API1.3 linux中断中上半部和下半部1.3.1 上半部和下半部概念1.3.2 软中断1.3.3 tasklet2.3.4 工作队列2.4 设备树中断节点2.5 中断示例2.6【补充】常用的中断标志2.7【补充】对irqreturn_t的说明 一、linux内核中断 1.1 概念 linux内核提供了完善的中断处理框架,首先向内核申请中断,接着注册中断处理函数。 1.2 中断API 本节的中断api介绍:申请中断号、使能和禁止中断、使能和禁止全局中

weixin_43810563的博客 1307

第7章中断处理程序

7.2 中断处理程序 在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。例如,由一个函数专门处理来自系统时钟的中断,而另外一个函数专门处理由键盘产生的中断。一个设备的中断处理程序是它设备驱动程序的一部分——设备驱动程序是用于对设备进行管理的内核代码。 在Linux中,中断处理程序是普通的C函数。只不过这些函数必须按...

xiezhi123456的博客 3408

【中断处理过程(基础简洁)】

【中断处理过程(基础简洁)】

Sugar_wolf的博客 1万+

Linux的中断处理分析

MIPS中,中断被当作一种异常(第0号异常)来处理。中断由外部设备产生,可能发生在任何时刻,每个中断都有一个编号分配给一个外部设备,这样来区分不同设备产生的中断,如果硬件和内核支持共享中断,则可以由多个设备共享一个中断编号。         在CPU得知中断发生后,它将进一步的处理委托给一个软件例程,这个软件例程是体系结构相关的,然后根据中断号来识别中断源,并进入特定的中断处理程序来处理该中断。

落尘纷扰的专栏 2511

SAP 凭证分割功能 - 概述&系统配置 - Chapter01/02

为何要进行凭证拆分(分割)?在启用凭证分割之前, 在财务凭证在过账时会自动带出默认的利润中心,这利 润中心一般是从其他对象派生出来的(比如从成本中心、WBS 或资产负债表科 目定义默认的利润中心等),但是某些情况下的财务过账是不会派生出利润中 心的,比如说应收或者应付。如果一笔销售凭证上有两个行项目,10 行对应的成品物料 A 的利润中心为 TPCA-100;公司项目Dr/Cr科目金额利润中心10001Dr应收账款20002Cr库存商品A1500TPCA-1003Cr。

weixin_46525734的博客 3952

嵌入式linux 中断

嵌入式里面的中断

weixin_50290335的博客 1293

耶鲁大学《博弈论》课程——逆向归纳

耶鲁大学《博弈论》课程——逆向归纳

ZYLer_的博客 7869

Linux驱动开发——(五)内核中断

讲解了有关Linux内核的中断机制和API函数。

wJen的博客 2807

IBM x3650M4服务器更换主板后,导入原有硬盘阵列信息

x3650m4服务器主板坏了,更换好的主板,需要导入原来硬盘的里面的阵列信息 1、开机有提示信息,按C导入配置 2、按Y继续 3、点击start进入阵列卡配置 4、选择configurations 1,点击preview 5、预览硬盘的阵列信息,点击import导入 6、导入成功,可以查看到阵列信息 7、重启服务器,进入操作系统 如果重启找不到操作系统,重启按f12,手动选择从onboard sas controller启动,进入系统一次后面重启就会自动找到并引导系统了。 8、有时候导入阵列

zds00virtue的博客 2万+

OGG故障指南:OGG-01163 Bad column length (xxx) specified for column

OGG-01163 Bad column length (xxx) specified for column AAA in table OWNER.TABLE, maximum allowable length is yyy

qqqyyy0422的博客 717

Linux 中断之中断处理浅析

1. 中断的概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU 暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。 软件对硬件进行配置后,软件期望等待硬件的某种状态(比如,收到了数据),这里有两种方式,一种是轮询(pol...

StephenZhou 2万+

动态数据脱敏技术分析

在当前国内信息安全热潮中,数据脱敏作为数据安全的重要一环得到了业界的认可与重视。早在2012年,数据脱敏首次作为一个单独的魔力象限由Gartner发布,Gartner在2014年又提出了:按照数据使用场景,将数据脱敏分为静态数据脱敏(Static data masking-SDM )与动态数据脱敏(Dynamic data masking-DDM )。 可能有人望文生义,认为动态数据脱敏一定比静态数据脱敏高级。非也非也,静态or动态,取决于脱敏的使用场景,主要是以使用场景为由来选择合适的数据脱敏的模式。 本

美创科技的博客 4666

中断处理流程

对于中断控制器的每个中断源,向中断域添加硬件中断号到Linux中断号的映射时,内核分配一个Linux中断号和一个中断描述符irq_desc。

congchp的博客 1074

波浪补偿控制(AHC)之波浪发生器(CODESYS完整源代码)

波浪发生器平台详细算法和结构介绍请参看下面博客文章:CODESYS平台如何建立FC和FB,请参看下面博客文章:

RXXW_Dor的博客 401

车载 ECU 中的 Safety Linux 详解

车载 ECU 中的 Safety Linux 详解

天赐好车的博客 307

中断处理与进程调度的区别

中断处理与进程调度的区别 对于中断处理和进程调度的抢占方式(处理机调度),因为二者都有打断的性质,都是抢占了CPU,所以容易混淆。 首先,中断处理是外设打断进程,比如一个进程在使用cpu,它的某条指令到达了中断周期,那么,这个进程被中断。(注意:是被外设中断而不是被一个进程打断。就算中断嵌套嵌套的也是其他中断而不是进程。中断服务程序的执行并不视为进程执行) 进程调度抢占方式则是CPU中一个进程打断另一个执行中的进程。(如处于改进程某条指令的取值、执行或者非中断处理的任何时候) 所以可以这么认为——中断处理是

A13757166182的博客 6116

YOLOv8多传感器融合技术——毫米波雷达融合技术详解

本文介绍了YOLOv8与毫米波雷达融合技术在自动驾驶系统中的应用。毫米波雷达具有全天候工作、测距测速精准等优势,但存在分辨率低等局限。通过融合YOLOv8的视觉检测能力,可显著提升系统在恶劣环境下的感知性能。文章详细阐述了融合实现方法,包括雷达数据处理、目标投影匹配、置信度融合等关键技术,并提供了评估指标和应用场景分析。这种多传感器融合方案能有效弥补单一传感器的不足,为自动驾驶提供更可靠的环境感知能力,是实现高级别自动驾驶的重要技术支撑。

u010117029的博客 174

中断和中断处理程序

1. 中断        Linux内核要对连接到计算机上的所有硬件设备进行管理,首先要能和它们互相通信。从所周知,处理器的速度跟外围硬件设备的速度往往不在一个数量级上。所以,需要一种机制,如果轮询(polling)是一种解决办法,可以让内核定期对设备的状态进行查询,然后做出相应的处理,但这让内核做了不少无用功。    更好的办法是由我们来提供一种机制,让硬件在需要的时候再向内核发出信

缘起宇轩阁 7327

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ARM中断处理流程

这边文章主要是讲解一下,对ARM_Linux中断处理的一个流程介绍,在底层处理部分,不同的架构会有不一样处理,但Linux中断注册过程是一样的。   一、Linux中断的简易模型: 当一个IRQ产生时,会发生什么? 当一个IRQ产生后,CPU会首先自动跳转到IRQ的中断向量(这个中断向量是可设置的),在这个IRQ中断向量里又是一个跳转指令,CPU再次跳转,跳转后的代码主要完成的工作是保存一

bindingfly的博客 5108

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux中断处理流程

结构体作用irq_chip提供 GIC 操作方法(ackeoimask等),直接控制中断控制器硬件行为。irq_domain管理硬件中断号到 Linux 中断号的映射,确保内核正确识别中断来源。irq_desc存储中断描述符,维护irqaction链表,是中断处理的核心管理结构。irqaction包含网卡驱动的中断处理函数,执行数据读取、协议处理等业务逻辑。

m0_74186706的博客 1301

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

中断处理程序

引例 除法错误中断处理 assume ds:a a segment mov ax,1000h mov bh,1 div bh mov ax,1h a ends end 上面源代码u查找的汇编指令 我们执行完div bh,我们应该执行076a:0007的mov ax,0001,但是因为这个除法溢出,所以获取调用0号中断处理程序,即0000:0 ~0000:3 四个字节的内容,就是这个中断...

qq_42146775的博客 2464

Linux中断处理

从按键驱动来学习中断

qq_52479948的博客 1402

中断处理函数_Linux中断处理

linux内核 2019-11-27 11:37:22中断处理 - 上半部(硬中断)由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux对中断的处理过程。中断处理相关结构前面说过,8259A中断控制器 由两片 8259A 风格的外部芯片以 级联 的方式连接在一起,每个芯片可处理多达 8 个不同的 IRQ(中断请求),所以可用 IRQ 线的个数达到 15 个...

weixin_39948210的博客 713
上一篇: 编译BusyBox制作文系统
下一篇: unix信号的问题
ShowMan
博客等级 码龄26年 280粉丝 321原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值