linux设备驱动-按键中断实验笔记

一、开发环境

1、内核:Linux 2.6.22.6;

2、JZ2440

3、ubuntu 9.10、

二、实验笔记

1、ARM架构Linux内核中,有5种常见的异常,中断异常是其一,Linux内核将所有中断统一编号,使用一个irq_desc结构体来描述这些中断,里面记录了中断名称、中断状态、中断标记、并提供了中断的底层硬件访问函数(如:清除、屏蔽、使能中断),提供了这个中断的处理函数入口,通过它还可以调用用户注册的的中断处理函数。

2、中断操作过程

(1)注册中断

调用request_irq向内核注册中断。原型为:

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char * devname, void * dev_id)  

第一个参数irq:中断号,在irqs.h中定义,与架构相关;第二个参数handler:  用户中断处理函数;第三个参数flags:中断标记;第四个参数devname:中断名字;可以通过cat proc/interrupts查看;第五个参数dev_id:  在free_irq中有用,也用作区分中断处理函数。

(2)卸载中断

中断是一种很稀缺的资源,当不再使用一个设备时,应该释放它占据的中断,通过free_irq函数来实现,其原型为:

void free_irq(unsigned int irq, void *dev_id) 

第一个参数irq:中断号,与request_irq中的irq一致,用于定位action链表;
第二个参数dev_id:用于在action链表中找到要卸载的表项;同一个中断的不同中断处理函数必须使用不同的dev_id来区分,这就要求在注册共享中断时参数dev_id必须唯一。 
free_irq函数,根据中断号irq、dev_id从action链表中找到表项,将它移除。

(3)休眠的进入和唤醒

   先使用static DECLARE_WAIT_QUEUE_HEAD(wq)定义并初始化一个等待队列头,并设置condition条件变量;

   使用wait_event函数,linux内核进入休眠,其扩展型常用的函数为wait_event_interruptible(wq, condition),即可被中断打断的休眠。wq是一个等待队列,condition是条件,如果condition = 0,则将会进行休眠,直到condition = 1,并且有唤醒函数唤醒它;

   使用wait_up函数,linux内核唤醒进程,其扩展型常用的函数为wake_up_interruptible(wq),wq与wait_event_interruptible的wq是一致的。


三、命令

insmod 加载模块

rmmod 卸载模块

ps 显示所有进程

ls -l /proc/791/fd/proc/$pid/fd 目录下存放了$pid进程中所有打开的fd

lsmod 显示加载的模块

exec 5</dev/keys 打开中断设备keys,分配进程号5

exec 5<&- 关闭进程号为5中断设备

ls -l /dev 显示所有设备

cat /proc/interrupts 显示中断设备

cat /proc/devices显示设备

top 显示进程的cup占有率等参数

kill -9 pid杀死进程号是pid的进程


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值