Chinaunix首页 | 论坛 | 博客
  • 博客访问: 124698
  • 博文数量: 20
  • 博客积分: 911
  • 博客等级: 准尉
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-03 21:02
文章分类
文章存档

2010年(4)

2009年(3)

2008年(13)

分类: LINUX

2009-05-08 17:08:37

                           对一个简单中断程序的理解和分析
 
    以下是我初学中断时,老师给的一个例程。由于是初学,所以先将自己的分析总结一下,已达到知识的巩固,以利于以后的学习。
 
程序代码:
#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()释放所申请的中断请求号,之后再打印所申请的中
断请求号已释放完毕。
以上是我对一个简单中断程序的分析。由于是初学,只是按照自己的理解写出了主要函数的功能,有些还不是很准确,希望大家指正。
 
阅读(2932) | 评论(0) | 转发(0) |
0

上一篇:C学习

下一篇:南方落雨北方落雪(转载)

给主人留下些什么吧!~~