对一个简单中断程序的理解和分析
以下是我初学中断时,老师给的一个例程。由于是初学,所以先将自己的分析总结一下,已达到知识的巩固,以利于以后的学习。
程序代码:
#include
#include
#include
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, struct pt_regs *regs)
{
static int mycount = 0;
if (mycount < 10) {
printk(”Interrupt!\n”);
mycount++;
}
return SA_SHIRQ; /*SA_SHIRQ 是描述中断线与I/O设备之间关系的标志,它表示允许其他设备共享这条中断线*/
}
static int __init myirqtest_init(void)
{
printk (”My module worked!\n”);
if (request_irq(irq, &myinterrupt, IRQF_SHARED,interface, &irq)) {
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);
printk(”Freeing IRQ %d\n”, irq);
return;
}
module_init(myirqtest_init);
module_exit(myirqtest_exit);
MODULE_LICENSE(”GPL”);
—————————————-
这里要说明的是,在插入模块时,可以带两个参数,例如
sudo insmod myirq.ko interface=eth0 irq=9
分析:
1.module_param()宏 定义在linux/module.h中,用于将参数传递给模块,在本程序中,我们需要从命令行接收参数,所以我们定义两个全局变量
interface和irq,这样,就可以在insmod模块时,用参数的形式传递给模块中的全局变量。
2.myinterrupt() 模块中先定义了一个静态的局部整型变量mycount,对打印的"Interrupt"进行计数。
3.myirqtest_init() 初始化模块 在这个模块中,先打印一个字符串,以确定是本模块在执行。request_irq()用来申请使用参数中指明的中断请求号irq
,另一参数 &myinterrupt表示要挂入到中断请求队列中的终端服务例程。如果申请失败,打印中断号为irq的中断申请失败申请失败信息,并返回一
个负值;如申 请成功,先打印某个interface申请的irq申请成功,返回0。
4.myirqtest_exit() 退出模块 在本模块中,先打印卸载模块信息,表示正在卸载。调用free_irq()释放所申请的中断请求号,之后再打印所申请的中
断请求号已释放完毕。
以上是我对一个简单中断程序的分析。由于是初学,只是按照自己的理解写出了主要函数的功能,有些还不是很准确,希望大家指正。
阅读(2970) | 评论(0) | 转发(0) |