中断
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页。
<