首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

5.分析内核中断运行过程,以及中断3大结构体:irq_descirq_chip、irqaction(详解)

本节目标:    分析在linux中的中断是如何运行的,以及中断3大结构体:irq_descirq_chip、irqaction 在裸板程序中(参考stmdb和ldmia详解): 1.按键按下, 2...., { r0-r12,pc }^ //^表示将spsr的值复制到cpsr,因为异常返回后需要恢复异常发生前的工作状态 在linux中: 需要先设置异常向量地址(参考linux应用手册P412): 在ARM...而linux内核中异常向量基地址是0xffff0000(虚拟地址), 位于代码arch/cam/kernel/traps.c,代码如下: void __init trap_init(void) {...*desc = irq_desc + irq; // irq_desc是个数组(位于kernel/irq/handle.c) if (irq >= NR_IRQS) desc = &bad_irq_desc...代码如下: desc->handle_irq(irq, desc);//相当于执行irq_desc[irq]-> handle_irq(irq, irq_desc[irq]); 它会执行handle_irq

1.5K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    __disable_irq() 和 __enable_irq()定义在哪?

    前段时间一工程师向我咨询了一个问题,问我为什么他的MCU KEIL工程代码里没有找到__disable_irq() 和 __enable_irq()的具体定义,是不是有问题。...__disable_irq() 和 __enable_irq() 是所谓的intrinsic函数,编译器自动识别并替换为相关的指令,它们其实是编译器的一部分,实际的定义位于arm_compat.h 文件中...这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,当中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空...实际测试如果在调用__disable_irq()后、__enable_irq()之前的这3s时间内按下按键,并不会进入中断翻转LED,虽然这时中断标志位已经产生了。...但是调用__enable_irq()之后就会立刻进入到中断服务函数中。

    21410
    领券