精华内容
下载资源
问答
  • 内核中断
    千次阅读
    2022-01-16 15:10:28

    一、中断

      中断分为上半部和底半部。上半部也就是硬中断,软中断只是底半部的一种实现机制
      上半部主要处理有严格时限的工作,比如读取寄存的中断状态,清除中断标志,将底半部处理程序挂到底半部的执行队列中去
    底半部执行大部分耗时的工作,并且可以被其他中断打断
      1、硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)
      2、软中断是一组静态定义的下半部分接口,可以在所有的处理器上同时执行,即使两个类型相同也可以。但是一个软中断不会抢占另外的一个软中断,唯一可以抢占软中断的硬中断。可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU同时操作),因此也需要使用自旋锁来保其数据结构。

    二、中断函数
    1.开关中断

    /************关闭指定中断*************************/
    void enable_irq(unsigned int irq)
    void disable_irq(unsigned int irq) //要等到当前正在执行的中断处理函数执行完才返回
    void disable_irq_nosync(unsigned int irq)  //函数调用以后立即返回
    
    /**************硬中断****************************/
    local_irq_disable():关闭中断
    local_irq_enable():开启中断
    local_irq_save(flags):关闭中断并保存中断标志位
    local_irq_restore(flags):开启中断并清除中断标志位
    
    /*************底半部开关************************/
    local_bh_disable();
    local_bh_enable();
    
    /*************判断中断状态*********************/
    #define in_interrupt() (irq_count())   // 是否处于中断状态(硬中断或软中断)
    #define in_irq() (hardirq_count())     // 是否处于硬中断
    #define in_softirq() (softirq_count()) // 是否处于软中断
    

      disable_irq函数要等到当前正在执行的中断处理函数执行完才返回,因此使用者需要保证不会产生新的中断,并且确保所有已经开始执行的中断处理程序已经全部退出。
      当任务A调用local_irq_disable企图关闭中断1s,然后再开启中断,但在中断中出现了另一个优先级更高的任务B也调用了local_irq_disable关闭中断,然后100ms后执行local_irq_enable开启中断,导致任务A的中断没有持续1s就被打开了,这显然是有问题的,所以需要用到后两个中断函数,当B任务关闭中断的时候保存中断标志位,开启中断的时候清除中断标志位,还原之前的中断状态,才能使任务A继续处于中断状态中正确执行。

    2、申请中断

    int request_irq(unsigned int irq, irq_handle_t handle, unsigned int flags, 
                    const char *name, void* dev_id);
    
    
    int devm_request_irq(struct device *dev, unsigned int irq, irq_handle_t handle, 
                    unsigned int flags, const char *name, void* dev_id);
    

    其中flags代表中断标志,可以取值如下:
      上升沿触发:IRQF_TRIGGER_RISING
      下降沿触发:IRQF_TRIGGER_FALLING
      高电平触发:IRQF_TRIGGER_HIGH
      低电平触发:IRQF_TRIGGER_LOW
      共享中断:IRQF_SHARED

      dev_id代表要传给中断处理程序的私有数据,一般是这个设备的结构体或者NULL
      devm_request_irq和request_irq区别在于前者是申请的内核“managed”资源,不需要自己手动释放,会自动回收资源,而后者需要手动调用free_irq来释放中断资源

    3、释放中断

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

    二、底半部实现机制:软中断、tasklet、工作队列、线程化irq

      1、软中断一般不使用,由于必须要设计为可重入函数,导致复杂度高,并且无法睡眠、不可阻塞,无法重新调度。
      软中断应该保留给系统中对时间要求最严格的下半部使用。目前只有两个子系统直接使用软中断:网络和SCSI。此外,内核定时器和tasklet也是基于软中断实现的。由于同一个软中断可以在不同处理器上同时执行,所以软中断要求对共享资源的处理要非常严格,锁保护的要求很高。

      2、tasklet是在两种软中断类型的基础上实现的,因此如果不需要软中断的并行特性,tasklet就是最好的选择。也就是说tasklet是软中断的一种特殊用法,即延迟情况下的串行执行。
    tasklet由两类软中断代表:HI_SOFTIRQ和TASKLET_SOFTIRQ。这两者唯一的区别在于,HI_SOFTIRQ类型的软中断先于TASKLET_SOFTIRQ类型的软中断执行。

    tasklet_struct my_tasklet;
    void my_tasklet_func(unsigned long);
    //将my_tasklet和my_tasklet_func绑定关联
    DECLARE_TASKLET(my_tasklet, may_tasklet_func, data);
    
    void my_tasklet_func(unsigned long)
    {
        ...
    }
    
    irqreturn_t my_tasklet_demo_interrupt(int irq, void *dev_id)
    {
        ...
        //执行tasklet_shedule调度,会在适当的时候执行my_tasklet_func
        tasklet_shedule(&my_tasklet);
        ...
        return IRQ_HANDLED;
    }
    
    int __init my_tasklet_demo_init(void)
    {
        ...
        int result = request_irq(irq_num, my_tasklet_demo_interrupt, IRQF_SHARED, "my_tasklet_demo", dev_id);
        ...
        return IRQ_HANDLED;
    }
    
    void __exit my_tasklet_demo_exit(void)
    {
        ...
        free_irq(irq_num, my_tasklet_demo_interrupt);
        ...
    }
    

      3、工作队列可以把工作推后,交由一个内核线程去执行。内核线程只在内核空间运行,没有自己的用户空间,它和普通进程一样可以被调度,也可以被抢占。该工作队列总是会在进程上下文执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势,最重要的就是工作队列允许重新调度甚至是睡眠。
      理论上可以用创建内核线程的方式来代替工作队列,但是由于随便创建内核线程会带来其他问题,所以实际上并不建议直接创建内核线程,而应使用工作队列的形式。
      内核中可以创建workqueue队列,将work_struct工作加入workqueue,也可以不加,会默认挂载到内核的工作队列,对应的函数有create_singlethread_workqueue(const char* name)和create_workqueue(const char* name) ,前者只是在当前CPU创建一个work_thread线程去执行工作队列里的work_struct,而后者是在每个CPU上都创建一个work_thread,使用queue_work(struct workqueue_struct *wq, struct work_struct *work)唤醒队列执行,destroy_workqueue(struct workqueue_struct *wq)释放workqueue队列

    struct work_struct my_workqueue;
    void my_wq_func(struct work_struct* work);
    
    /*中断底半部工作队列的处理*/
    void my_wq_func(struct work_struct* work)
    {
        ...
    }
    
    irqreturn_t my_wq_interrupt(int irq, void *dev_id)
    {
        ...
        schedule_work(&my_workqueue);
        ...
        return IRQ_HANDLED;
    }
    
    int __init my_wq_init(void)
    {
        ...
        int result = request_irq(irq_num, my_wq_interrupt, IRQF_TRIGGER_RISING, "my_wq", dev_id);
        //初始化工作队列,并将my_workqueue和my_wq_func处理函数关联
        INIT_WORK(&my_workqueue, my_wq_func);
        ...
        return 0;
    }
    
    void my_wq_exit(void)
    {
        ...
        free_irq(irq_num, my_wq_interrupt);
        ...
    }
    

      4、threaded_irq:内核提供request_threaded_irq和devm_request_threaded_irq为中断分配内核线程,原型如下:

    int request_threaded_irq(unsigned int irq, 
                        irq_handle_t* handle, 
                        irq_handle_t* thread_func, 
                        unsigned long flags, const char* name, void* dev_id);
    
    int devm_request_threaded_irq(struct device* dev, unsigned int irq, 
                        irq_handle_t* handle, 
                        irq_handle_t* thread_func, 
                        unsigned long flags, const char* name, void* dev_id);
    

      其中handle对应的函数执行于中断上下文,thread_func对应的函数执行于内核线程,如果handle的返回值是IRQ_WAKE_THREAD,内核会自动调度对应的线程执行thread_func函数
      若flags中设置IRQF_ONESHOT标志,内核会自动在中断上下文中屏蔽该中断号,防止上半部无法清除中断,导致上半部一退出,瞬间大量中断同时发生导致异常。

    三、中断里不能睡眠

      睡眠会导致进程切换,中断上下文没有进程的概念,中断有自己的内核栈,进程使用的task_struct结构体信息,schedule调度就是去访问这些task_struct,抢占一个进程运行另一个进程,所以中断里无法进行系统调度,如果在中断里睡眠,进程将无法被调度,从而引发内核崩溃
      假设中断里可以睡眠,也就是可以进行进程调度,如果此时内核正执行到临界区,处于加锁状态(一般是自旋锁),切换另一个进程执行到此处无法加锁,就会等待下去,造成死锁。
      用口头语说,就是当程序在运行的时候,突然来个中断,当然是希望你赶紧把中断处理完了继续运行我的程序,要是中断里还睡眠,那我的程序还咋运行了?

    No pains, no gains

    更多相关内容
  • linux内核中断处理.doc

    2019-07-31 13:22:20
    linux内核中断处理.doc
  • 中断分为内核中断和外设中断

    千次阅读 2020-08-12 18:40:34
    任务切换就是靠的内核中断。 我是看这的时候知道有内核中断的 搜了下 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

    展开全文
  • linux内核中断(一)

    千次阅读 2022-04-03 19:39:54
    由于中断的存在极大的提高了 CPU 的运行效率,但是设备的中断会打断内核进程中的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。 二、中断上下文 为保证系统实时性,中断服务程序...

    一、中断简介

    中断是指 CPU 在执行程序的过程中,出现了某些突发事件急待处理,CPU 必须暂停当前程序的执行, 转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。由于中断的存在极大的提高了 CPU 的运行效率,但是设备的中断会打断内核进程中的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。

    二、中断上下文

    为保证系统实时性,中断服务程序必须足够简短,但实际应用中某些时候发生中断时必须处理大量的 事物,这时候如果都在中断服务程序中完成,则会严重降低中断的实时性,基于这个原因,linux 系统提出了一个概念:把中断服务程序分为两部分:中断上下文,也叫做顶半部-底半部 。

    • 中断上文(顶半部):完成尽可能少的比较急的功能,它往往只是简单的读取寄存器的中断状态,并清除中断标志后就进行“中断标记”(也就是把底半部处理程序挂到设备的底半部执行队列中)的工作。 顶半部的特点就是响应速度快。
    • 中断下文(底半部):处理中断的剩余大部分任务,可以被新的中断打断。

    三、linux开发使用中断的总体思路

    linux 中断有专门的中断子系统,其实现原理很复杂,但是驱动开发者不需要知道其实现的具体细节, 只需要知道怎么在设备树中指定中断,如何应用该子系统提供的 API 函数来编写中断相关驱动代码即可其他的事情,比如设备树中的中断控制器,这些都是由原厂的BSP工程师帮我们写好了,我们不需要来修改他。

    四、设备树中配置中断

    如果一个设备需要用到中断功能,开发人员就需要在设备树中配置好中断属性信息,因为设备树是用来描述硬件信息的,然后Linux内核通过设备树配置的中断属性来配置中断功能。

    参考文档:

    内核Documentation\devicetree\bindings\interrupt-controller\interrupts.txt

    1、各级中断中断控制器

    在硬件上,“中断控制器”只有GIC这一个,但是我们在软件上也可以把上图中的“GPIO”称为“中断控制器”。

    GPIO1连接到GIC,GPIO2连接到GIC,所以GPIO1的父亲是GIC,GPIO2的父亲是GIC。

    假设GPIO1有32个中断源,但是它把其中的16个汇聚起来向GIC发出一个中断,把另外16个汇聚起来向GIC发出另一个中断。这就意味着GPIO1会用到GIC的两个中断,会涉及GIC里的2个hwirq。

    这些层级关系、中断号(hwirq),都会在设备树中有所体现。

    2、中断控制器节点的语法

    在设备树中,中断控制器节点中必须有的两个属性:

    interrupt-controller,表明它是“中断控制器”。

    #interrupt-cells,表明引用这个中断控制器的话需要多少个cell。

    #interrupt-cells的,别的节点要引用这个中断控制器时,需要用几个cells来描述

    3、示例


    比如,在imx6u11.dtsi文件,其中的inc节点就是imx6ul1的中断控制器节点,如下图所示:

    imx6ul.dtsi - arch/arm/boot/dts/imx6ul.dtsi - Linux source code (v5.16.16) - Bootlin

    intc: interrupt-controller@a01000 {
    	compatible = "arm,gic-400", "arm,cortex-a7-gic";
    	interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>;
    	#interrupt-cells = <3>;
    	interrupt-controller;
    	interrupt-parent = <&intc>;
    	reg = <0x00a01000 0x1000>,
    		  <0x00a02000 0x2000>,
    		  <0x00a04000 0x2000>,
    		  <0x00a06000 0x2000>;
    };

    compatible 属性值为“arm,cortex-a7-gic”在 Linux 内核源码中搜索“arm,cortex-a7- gic”即可找到 GIC 中断控制器驱动文件。

    interrupt-controller 节点为空,表示当前节点是中断控制器。

    #interrupt-cells #address-cells#size-cells 一样。指它的子节点是用多少个cells来描述一个中断。的对于 ARM 处理的 GIC 来说,一共有 3 个 cells,这三个 cells 的含义如下:

    1. cells:中断类型,0 表示 SPI 中断,1 表示 PPI 中断。
    2. cells:中断号,对于 SPI 中断来说中断号的范围为 0~987,对于 PPI 中断来说中断号的范围为 0~15。
    3. cells:标志,bit[3:0]表示中断触发类型,为 1 的时候表示上升沿触发,为 2 的时候表示下降沿触发,为 4 的时候表示高电平触发,为 8 的时候表示低电平触发。bit[15:8]PPI 中断的 CPU 掩码。

    比如,GPI0的节点也可以作为中断控制器,在imx6ul.dtsi文件中GPlO1的节点内容如下图所示:

    gpio1: gpio@209c000 {
    	compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
    	reg = <0x0209c000 0x4000>;
    	interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
    				 <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
    	clocks = <&clks IMX6UL_CLK_GPIO1>;
    	gpio-controller;
    	#gpio-cells = <2>;
    	interrupt-controller;
    	#interrupt-cells = <2>;
    	gpio-ranges = <&iomuxc  0 23 10>, <&iomuxc 10 17 6>,
    				  <&iomuxc 16 33 16>;
    };

    interrupts中就是用三个cells来描述中断的:

    interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>
    • GIC_SPI:代表共享中断(GIC_PPI代表私有中断)
    • 66:代表中断号,一组gpio共享一个中断号
    • IRQ_TYPE_LEVEL_HIGH:中断类型
    打开可以打开《IMX6ULLRM.pdf》的“Chapter 3 Interrupts and DMA Events”章节,找到表 3-1
    GPIO1 一共用了 2 个中断号,一个是 66 ,一个是 67
    66  对 应 GPIO1_IO00~GPIO1_IO15 这低 16 IO 67  对应 GPIO1_IO16~GPIOI1_IO31 这高 16 IO
    interrupt- controller 表明了 gpio1 节点也是个中断控制器,用于控制 gpio1 所有 IO 的中断。

    上述工作都是由原厂的BSP工程师来帮我们写好的,并不需要我们来写。我们需要关注的点是怎么在设备树里面描述一个外设的中断节点,我们来看一个例子:

    在这个例子中,我们先使用pinctrl和gpio子系统把这个引脚设置为了gpio功能,因为我们在使用中断的时候需要把引脚设置成输入。然后使用interrupt-parent和interrupts 属性来描述中断。

    我们的引脚使用的是gpiol里面的io18,所以我们使用的是gpio1这个中断控制器

    interrupts属性设置的是中断源,为什么里面是俩个cells呢,因为我们在gpio1这个中断控制器里面#interrupt-cells的值为2

    五、驱动代码中使用中断

    1、获取中断号

    当在设备数中使用了interrupt-parent和interrupts 属性来描述中断后,可以通过irq_of_parse_and_map来获取中断号。gpio中断也可以不使用这两个属性,直接通过gpio号来获取中断号。

    2、request_irq 函数申请中断

    request_irq 函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用

    request_irq 函数会激活(使能)中断,所以不需要我们手动去使能中断

    int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)
    irq :要申请中断的中断号。  
    handler :中断处理函数,当中断发生以后就会执行此中断处理函数。
    flags :中断标志,可以在文件 include/linux/interrupt.h 里面查看所有的中断标志
    name :中断名字,设置以后可以在 /proc/interrupts 文件中看到对应的中断名字。
    dev :如果将 flags 设置为 IRQF_SHARED 的话, dev 用来区分不同的中断,一般情况下将 dev 设置为 设备结构体,dev 会传递给中断处理函数 irq_handler_t 的第二个参数。
    返回值 0 中断申请成功,其他负值 中断申请失败,如果返回 -EBUSY 的话表示中断已经被申请了。

    3、编写中断处理函数

    使用 request_irq 函数申请中断的时候需要设置中断处理函数,中断处理函数格式如下所示:

    irqreturn_t (*irq_handler_t) (int, void *)

    第一个参数是要中断处理函数要相应的中断号。

    第二个参数是一个指向 void 的指针,也就是个通用指针,需要与 request_irq 函数的 dev 参数保持一致。用于区分共享中断的不同设备,dev 也可以指向设备数据结构。

    中断处理函数的返回值为 irqreturn_t 类型,定义如下所示:

    enum irqreturn {
    IRQ_NONE = (0 << 0),  //表示不是本驱动的中断不处理
    IRQ_HANDLED = (1 << 0), //表示正常处理,通常是这个
    IRQ_WAKE_THREAD = (1 << 1), //表示在中断下文中处理
    }typedef enum irqreturn irqreturn_t;
    一般中断服务函数返回值使用如下形式: return IRQ_RETVAL(IRQ_HANDLED)

    4、释放中断资源

    中断使用完成以后就要通过 free_irq 函数释放掉相应的中断。如果中断不是共享的,那么 free_irq 会 删除中断处理函数并且禁止中断。free_irq 函数原型如下所示:

    void free_irq(unsigned int irq, void *dev)
    irq :要释放的中断。
    dev :如果中断设置为共享 (IRQF_SHARED) 的话,此参数用来区分具体的中断。共享中断
    只有在释放最后中断处理函数的时候才会被禁止掉。

    5、中断使能和禁止函数

    常用的中断使用和禁止函数如下所示:

    void enable_irq(unsigned int irq);
    void disable_irq(unsigned int irq);
    void disable_irq_nosync(unsigned int irq);
    • disable_irq 函数要 等到当前正在执行的中断处理函数执行完才返回,因此使用者需要保证不会产生新的中断,并且确保所有已经开始执行的中断处理程序已经全部退出。
    • disable_irq_nosync 函数调用以后立即返回,不会等待当前中断处理程序执行完毕。

    6、其他

    local_irq_disable(); //屏蔽中断 
    local_irq_enable(); //打开中断 
    local_irq_save(flags); //禁止中断并保存当前 CPU 中断信息 
    local_irq_restore(flags); //打开中断并回复之前保存的 CPU 中断信息

    六、综合示例:

    1、设备树

     2、驱动代码

    3、调试手段

    查看中断是否申请注册成功:cat /proc/interrupts命令

    其中:48就是中断号

    拿到中断号之后,可以看这个中断触发了多少次:

    ref:

    韦东山:在Linux设备树(DTS)中指定中断_在代码中获得中断(附.视频) - 知乎

    【北京迅为】嵌入式学习之Linux驱动篇_哔哩哔哩_bilibili

    https://elixir.bootlin.com/linux/v5.16.16/source/arch/arm/boot/dts/imx6ul.dtsi

    展开全文
  • linux中断--内核中断编程.docx
  • Linux内核中断分析.pdf

    2021-09-06 23:35:54
    Linux内核中断分析.pdf
  • Linux内核中断之获取中断号

    千次阅读 2021-05-18 15:09:39
    Linux内核中可使用platform_get_irq()函数获取dts文件中设置的中断号。函数原型:int platform_get_irq(struct platform_device *dev, unsigned int num)定义文件:drivers\base\platform.c一、调用流程中断号获取...

    Linux内核中可使用platform_get_irq()函数获取dts文件中设置的中断号。

    函数原型:int platform_get_irq(struct platform_device *dev, unsigned int num)

    定义文件:drivers\base\platform.c

    一、调用流程

    中断号获取函数platform_get_irq()调用流程如下:

    platform_get_irq()->

    of_irq_get()->

    of_irq_parse_one() ## 解析dts中中断相关属性,填充结构体of_phandle_args中的args[]参数

    irq_create_of_mapping()->

    of_phandle_args_to_fwspec() ## 将of_phandle_args->args[]赋值给fwspec->param[],给translate使用

    irq_create_fwspec_mapping()->

    irq_domain_translate()-> ## 获取中断号和中断触发类型

    translate()-> ## 对应某个版本的gic处理函数

    rk3399使用的是GICv3,对应irq_domain->name。

    文件:drivers/irqchip/irq-gic-v3.c。

    translate()函数实现如下:

    static const struct irq_domain_ops gic_irq_domain_ops = {

    .translate = gic_irq_domain_translate, ## .translate的实现函数

    ...

    };

    static int gic_irq_domain_translate(struct irq_domain *d,

    struct irq_fwspec *fwspec,

    unsigned long *hwirq,

    unsigned int *type)

    {

    ...

    switch (fwspec->param[0]) {

    case 0: /* SPI */

    *hwirq = fwspec->param[1] + 32; ## 中断号

    break;

    case 1: /* PPI */

    *hwirq = fwspec->param[1] + 16; ## 中断号

    break;

    case GIC_IRQ_TYPE_LPI: /* LPI */

    *hwirq = fwspec->param[1]; ## 中断号

    break;

    default:

    return -EINVAL;

    }

    *type = fwspec->param[2] & IRQ_TYPE_SENSE_MASK; ## 中断触发类型

    ...

    }

    二、应用举例

    以RockPI 4A单板Debian系统Linux 4.4内核中的获取HDMI中断号为例。

    1、查找中断号

    从手册“Rockchip RK3399 TRM V1.3 Part1.pdf”中,可以查到HDMI_IRQ中断号,即55。

    471f3273333c

    RK3399中断

    2、dts配置

    文件:arch/arm64/boot/dts/rockchip/rk3399.dtsi

    hdmi: hdmi@ff940000 {

    compatible = "rockchip,rk3399-dw-hdmi";

    ...

    interrupts = ;

    ...

    }

    hdmi使用的是GIC_SPI中断,按照gic_irq_domain_translate()函数中处理,需要将中断号55减去32,得到dts中的中断号23。

    注:interrupts =

    3、驱动函数

    文件:drivers\gpu\drm\rockchip\dw_hdmi-rockchip.c

    static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,

    void *data)

    {

    ...

    irq = platform_get_irq(pdev, 0);

    ...

    }

    此时,irq返回值为55。

    后续会介绍GIC和中断注册等实现函数。

    展开全文
  • 细说内核中断机制

    千次阅读 2018-05-01 20:25:58
     中断通常分为同步中断和异步中断:2 同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。 ◎ 异步中断是由其他硬件设备依照CPU时钟信号随机产生的。...
  • linux内核中断[定义].pdf
  • Linux 2.4内核中断之探析.pdf
  • 优化的μCOS-III实时内核中断管理机制.docx
  • linux内核中断实例

    2012-04-11 10:25:59
    linux内核中断实例,可能通过模块参数插入指定的中断中
  • Linux内核中断顶半部和底半部的理解

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

    千次阅读 2016-10-30 14:47:36
    为了支持中断的嵌套执行,Linux内核在进入中断服务程序之前会将硬中断开启,运行完中断服务程序之后再将硬中断关闭,在这期间硬件中断时可以被抢占的,而软中断执行过程中硬件中断始终是开启的。如果没
  • Linux内核中断分析

    2010-04-28 15:43:56
    Linux内核中断分析,希望对初学者有所帮助!
  • 内核中断的流程说的很清楚,学习Linux的必备资料
  • 细说Linux内核中断机制(详)

    千次阅读 2018-07-20 23:04:21
    本文着重介绍Linux内核中断处理的始末流程,因此对一些基本的概念应该有所了解。 2.硬件支持 我们知道,CPU有一个INTR引脚,用于接收中断请求信号。 而中断控制器用于提供中断向量,即第几号中断。 3.内核需要...
  • Linux内核中断系统

    万次阅读 2020-07-20 13:18:15
    点击上方蓝色字关注我们!前言 中断在驱动中是非常常用的,无论是外部的GPIO中断,还是SPI,I2C等发送或接收中断,都是必不可少的。所以今天来看看Linux中的中断处理。中断分类...
  • 内核中断处理内核中断处理内核中断处理 内核中断处理
  • linux内核中的中断与异常,结合深入理解linux内核、linux内核的设计与实现、linux内核源代码情景分析三本书做出来的ppt,看ppt时请结合深入理解linux内核或者linux内核的设计与实现。 自己做的ppt,有错误之处请指出...
  • 中断中断处理程序1 中断2 中断处理程序3 注册中断处理程序4 编写中断处理程序共享的中断处理程序中断处理程序实例5 中断上下文6 中断处理机制的实现7 中断控制禁止和激活中断禁止指定中断线中断系统的状态 1 中断 ...
  • Linux驱动开发——按键为例介绍Linux内核中断

    千次阅读 多人点赞 2020-12-14 17:49:36
    Linux内核中断1. 简介2. linux内核中中断的注册与注销3. 代码4. 测试 1. 简介      linux的中断处理过程和ARM裸板中的中断处理过程是一致的。不同点在于裸板开始时所有的软件都是自行编程完成的...
  • 1 什么是中断 Linux 内核需要对连接到计算机上的所有硬件设备进行管理,毫无疑问这是它的份内事。 如果要管理这些设备,首先得和它们互相通信才行,一般有两种方案可实现这种功能: l 轮询(polling) 内核定期对...
  • Linux内核中断机制

    2010-02-04 10:31:52
    Linux内核中断机制,值得看看啊。 Linux内核中断机制,值得看看啊。 Linux内核中断机制,值得看看啊。 Linux内核中断机制,值得看看啊。
  • 北大计算机系考研资料 增补资料3:北大操作系统大题最长考内容——之中断和系统调用,一般的教材不包括,但重要且常考
  • ARM--中断学习-讲的十分到位。值得一看,包括中断注册方法、中断处理过程等
  • request_irq的作用是申请使用IRQ并注册中断处理程序。 request_irq()函数的原型如下: /* kernel/irq/manage.c */ int request_irq( unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), ...
  • 问题 最近在使用STM32F3芯片的时候...他们是Cortex-M核所共有的,因此这里不针对与具体用的STM32 MCU,直接上升到 Cortex-M内核来了解一下! 简介   中断(也称为“异常”)是微控制器一个很常见的特性。中断一......
  • Linux内核栈和中断

    千次阅读 2019-08-09 11:47:21
    内核栈 #define MIN_THREAD_SHIFT (14 + KASAN_THREAD_SHIFT) #define THREAD_SIZE (UL(1) << THREAD_SHIFT) union thread_union { #ifndef CONFIG_THREAD_INFO_IN_TASK struct thread_info ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 251,498
精华内容 100,599
关键字:

内核中断