精华内容
下载资源
问答
  • 内核中断

    2016-02-22 20:07:33
    IC在上报中断之前,如果同时有多个中断产生,就要按照优先级进行排队,把优先级最高的中断送至“当前服务寄存器”,也就是报告给arm核,“当前服务寄存器”需要在中断服务代码中(在内核中断服务公共代码中)进行...

    1.   arm平台的中断

    arm核心拥有2个外部中断线,IRQFIQ;这两根中断线连接到中断控制器上;中断控制器(IC)利用IRQ/FIQarm核报告外部中断的产生;IC在上报中断之前,如果同时有多个中断产生,就要按照优先级进行排队,把优先级最高的中断送至“当前服务寄存器”,也就是报告给arm核,“当前服务寄存器”需要在中断服务代码中(在内核的中断服务公共代码中)进行清除,以允许新的中断到来;很可能上一个中断服务程序还没有处理完毕,下一个优先级更高的中断就到来了,这样上一个中断服务程序就会被打断,然后执行优先级高的中断服务程序;

    2.   中断嵌套

    相同中断号的中断服务程序是绝对不可能嵌套的,原因(1)IC的中断排队寄存器中,优先级小于等于当前服务中断号的中断是不可能被报告给arm核的;(2)好像在linux内核代码中会使用disable_irq之类的函数禁止当前的中断?;总之,同一个中断服务程序是不会发生嵌套的,嵌套只发生在高优先级的中断打断低优先级的中断,从而发生嵌套;

    3.   中断不可打断/中断不可调度/中断不能睡眠…..的解释

    网上对这类问题的解释太混乱,这里针对arm-linux做出解释:(1)中断上半部是可以睡眠的,但是睡眠会使得内核变得非常复杂,难以追踪代码执行路径,所以强烈不支持在上半部使用会睡眠的函数,这样设计也是为了使得内核变得简单;(2)中断上半部确实不可以被调度,因为它不是一个可以被调度的实体,例如进程或者内核线程;事实上,应该根本就没有“中断可否调度”之类的问题;(3)中断上半部可以被打断,但是只能被优先级更高的中断打断,被打断后就进入高优先级中断的服务程序,也就是实现了中断嵌套;可以使用local_irq_ disable()或者local_irq_save()或者spin_lock_irqsave()禁止本CPU核的所有中断,也就是禁止IRQ线以及FIQ线,这样就不会发生中断的嵌套了;

    4.   发生中断嵌套时的内核状态

    首先看一段代码

    asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)

    {

      struct pt_regs *old_regs = set_irq_regs(regs);

      irq_enter();

      if (unlikely(irq >= NR_IRQS)) {

             if (printk_ratelimit())

                    printk(KERN_WARNING "Bad IRQ%u\n", irq);

             ack_bad_irq(irq);

      } else {

             generic_handle_irq(irq);

      }

      irq_finish(irq);

      irq_exit();

      set_irq_regs(old_regs);

    }

    这是arm平台下处理中断的开始点,每产生一个中断都会调用这个函数;irq_enter()就让内核执行路径进入了中断上下文;irq_exit()让内核退出中断上下文;所有的中断上半部都是在generic_handle_irq(irq)中被调用的,也就很明确的表明了使用request_irq()注册的中断服务程序是运行于中断上下文中的;当发生中断嵌套,假定只有2层嵌套,当高优先级中断服务程序返回后,内核会如何处理呢?irq_enter的作用是禁止抢占,是通过把preempt_count加上HARDIRQ_OFFSET,HARDIRQ_OFFSET代表中断的上半部,preempt_count是进程调度时用到的。也就是系统会根据preempt_count的值来判断是否可以调度。只有当preempt_count0时才可以调度。当调用preempt_disableadd_preempt_count函数时都不可以进行调度,因为都会改变preempt_count的值为非0
    所以irq_enter就是告诉系统,现在正在处理中断的上半部分工作,不可以进行调度。你可能会奇怪,既然此时的irq中断都是都是被禁止的,为何还要禁止抢占?这是因为要考虑中断嵌套的问题,一旦驱动程序主动通过local_irq_enable打开了IRQ[2014.7.8日,事实上,在驱动中注册的中断函数执行时,如果不使用local_irq_disable,中断总是打开的,就是为了允许中断嵌套],而此时该中断还没处理完成,新的irq请求到达,这时代码会再次进入irq_enter,在本次嵌套中断返回时,preempt_count不为0内核不希望进行抢占调度,而是要等到最外层的被打断的中断处理完成后才做出调度动作,所以才有了禁止抢占这一处理 

    5.   一句话总结上半部

    中断嵌套的整个过程都是处于中断上下文中;一旦处于中断上下文,或者说正在执行中断处理,那么当前的CPU核上是不可以被调度一个进程来运行的,由中断处理程序独占,只能被更高优先级的中断打断嵌套;中断上半部可以嵌套;……………注意,前面说的都是中断上半部!!!

    6.   下半部

    下半部虽说有softirqtaskletworkqueue三种机制,但一般只用taskletworkqueueworkqueue 就是一个普通的内核线程,所以它想睡眠就睡眠,任何内核线程能做的事它都可以做,这样的灵活性的代价就是它的效率比tasklet差;tasklet也是工作在中断上下文,下面专门讨论tasklet

    7.   tasklet

    同一个tasklet多次调度可能只会执行一次,所以需要在这种下半部中注意这种问题,比如对控制器的重置就可以使用tasklet,因为多次重置和一次重置的效果是完全一样的,由于do_softirq会判断当前是否处于软中断上下文,如果是,则直接退出不执行tasklet代码;一个tasklet同时只能在一个核上运行,不同的tasklet可以在多核上同时执行;tasklet应该继承了softirq的特点,谁(CPU)调度,谁执行;tasklet处于中断上下文,所以也和普通中断一样,是独占CPU,但是会被优先级更高硬件中断IRQ打断,但是tasklet不会打断tasklet;其实还有很多问题不够明白!!!!!!但写驱动足以;

    8.   关于软中断/tasklet的调用时刻

    一般在中断上半部中会调度tasklet,上半部执行完后,在退出中断上下文时

    void irq_exit(void)

    {……………………………….

    preempt_count_sub(HARDIRQ_OFFSET);

    if (!in_interrupt() && local_softirq_pending())

               invoke_softirq();

    …………………………….

    }

    会用invoke_softirq来尝试运行被激活的软中断,接着__do_softirq,在这里,会关闭软中断并开启硬件(也就是上半部)中断,也就是印证了上面那句话,在同一个cpu上,软中断不可以被软中断打断,但是可以被硬件中断(也就是上半部)打断。

    这里,是不是还可以表明,taskletworkqueue作为下半部而言,tasklet会更快的得到执行。Workqueue应该是在irq_exit结束之后,退出中断上下文后,才有可能被调度。

    展开全文
  • 任务切换就是靠的内核中断。 我是看这的时候知道有内核中断的 搜了下 STM32目前支持的中断共为84个(16个内核+68个外部),16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位)和16个抢占...

    任务切换就是靠的内核中断,

     

    中断优先级序号越大,优先级越低。

     

    内核中断好像直接操作寄存器就可以了。

    我是看这的时候知道有内核中断的

     

    感觉正点原子的讲得好些,先跟你讲cortex-M的中断再给你讲freertos的中断。

    使用freertos时最关心的是14 和15 这两个异常也就是中断。

     

    怪不得原子的STM32书上说外部中断

     

     

    搜了下

    STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。

    http://www.openedv.com/posts/list/43099.htm

    展开全文
  • 内核中断整体流程图

    2020-05-14 09:14:52
    内核中断整体流程图 以龙芯ls2k1000为例进行绘制整体流程图

    内核中断整体流程图

    以龙芯ls2k1000为例进行绘制整体流程图

    龙芯ls2k1000 irq

    展开全文
  • Linux 内核中断内幕

    2014-06-12 11:07:11
  • linux中断--内核中断编程

    千次阅读 2014-04-14 19:24:44
    在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入来了解内核中断的执行过程 一.内核中断程序: 我们还是来看一看成程序: 在看程序之前,要熟悉如何进行模块编程,和了解...
  • 首先说明,答案是否定的,内核中断号可以与硬件中断号不一致,但是这是个无聊的问题。。实用价值不大。但是却可以引起对内核软件中断号与硬件中断号关系的思考。 两者的关系我觉得可以从中断的初始化和分发过程来一...
  • Linux内核中断系统处理机制-详细分析

    万次阅读 多人点赞 2018-08-23 23:09:24
    Linux内核中断 一、中断概述 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再...
  • Linux驱动开发——按键为例介绍Linux内核中断

    千次阅读 多人点赞 2020-12-14 17:49:36
    Linux内核中断1. 简介2. linux内核中中断的注册与注销3. 代码4. 测试 1. 简介      linux的中断处理过程和ARM裸板中的中断处理过程是一致的。不同点在于裸板开始时所有的软件都是自行编程完成的...
  • 答案是否定的,内核中断号能够与硬件中断号不一致。可是这是个无聊的问题。。有用价值不大。可是却能够引起对内核软件中断号与硬件中断号关系的思考。 两者的关系我认为能够从中断的初始化和分发过程来一探到底。 ...
  • 【proc/interrupts】内核中断

    千次阅读 2018-06-25 19:45:30
    首先是内核中断的分类,这里只是根据proc/interrupts下显示的中断进行分类,主要包含外部中断和IPI中断cat proc/interrupts CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 1: 107049 104452 ...
  • Linux内核中断内幕

    2013-05-14 20:43:29
    Linux内核中断内幕 时间:2010-03-30 10:11:30 来源:Linux联盟 作者:   什么是中断  Linux 内核需要对连接到计算机上的所有硬件设备进行管理,毫无疑问这是它的份内事。...
  • Linux内核中断机制(一):中断注册方法

    千次阅读 2016-12-27 22:00:29
    今天在网上看到一份不错的讲解内核中断原理的文章,分享给大家! 1.中断注册方法 在 linux 内核中用于申请中断的函数是 request_irq(),函数原型在Kernel/irq/manage.c 中定义: int request_irq(unsigned ...
  • Linux内核中断系统

    千次阅读 2020-07-20 13:18:15
    点击上方蓝色字关注我们!前言 中断在驱动中是非常常用的,无论是外部的GPIO中断,还是SPI,I2C等发送或接收中断,都是必不可少的。所以今天来看看Linux中的中断处理。中断分类...
  • Linux内核中断机制

    2018-01-15 00:00:00
    (点击上方蓝字,快速关注)为什么需要中断?如果让内核定期对设备进行轮询,以便处理设备,那会做很多无用功,因为外设的...中断处理程序与其他内核函数的区别在于,中断处理程序是被内核调用来响应中断的,而它们运行
  • Linux内核中断嵌套

    千次阅读 2016-10-30 14:47:36
    为了支持中断的嵌套执行,Linux内核在进入中断服务程序之前会将硬中断开启,运行完中断服务程序之后再将硬中断关闭,在这期间硬件中断时可以被抢占的,而软中断执行过程中硬件中断始终是开启的。如果没
  • 内核中断初始化完成并且设备注册了响应的中断后,内核就可以响应相应的中断了。  首先要确定如果一个外设发出中断请求,它到底做了什么,设备是不能直接发出中断的,而是借助中断控制器,设备向中断控制器请求...
  • 内核中断,异常,抢占总结

    千次阅读 2014-03-12 10:16:26
    内核中断,异常,抢占总结篇 一、基本概念 中断分为同步中断和异步中断。同步中断是由CPU控制单元产生的,“同步”是指只有在一条指令执行完毕后,CPU才会发出中断,而不是发生在代码指令执行期间,比如系统调用。...
  • linux内核中断分析

    千次阅读 2016-07-07 21:31:09
    二、Linux内核中断的初始化流程、中断的注册流程、中断的执行流程 三、多核cpu的中断亲和力和中断负载均衡 四、中断的上半部和下半部 一、struct irq_chip、struct irq_desc[]、struct irqaction三者之间的关
  • Linux内核中断:request_irq,free_irq

    千次阅读 2017-08-17 21:55:40
    Linux内核中断   步骤一:打开内核源代码,在里面搜索interrupt.h文件    打开文件后我们可以在里面看到这样的函数 typedef irqreturn_t (*irq_handler_t)(int,void *); 申请中断号 request_irq(unsigned ...
  • Linux内核中断及定时器实现

    千次阅读 2013-09-02 22:48:42
    内核中断及定时器实现分析 定时器是Linux提供的一种定时服务的机制。它在某个特定的时间唤醒某个进程,来做一些工作。Linux初始化时,init_IRQ()函数设定8253的定时周期为10ms(一个tick值)。同样,在初始...
  • 细说内核中断机制

    千次阅读 2018-05-01 20:25:58
     中断通常分为同步中断和异步中断:2 同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。 ◎ 异步中断是由其他硬件设备依照CPU时钟信号随机产生的。...
  • cortex-m3内核中断

    2020-03-07 12:32:33
    m3内核中有一个R/W“中断寄存器阵列”,该阵列记录了外部从0到239个中断的名字PRI_0-239,中断寄存器地址,中断的优先级(8位,stm32用了其中的高4位,复位之后是0)。如下: 另外还有一个应用中断控制与复位寄存器R...
  • Linxu内核中断

    2015-03-15 18:01:29
    中断的定义:中断是指CPU在执行中,出现了某些突变的事件时CPU必须暂停执行当前的程序,转去处理突变事件,处理完毕后CPU又返回原程序被中断的位置并继续执行。1、CPU的处理速度远远大于外设的处理速度,如果CPU要和...
  • Linux内核中断/异常的注册(重要中断函数的查找方法,Linux 2.6.11) 按照下面列出的方式,在trap_init()函数中,可以查找到重点的中断的处理函数有哪些 1. 缺页中断 start_kernel -> trap_init //注册各种中断...
  • 内核中断机制

    2013-01-03 13:57:52
    中断是Linux内核驱动程序中非常重要的地方,但实际上,中断处理程序也没有什么与众不同的地方,它们也就是普通的C程序。  唯一独特的地方就是处理程序是在中断时间内运行的,因此它的行为会受到一些限制。这些...
  • Linux内核中断顶半部和底半部的理解

    千次阅读 多人点赞 2020-07-18 09:58:25
    设备的中断会打断内核进程中的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。但是,这个良好的愿望往往与现实并不吻合。在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,333
精华内容 6,133
关键字:

内核中断