Linxu内核中断

来源:互联网 发布:熊猫手机直播软件下载 编辑:程序博客网 时间:2024/06/06 12:52

中断的定义:中断是指CPU在执行中,出现了某些突变的事件时CPU必须暂停执行当前的程序,转去处理突变事件,处理完毕后CPU又返回原程序被中断的位置并继续执行。

1、CPU的处理速度远远大于外设的处理速度,如果CPU要和外设进行通信,CPU可以采用轮训的方式,但是这种方式让CPU的资源无法得到更好的利用,并且CPU只能做一件事,也会做很多无用功,如果采用中断,CPU可以再外设没有准备就绪的时候,可以做别的任务(进程、中断),一旦设备就绪,外设就会给CPU发送一个中断信号,CPU处理外设,处理完毕,接着执行之前被打断的任务继续执行,保证了CPU的资源得到更好的利用。

2、中断的硬件触发流程:
硬件外设产生硬件的电信号变化,这个电信号首先发送给中断控制器(能够打开,关闭中断,能够指定中断的优先级,还能够判断是否发生),中断控制器判断是否使能,判断优先级,最终决定是否给CPU发送一个电信号,CPU一旦监测到这个电信号以后,CPU后续就要处理这个中断。

3、Linxu内核如何实现中断的编程?
1)GPIO对于内核是一种资源,系统调用号对于内核是一种资源,设备号对于内核是一种资源,物理内存对于内核是一种资源,同样硬件中断对于内核是一种宝贵的资源,所以内核在处理中断时,首先要向内核申请中断资源。
2)中断的处理流程包括4部分:建立异常向量表,编写保存现场的代码,编写回复现场的代码,编写硬件中断对应的服务程序。
对于一般的ARM裸板程序,需要完全自己实现4部分。但是在内核中断编程时,前三部分都是内核已经实现好,对于驱动开发只需要实现第四步,编写硬件中断对应的服务程序。
3)内核如何去申请硬件中断资源和注册对应的硬件中断的服务程序?
int request_irq(unsigned int irq,int irq,irq_handler_t handler,unsigned long irqflags,const char* name,void* dev_id);
函数的功能:
1)向申请硬件中断资源
2)注册这个硬件中断对应的服务程序,一旦这个中断被触发,内核就会调用这个中断对应的服务程序;
参数:
irq:待申请的中断号,在内核空间中,用中断号来表示硬件中断资源,内核用IRQ_EINT(0)来表示外部中断0,用IRQ_EINT1(1)来表示外部中断1,这些宏都是在内核平台头文件中定义,有芯片公司实现,中断号0-31内核保留。
handler:待注册的中断处理函数,一旦注册成功,中断发生时,内核就会调用此函数来处理中断。
irqflags:中断标志,
常见的中断标志:
IRQF_SHARED:表示多个设备共享中断
IRQF_SAMPLE_RANDOM:用于随机数种子的随机采样
IRQF_TRIGGER_RISING:上升沿触发中断
IRQF_TRIGGER_FALLING:下降沿触发中断
IRQF_TRIGGER_HIGH:高电平触发中断
IRQF_TRIGGER_LOW:低电平触发中断
IRQF_DISABLE:本中断子在处理的时候,其他中断进行屏蔽
以上宏可以做位或运算,例如对于按键,如果指定它的硬件中断触发方式为上升沿或下降沿触发:
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
最终给中断控制器配置,如果硬件中断是内部中断(外设涉及中断触发方式无人为去配置),中断标志这个参数给0

name:中断设备的名称,出现在cat /proc/interrupts,一般用于调试,看中断是否注册
dev_id:传递的中断处理函数的指针,通常用于共享中断时传递的设备结构指针,可以通过dev_id 给中断处理函数传递参数,
如果不传递参数,指定为NULL

int datat = 0x55;
void* thread_func(void* arg)
{
int*tmp = (int * )arg;
*tmp = 0x55;
…..
}
pthread_create(&id,NULL,thread_function,&data)

返回:成功返回0,失败返回负值
-EINVAL:表示申请的中断号无效或者中断的处理函数指针为空
指针为空:
-EBUSY:表示中断已经被占用并且不能共享

硬件中断如果不在使用一定要释放硬件中断资源和卸载对应的处理函数:
free_irq(int irq,void*dev_id);
函数功能:释放中断和卸载对应的处理函数
参数:
irq:中断号
dev_id:这个参数一定要和注册中断时传递的参数保持一致,否则内核崩溃
案例:实现按键中断

中断处理函数的原型:
irqreturn_t (irq_handler_t )(int irq,voiddev_id);
irq:中断号
dev_id:在注册中断处理函数时传递过来的参数
返回值:
IRQ_NONE:中断未做处理处理应该翻译
IRQ_HANDLED:正常后处理应该返回的值

0 0
原创粉丝点击