interrupt_delay
文章平均质量分 64
lamdoc
这个作者很懒,什么都没留下…
展开
-
等待队列 wait queue
等待队列 wait queue.用于是进程等待某一特定事件发生,而无需频繁轮询。 进程在等待期间睡眠,在事件发生时内核自动唤醒。这点与tasklet不同,tasklet需要频繁轮询。完成量 completion 机制基于等待队列,内核利用该机制等待某一操作结束。 1. 数据结构每个等待队列 都有一个队列头: struct __wait_queue_head {原创 2012-06-14 14:40:02 · 472 阅读 · 0 评论 -
软中断 softirq
软中断 使得内核可以延期执行任务,是中断下半部的一种实现方法。软中断使用的较少;tasklet 是下半部最常用的一种方式,但其实 tasklet 也是通过软中断来实现的。系统中对时间要求最严格并且最重要的情况下,才会使用软中断。 目前只有 网络子系统和SCSI 系统中才使用了软中断。内核定时器和 tasklet 都是在软中断基础上实现的。如果需要加入一个软中断,首先应考虑使用原创 2012-06-14 14:35:06 · 1272 阅读 · 0 评论 -
工作队列 work queue
工作队列 是实现延期执行的另一种手段,它是通过守护进程在进程上下文中执行的,函数可以睡眠任意长时间。它和其他类型的延期执行方式都不一样,工作队列可以把工作推后,交由一个内核线程去执行。选择使用 工作队列 还是 软中断/tasklet 的要点:如果推后执行的任务需要睡眠,那就选择工作队列。如果推后执行的任务不需要睡眠,那就选择软中断/tasklet。如果需要用一个新的线程来执行你原创 2012-06-14 14:44:51 · 1469 阅读 · 0 评论 -
irq_desc & irq_data & irq_chip & irqaction
1. IRQ 相关信息的数据结构: irq_desc[NR_IRQS]: /** * struct irq_desc - interrupt descriptor * * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] * @chip: l原创 2012-06-14 14:25:53 · 618 阅读 · 0 评论 -
Linux 中断中不能用msleep(),只能用mdelay()
在linux driver开发中,经常要用到延迟函数:msleep,mdelay.虽然msleep和mdelay都有延迟的作用,但他们是有区别的:mdelay是忙等待函数,在延迟过程中CPU无法运行其他任务。最好用于短时间的延时,否则太浪费CPU资源。msleep会使当前进程进入休眠状态,CPU可以去执行其他任务。由于msleep涉及到进程调度,延时误差比较大(进程调度需要耗费时间原创 2013-07-23 16:34:36 · 1388 阅读 · 0 评论 -
linux 中断中只能用mdelay不能用msleep
在linux driver开发中,经常要用到延迟函数:msleep,mdelay.虽然msleep和mdelay都有延迟的作用,但他们是有区别的:mdelay是忙等待函数,在延迟过程中CPU无法运行其他任务。最好用于短时间的延时,否则太浪费CPU资源。msleep会使当前进程进入休眠状态,CPU可以去执行其他任务。由于msleep涉及到进程调度,延时误差比较大(进程调度需要耗费时间原创 2013-07-23 16:35:32 · 819 阅读 · 0 评论 -
tasklet
tasklet 和 workqueue 是延期执行工作的机制,其实现基于软中断。它们更易于使用,更适合设备驱动程序。ISR(中断服务程序) 分为上半部(top half) 和 下半部(bottom half)。下半部 负责 执行非时间关键操作。 tasklet就是一种下半部实现方式。tasklet有两个软中断代表: HI_SOFTIRQ 和 TASKLET_SOFTIRQ. 两者的区别原创 2012-06-14 14:37:25 · 429 阅读 · 0 评论 -
中断处理函数中不用disable_irq而用disable_irq_nosync的原因
今天在写触摸屏驱动时在中断处理函数中使用disable_irq关中断发现在进入中断处理后内核就挂掉了.于是研究了一下才发现disable_irq关闭中断并等待中断处理完后返回, 而disable_irq_nosync立即返回.在中断处理程序中应该使用disable_irq_nosync来关闭中断.先看一下disable_irq_nosync,内核代码中是这样解释的:转载 2013-07-26 11:03:28 · 740 阅读 · 0 评论 -
中断保存现场
通常,中断响应时硬件已经保存了PC和PS的内容,但是还有一些状态环境信息需要保存起来。如果不做保存处理,那麽即使以后能按断点地址返回到被中断程序,但由于环境被破坏,原程序也无法正确运行。中断响应时硬件处理时间很短,所以保存现场工作可由软件来协助硬件完成,并且在进入中断处理程序时就立即去做。对现场信息的保存方式是多样化的,常用方式有两种:一种是集中式保存:在内存的系统区中设置一个原创 2013-11-13 13:50:04 · 4417 阅读 · 1 评论 -
中断处理机制的实现
Linux中的中断处理系统非常依赖于体系结构,依赖于处理器、所使用的中断控制器(PIC--- programmable interrupt controller)、体系结构和机器本身。1. 中断处理机制如下图所示:设备产生中断,通过总线将电信号发送给中断控制器。如果中断号是激活的(中断号是允许被屏蔽的),那么中断控制器就会把中断发给处理器。除非处理器上禁止了该中断号,否则处理器原创 2012-08-09 08:28:17 · 1027 阅读 · 1 评论 -
注册中断_中断处理函数_释放中断
1. request_irq() --- 注册中断处理函数:int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id);/** * request_irq - allocate原创 2012-06-14 14:31:43 · 1359 阅读 · 0 评论 -
request_threaded_irq()解读
1. 这个中断函数比较有意思,不仅定义了中断处理函数ads7846_hard_irq(),还会创建一个新线程,用来运行指定函数函数ads7846_irq()。具体应用: err = request_threaded_irq(spi->irq, ads7846_hard_irq, ads7846_irq, irq_flags, spi->dev原创 2012-06-14 14:47:01 · 2613 阅读 · 0 评论 -
完成量 Completion
Completion 有两个参与者,一个在等待某操作完成,另一个在操作完成时发出声明。 数据结构: struct completion { unsigned int done; //表示在进程开始等待之前,事件就已经完成。 wait_queue_head_t wait; //标准的等待队列,等待进程在队列上睡眠。 };1. 初始化:原创 2012-06-14 14:42:16 · 467 阅读 · 0 评论 -
中断中的锁和(链表或其他)中的锁的区别
中断中的锁不能进入睡眠,所以一般都用自旋锁。但是在中断中使用自旋锁时,必须禁止当前CPU的其他中断,如可以使用:spin_lock_irqsave();//临界区spin_unlock_irqrestore();这个自旋锁函数,可以保存进入自旋锁前的当前CPU的中断状态,然后禁止本地中断(local_irq_disable -- 即禁止当前CPU的中断),出临界区之后,原创 2012-06-14 14:47:59 · 475 阅读 · 0 评论 -
中断控制
1. /proc/interrupts该文件存放系统中,与中断相关的统计信息。内容如下:xxha@fast-server02:~$ cat /proc/interrupts CPU0 CPU1 0: 202 727 IO-APIC-edge timer 1: 3 1原创 2012-08-09 09:29:54 · 549 阅读 · 0 评论 -
中断上下文与进程上下文对比
1. 进程上下文是指内核所处的一种操作模式,代表内核进程执行系统调用或者运行内核线程。在进程上下文中,可以通过 current 宏,关联当前进程。进程上下文可以睡眠,也可以调用调度程序。2. 当执行一个中断处理程序时,内核处于中断上下文(interrupt context)中.中断上下文和进程并没有什么关系,中断上下文不可以睡眠,也不可以调用可以睡眠的函数。中断处理程序必须原创 2012-08-08 14:42:09 · 495 阅读 · 0 评论 -
中断触发方式
1. 设置控制器硬件:内核提供一些标准函数,用于注册irq_chip 和 设置电流处理程序。 /* Set/get chip/data for an IRQ: */ extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); extern int set_irq_data(unsigned int i原创 2012-06-14 14:28:46 · 946 阅读 · 0 评论 -
睡眠_等待_阻塞_唤醒
睡眠, 等待, 阻塞,应该是一个概念睡眠相关的代码位于 /include/linux/wait.h 和 /kernel/wait.c 中 1. 进入睡眠: /** * wait_event - sleep until a condition gets true * @wq: the waitqueue to wait on *原创 2012-06-14 14:23:29 · 437 阅读 · 0 评论 -
中断分类
根据中断来源,中断可分为内部中断和外部中断。内部中断来源于CPU内部(软件中断指令,溢出,除法错误等),例如,操作系统从用户态切换到内核态需借助CPU内部的软件中断。外部中断来源于CPU外部,由外设提出请求。根据是否可被屏蔽,可分为可屏蔽中断和不可屏蔽中断(NMI),可屏蔽中断可通过屏蔽字屏蔽。根据中断入口跳转方法不同,可分为向量中断和非向量中断。采用向原创 2012-06-22 14:11:33 · 541 阅读 · 0 评论 -
完成量(completion )实例
这是一个公交司机和售票员之间的线程调度,用于理解完成量,完成量是对信号量的一种补充,主要用于多处理器系统上发生的一种微妙竞争,在这里两个线程间同步,只有当售票员把门关了后,司机才能开动车,只有当司机停车后,售票员才能开门。 #include#include#include#include#includeMODULE_LICENSE("DualBSD/GPL");原创 2014-09-10 17:02:18 · 899 阅读 · 0 评论