免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4283 | 回复: 16
打印 上一主题 下一主题

中断问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-30 11:30 |只看该作者 |倒序浏览
LDD3的 scull和short模块调试:

scull的main.c中:
ssize_t scull_read(struct file *filp, char __user *buf, size_t count,
                loff_t *f_pos)
{
        struct scull_dev *dev = filp->private_data;
        struct scull_qset *dptr;        /* the first listitem */
        int quantum = dev->quantum, qset = dev->qset;
        int itemsize = quantum * qset; /* how many bytes in the listitem */
        int item, s_pos, q_pos, rest;
        ssize_t retval = 0;
printk(KERN_ALERT "scull:count= %ld\n",count);
        ...........................................

}

short的short.c中:
atomic li=ATOMIC_INIT(0);-------看发生了多少次中断
ssize_t do_short_read (struct inode *inode, struct file *filp, char __user *buf,
                size_t count, loff_t *f_pos)
{
         int retval = count, minor = iminor (inode);
        unsigned long port = short_base + (minor&0x0f);
        void *address = (void *) short_base + (minor&0x0f);
        int mode = (minor&0x70) >> 4;
        unsigned char *kbuf = kmalloc(count, GFP_KERNEL), *ptr;
printk(KERN_ALERT "short:count=%ld,li=%ld\n",count,atomic_read(&li));
        if (!kbuf)
        .........................................................
}
irqreturn_t short_interrupt(int,void*,struct pt_regs*)
{
atomic_inc(&li);
......
}
request_irq(irq,short_interrupt.....);

初始化时:安装了一个/proc/文件目录(通过create_proc_read_entry),名为short(主要是当cat /proc/short时能显示全局变量li的值
scull.ko对dd if=/dev/scull0 bs=2 count=1的printk反应是count=2,
short.ko对dd if=/dev/short0 bs=2(或bs=1) count=1的printk反应是count=0(2008年12月26日结果),有时count=4(2008年12月27日结果).
另外,我通过echo -ne "\377"> /dev/short0命令形式人为给/dev/short0发0xff(9脚和10脚相连,即引发中断),再dd if=/dev/short0 bs=1 count=1 ,do_short_read返回count=4,li=0,但是我马上cat /proc/short却显示li=2 (这就有两个问题1) 就是前面的问题为什么count=4: (2)do_short_read和/proc/short显示的li为什么不同,且我只发了一个中断li应该等于1
我继续echo -ne "\000" >/dev/short0 然后echo -ne "\377" >/dev/short0再次引发中断,同样do_short_read返回li=0,而/proc/short返回3

有时候不动电脑,过一会,cat /proc/interrupts 或cat /proc/short发现short_interrupt例程也执行了.
另外还发现一个现象:当上次unload模块之前echo -ne "\377" > /dev/short0
(即9和10脚高电平),然后再load模块,立即cat /proc/interrupts发现模块有中断,但cat /proc/short却又发现li=0

情帮忙分析分析,谢了!

short.tar.gz

6.7 KB, 下载次数: 39

论坛徽章:
0
2 [报告]
发表于 2008-12-31 13:06 |只看该作者
源代码也有,问题也说了,怎么就没人回复呢?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [报告]
发表于 2008-12-31 20:52 |只看该作者
我的建议是,这种测试,不要用echo这样的shell指令,直接写程序,通过系统调用接口来操作,这样比较稳妥。

论坛徽章:
0
4 [报告]
发表于 2008-12-31 21:01 |只看该作者

回复 #3 dreamice 的帖子

版主:我就按你的要求,自己写程序,通过系统调用来操作,如有问题再来请教.

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
5 [报告]
发表于 2008-12-31 21:29 |只看该作者

回复 #3 dreamice 的帖子

ok,主要是这个程序我没测过,没有硬件条件

论坛徽章:
0
6 [报告]
发表于 2008-12-31 23:34 |只看该作者

回复 #5 dreamice 的帖子

ssize_t do_short_read (struct inode *inode, struct file *filp, char __user *buf,                size_t count, loff_t *f_pos)
{
...
printk(.....count=......);
.....
}
用自己写的程序(采用系统调用)发现: 特别要注意顺序
读2字节 count=7
读3 count=8
读4 count=8
读5 count=8
读2 count=8
读3 count=8
读20  count=9
读21  count=9
读1   count=9
读50  count=9
读100 count=9

真不好理解???

评分

参与人数 1可用积分 +15 收起 理由
dreamice + 15 继续加油,祝新年事业学业有成:)

查看全部评分

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2009-01-01 10:54 |只看该作者

回复 #6 whoisliang 的帖子

你这个是测试程序?我的意思是你测试的时候,直接通过调用write(),read()这类函数来操作,这样对程序的执行流程比较有把握和控制。
一条echo指令或者 cat指令,你有时候不知道它执行了几次read和write调用。

论坛徽章:
5
8 [报告]
发表于 2009-01-01 11:03 |只看该作者
proc系统在使用前做初始化(全1)。试试看。

论坛徽章:
0
9 [报告]
发表于 2009-01-01 11:30 |只看该作者

回复 #7 dreamice 的帖子

size_t do_short_read (struct inode *inode, struct file *filp, char __user *buf,                size_t count, loff_t *f_pos)
{
...
printk(.....count=......);
.....
}
上面是模块中的程序.

用自己写的测试程序(采用系统调用open,write,read)发现: 特别要注意顺序
读2字节 count=7
读3 count=8
读4 count=8
读5 count=8
读2 count=8
读3 count=8
读20  count=9
读21  count=9
读1   count=9
读50  count=9
读100 count=9

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2009-01-01 11:32 |只看该作者

回复 #9 whoisliang 的帖子

呵呵,看来这样的话,还是比较容易分析的吧。
这样你可以再结合以下你内核的驱动程序,好好思考一下程序的执行流程

ps:新年了,这么积极以兄弟,送你5分
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP