中断处理(国嵌笔记)

硬件相关


 1.向内核注册中断函数
 2.实现中断处理函数

1.注册
requst_irq
FLAGS
2.6->IRQF_DISABLED (2.4->SA_INTERRUPT)
IRQF_SHARED(SA_SHIRQ)


快速/慢速中断
快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。




共享中断:
将不同的设备挂到同一个中断信号线上。linux对共享支持主要是为PCI设备服务
1.申请时使用设置IRQF_SHARED
2.dev_id参数必须是唯一的。因为要用它来识别具体那一个设备
3.不能使用disable_irq.因为使用了这个函数,共享中断信号线的其他设备将同样无法使用中断,也就无法正常工作了。
2.中断处理程序
是普通的C代码
中断处理程序是在中断上下文中运行的,他的行为受到某些限制:
1.不能向用户空间发送或接受数据
2.不能使用可能引起阻塞的函数
3.不能使用可能引起调度的函数 


3.中断处理流程
void short_sh_interrupt(int irq,void * dev_id,struct pt_regs *regs)
{
//判断是否是本设备产生了中断
//这样做的目的是为了共享中断,共享中断发生之后,共享中断的所有中断程序都要执行一遍,在这里面进行判断确定是否为当前设备产生的中断
//这样进行一次判断也是好的,能够再确定。
value=inb(short_base);
if(!(value&0x80))
return;
//清除中断位(如果设备支持自动清除,则不需要这步)
//读清除
//手工清除
outb(value&0x7F,short_base);


//中断处理,通常是数据接收

······
//唤醒等待数据的进程
wake_up_interruptible(&short_queue);
}

4. 释放中断
当设备不再需要使用中断时(通常在驱动卸载)应当把他们返还给系统,使用


void gree_irq(); 




eg:按键驱动程序 
Mini2440_buttons.c
混杂设备
阻塞读取 wait_event_interruptible  wake_up_interruptible
poll :1.poll_wait 2.返回掩码




应用程序
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/select.h>
#include<sys/time.h>
#include<errno.h>


int main(void)
{
int buttons_fd;
int key_value;

buttons_fd=open("/dev/buttons",0);
if(buttons_fd<0)
{
perror("open device buttons");
exit(1);
}
for(;;)//为什么是死循环,若不是死循环会发送什么
{
fd_set rds;
int ret;

FD_ZERO(&rds);
FD_SET(buttons_fd,&rds);

ret=select(buttons_fd+1,&rds,NULL,NULL,NULL);

if(ret<0)
{
perror("select");
exit(1);
}
if(ret==0)
{
printf("timeout.\n");
}else if(FD_ISSET(buttons_fd,&rds)){
int ret =read(buttons_fd,&key_value,sizeof(key_value));
if(ret != sizeof(key_value)){
if(errno!=EAGAIN)
perror("read buttons\n");
continue;
}else{
printf("buttons_value: %d\n",key_value);
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值