Linux驱动学习——中断、定时器

本文介绍了Linux内核中断处理的原理和流程,包括中断源、中断控制器、中断处理函数及其要求。还详细讲解了中断编程,如request_irq函数的使用,以及中断共享的概念。此外,探讨了Linux内核中断处理程序的结构,如顶半部和底半部,涉及到tasklet和工作队列的实现机制。最后,文章讨论了Linux内核定时器的运作,包括系统定时器硬件的特点、内核定时器的数据结构和使用方法。
摘要由CSDN通过智能技术生成

中断

Linux内核有中断功能的原因:

外设的处理速度远远慢于CPU,如果不采取中断机制,CPU获取外设数据只能靠轮询,这样会降低处理器的利用率。

 

中断源----->中断控制器----->CPU

                        (硬件)

ARM处理器的中断控制器集成在CPU内部,外设和CPU之间的中断信号要靠中断控制器来控制,中断控制器可以管理中断,屏蔽、使能中断、设置优先级等。

 

中断处理流程

CPU响应中断请求后,保护现场(压栈),跳转至异常向量表。Linux内核在初始化时建立异常向量表,向量表的起始地址在0xFFFF0000,异常向量表的每一个处理函数的入口,都有保存现场、恢复现场的代码(内核已经实现)。中断处理函数返回后,恢复现场。

 

中断编程

中断申请:

       intrequest_irq (unsigned int irq, irq_handler_t handler,unsigned long irqflags,

                                                        constchar *name, void *dev_id);

irq:中断号,Linux内核每一个硬件中断都有对应的中断号,对于ARM架构,0 ~ 31号内核保留,所以每个硬件对应的中断号从32开始。

irqflags:中断标志

       IRQF_SHARED:表示多个设备共享终端。

       IRQF_SAMPLE_RANDOM:用于随机数种子的随机采样。

       IRQF_TRIGGER_RISING/ IRQF_TRIGGER_FALLING

IRQF_TRIGGER_HIGH   / IRQF_TRIGGER_LOW:

对于内部中断irqflags一般指定0。

name:中断名称,申请成功后可通过cat /proc/interrupts 查看中断的注册信息。

 

irqretrun_t (*irq_handler_t) (int irq ,void *dev_id);

中断处理成功返回IRQ_HANDLED;如果无需处理返回IRQ_NONE。

中断处理函数的要求:

1.       中断处理函数不隶属于任何进程,不参与进程的调度和切换。

2.       中断处理函数不能直接和用户空间进行数据交互,如果要进行数据交互,要配合系统调用。

3.       内核为中断分配的栈只有1页。

<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值