你的第一个中断处理程序
2011-02-16 13:23
225 查看
//平台:ubuntu9.10
#include "linux/init.h"
#include "linux/module.h"
#include "linux/kernel.h"
#include "linux/interrupt.h"
static int irq;
static char * interface;
module_param(interface,charp,0644);
module_param(irq,int,0644);
static irqreturn_t myinterrupt(int irq,void * dev_id)
{
static int mycount = 0;
static long mytime = 0;
struct net_device *dev=(struct net_device *)dev_id;
if(mycount==0){
mytime=jiffies;
}
//count the interval between two irqs
if (mycount < 10) {
mytime=jiffies-mytime;
printk("Interrupt number %d — intterval(jiffies) %ld — jiffies:%ld /n", irq,mytime, jiffies);
mytime=jiffies;
//printk("Interrupt on %s —–%d /n",dev->name,dev->irq);
}
mycount++;
return IRQ_NONE;
}
static int __init myirqtest_init(void)
{
printk ("My module worked!/n");
//regist irq
//if (request_irq(irq,&myinterrupt,SA_SHIRQ,interface,&irq)) { //early than 2.6.23
if (request_irq(irq,&myinterrupt,IRQF_SHARED,interface,&irq)) { //later than 2.6.23
printk(KERN_ERR "myirqtest: cannot register IRQ %d/n", irq);
return -EIO;
}
printk("%s Request on IRQ %d succeeded/n",interface,irq);
return 0;
}
static void __exit myirqtest_exit(void)
{
printk ("Unloading my module./n");
free_irq(irq, &irq); //release irq
printk("Freeing IRQ %d/n", irq);
return;
}
module_init(myirqtest_init);
module_exit(myirqtest_exit);
MODULE_AUTHOR("lin.tang");
MODULE_LICENSE("GPL");
对应Makefile文件:
obj-m += interrupt.o
#generate the path
CURRENT_PATH:=$(shell pwd)
#the current kernel version number
LINUX_KERNEL:=$(shell uname -r)
#the absolute path
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
#complie object
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#clean
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
//参考文档:
http://www.kerneltravel.net/?p=133
http://edsionte.com/techblog/archives/1521
#include "linux/init.h"
#include "linux/module.h"
#include "linux/kernel.h"
#include "linux/interrupt.h"
static int irq;
static char * interface;
module_param(interface,charp,0644);
module_param(irq,int,0644);
static irqreturn_t myinterrupt(int irq,void * dev_id)
{
static int mycount = 0;
static long mytime = 0;
struct net_device *dev=(struct net_device *)dev_id;
if(mycount==0){
mytime=jiffies;
}
//count the interval between two irqs
if (mycount < 10) {
mytime=jiffies-mytime;
printk("Interrupt number %d — intterval(jiffies) %ld — jiffies:%ld /n", irq,mytime, jiffies);
mytime=jiffies;
//printk("Interrupt on %s —–%d /n",dev->name,dev->irq);
}
mycount++;
return IRQ_NONE;
}
static int __init myirqtest_init(void)
{
printk ("My module worked!/n");
//regist irq
//if (request_irq(irq,&myinterrupt,SA_SHIRQ,interface,&irq)) { //early than 2.6.23
if (request_irq(irq,&myinterrupt,IRQF_SHARED,interface,&irq)) { //later than 2.6.23
printk(KERN_ERR "myirqtest: cannot register IRQ %d/n", irq);
return -EIO;
}
printk("%s Request on IRQ %d succeeded/n",interface,irq);
return 0;
}
static void __exit myirqtest_exit(void)
{
printk ("Unloading my module./n");
free_irq(irq, &irq); //release irq
printk("Freeing IRQ %d/n", irq);
return;
}
module_init(myirqtest_init);
module_exit(myirqtest_exit);
MODULE_AUTHOR("lin.tang");
MODULE_LICENSE("GPL");
对应Makefile文件:
obj-m += interrupt.o
#generate the path
CURRENT_PATH:=$(shell pwd)
#the current kernel version number
LINUX_KERNEL:=$(shell uname -r)
#the absolute path
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
#complie object
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#clean
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
//参考文档:
http://www.kerneltravel.net/?p=133
http://edsionte.com/techblog/archives/1521
相关文章推荐
- 第一个DOS中断处理程序(中断号为0)
- 实验十二_编写0号中断处理程序
- 编制中断处理程序(1202)
- 6.8 中断和中断处理程序_别打断我,马上结束
- 中断处理程序&中断服务例程
- 《汇编语言》读书笔记(9)——0号中断的处理程序
- 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync
- Linux内核设计与实现——7 中断与中断处理(5)——注册中断处理程序
- 中断处理程序、中断上下文中处理延时及一些函数的调用规则
- main函数中的第一个Opengl程序-键盘按键处理
- 中断和中断处理程序
- 从零开始最短路径学习Hadoop之02----处理气象数据的第一个MapReduce程序
- 木其工作室(专业程序代写服务)[转]linux中断处理体系结构
- OpenCV嵌入式图像处理(四)第一个OpenCV程序
- Golang goroutine协程(一) 编写第一个并发处理的程序
- vxworks中断处理程序不能使用printf的本质
- linux内核分析笔记----中断和中断处理程序
- 第一个基于GPU CUDA的程序--向量相加的并行处理
- 3.17 基于OHCI的USB主机 —— 中断处理程序
- Linux内核spin_lock 要防止该锁在中断处理程序调用