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

Linux Irq domain

可以参考内核文档IRQ-domain.txt 为什么引入IRQ-Domain 当早期系统只存在一个interrupt-controller时候,而且中断数目也不多时候,一个很简单做法就是一个中断号对应到...linux内核为了应对此问题,引入了IRQ-domain概念 irq-domain引入相当于一个中断控制器就是一个irq-domain。就是一个中断区域。...利用树状结构可以充分利用irq数目,而且每一个irq-domain区域可以自己去管理自己interrupt特性 IRQ-Domain作用 咋们通过/proc/interrupt值来看下irq-domain...而Hwirq-num就是dts中配置irq号 而第一列就是对应softirq-num,也就是request_irq时传入irq 中断控制器级联情况图 hwirq到softirq映射 当开机之后...这里有两种映射方式一种是线性映射,一种是树形映射 irqirq_desc关系 在分配一个softirq时候,其实最终也会分配一个irq_desc结构 这里有两种管理方式,一种是通过线性固定开机固定分配好了

1.2K20

local_irq_disable和disable_irq区别

local_irq_disable: local_irq_disable功能是屏蔽当前CPU上所有中断,通过操作arm核心中寄存器来屏蔽到达CPU上中断,此时中断控制器中所有送往该CPU上中断信号都将被忽略...; } kernel/include/linux/irqflags.h #define raw_local_irq_disable() arch_local_irq_disable() #define...该irq num对应irq handler不会在任何一个CPU上执行。这个操作是通过设置中断控制器中寄存器来对指定中断进行屏蔽,而其他未屏蔽中断依然可以正常送往CPU。...->irq_ack(&desc->irq_data); } irq_state_set_masked(desc); } 该函数中调用就是chip中irq_mask和irq_ack...来操作chip中寄存器.其中irqd_irq_disabled就是用来判断该中断是否被其他CPU给disable了,这里disable就是调用disable_irq函数来做,由此可见,使用disable_irq

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

ARM Linux中断服务程序工作在ARMIRQ模式吗?

大家都知道,ARM有IRQ, FIQ, USR,SVC,ABORT等各种模式。当系统收到IRQ时候,会进入ARMIRQ模式。...那么,ARM Linux各种驱动中断服务程序工作在ARMIRQ模式吗? 答案是否定。 我们加一段汇编来读CPSR: ? 然后我们随便找一个ARM Linux中断服务程序去打印CPSR: ?...然后我们发现打印出来值是: cpsr:40000193 低8位二进制是10010011 那么对应ARM CPSR查询,可以看出CPU处于ARMSVC模式(低5位是10011),而且I bit被设置...(第7位是1),所以是禁止IRQ。...可见,ARM Linux最初进入IRQ模式后,比较快速地从IRQ模式切换到了SVC模式,但是这个时候,并没有使能CPSRI bit,所以仍然是禁止其他中断嵌套进入

3K20

ARM(十二).ADC with IRQ1

Target not created 选择H-JTAG ARM 模式 选择正确模式 使用外部工具 代码示例 adc_irq.s 这是主汇编程序,定义了中断向量表,进行了各种初始化 GET s3c2410...;Not Assigned,什么事也不做,相当于while(1) LDR PC, (Vect_Table +24) ;IRQ,将(Vect_Table + 24)中地址加载到PC中,也就是跳转到(...;相当于(Vect_Table + 20),并且将.值加载到其中 DCD IRQ_Handler ;相当于(Vect_Table + 24),并且将IRQ_Handler值加载到其中 DCD...;B Default_IRQ_ISR代表啥都不干(因为上面对Default_IRQ_ISR中操作定义就是啥都没干) EINT1_Handle B Default_IRQ_ISR...R0中 LDR R1, =IRQ_Vecotr ;将中断向量表基址存到R1中 ADD R1, R1, R0, LSL #2 ;将R0逻辑左移2位,加上R1,结果放到R1中,其实就是R1=R1

71820

ARM(六).TIMER and IRQ(2)

main.c 主 c 程序中定义了中断处理程序 #include "2440addr.h" //将"2440addr.h"包含进来,这里面放是所有寄存器地址宏 int i; //定义一个全局计数器...,用来数中断个数 void Timer0Init(void) //timer0初始化程序 { rTCFG0 = 124; //TCFG0(定时器配置寄存器0) 设定timer0预标定器值为...) 设定timer0分频值为 1/4分频,每个定时器有一个时钟分频器,其可以生成5种不同分频信号(1/2,1/4,1/8,1/16和TCLK) //定时器输出时钟频率 = PCLK/{prescaler...{ BuzzerInit(); //蜂鸣器初始化 Timer0Init(); //timer0初始化 while(1); //无限循环 } 编译执行 [Build]->[Debug]...Interrupt mode control INTMSK EQU 0x4a000008 ;Interrupt mask control PRIORITY EQU 0x4a00000c ;IRQ

66630

ARM(六).TIMER and IRQ(1)

正确设定内存(只读栈和读写栈,也就是代码区与数据区大小) 选择H-JTAG ARM 模式 选择正确模式 使用外部工具 代码示例 timer_irq.s 这是主汇编程序,定义了中断向量表,进行了各种初始化...;Not Assigned,什么事也不做,相当于while(1) LDR PC, (Vect_Table +24) ;IRQ,将(Vect_Table + 24)中地址加载到PC中,也就是跳转到(...;相当于(Vect_Table + 20),并且将.值加载到其中 DCD IRQ_Handler ;相当于(Vect_Table + 24),并且将IRQ_Handler值加载到其中...;B Default_IRQ_ISR代表啥都不干(因为上面对Default_IRQ_ISR中操作定义就是啥都没干) EINT1_Handle B Default_IRQ_ISR...)所代表寄存器值存到R0中 LDR R1, =IRQ_Vecotr ;将中断向量表基址存到R1中 ADD R1, R1, R0, LSL #2 ;将R0逻辑左移2位,加上

58330

6.分析request_irq和free_irq函数如何注册注销中断(详解)

上一节讲了如何实现运行中断,这些都是系统给做好,当我们想自己写个中断处理程序,去执行自己代码,就需要写irq_desc->action->handler,然后通过request_irq()来向内核申请注册中断...,就是(irq_desc+ irq )->action->handler unsigned long  irqflags: 触发中断参数,比如边沿触发, 定义在linux/interrupt.h。         ...2.request_irq()是注册中断,同样卸载中断函数是free_irq() free_irq()也位于kernel/irq/ manage .c,函数原型如下: free_irq(unsigned...int irq, void *dev_id); 参数说明: unsigned int  irq:要卸载中断号 void  *dev_id:这个是要卸载中断action下哪个服务函数, 2.1 free_irq...); } #endif } 从上面分析,free_irq()函数主要通过irq和dev_id来找要释放中断action 若释放中断action不是共享中断(为空),则执行: *

2.8K90
领券