免费注册 查看新帖 |

Chinaunix

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

请教timer_list中data域初始化为地址的用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-16 16:46 |只看该作者 |倒序浏览
使用环境大体是这样的:

static long do_ioctrl(struct file *file, unsigned int cmd, void *arg) {
struct A *handle = (struct uvc_fh *)file->private_data;
struct B *stream = handle->stream;
switch(cmd) {
  ...
  STREAMON:
   struct timer_list cap_timer = TIMER_INITIALIZER(trigger,0,(unsigned long)stream);
   ....
   mod_timer(&cap_timer, jiffies +300);
   break;
}
}
在另外一个文件中定义了trigger
void trigger(unsigned long val) {
printk(KERN_INFO "fuck!");
}
我原本只是想利用定时器做一个触发,简单写了个模板,上层程序也会调到这个ioctrl。可是当程序跑起来以后,定时器触发时就死掉了。但如果将(unsigned long)stream换成一个具体的数字(如(unsigned long)stream的地址)就可以打印出来,一切都正常。我看了定时器的源码,也只是把data域传入到(fn)的回调函数中,所以对这个现象很不解。有没有用过这种将指针作为回调参数的方法的兄弟啊,请大家指教。。

论坛徽章:
0
2 [报告]
发表于 2012-01-16 21:26 |只看该作者
你能给出打印正常时的代码吗?

论坛徽章:
0
3 [报告]
发表于 2012-01-17 10:18 |只看该作者
回复 2# jetking


    只要把(unsigned long)stream换成一个常数就可以正常打印了。

论坛徽章:
0
4 [报告]
发表于 2012-01-17 14:43 |只看该作者
回复 3# RUNONMIPS

stream的值就是一个常数阿,表示一个地址值。除非trigger里引用了stream,而stream所指向的内存区被销毁了。
其他的看不出来,帮你顶一下!   

论坛徽章:
0
5 [报告]
发表于 2012-01-17 15:09 |只看该作者
回复 4# jetking


    我做了个实验,在trigger函数中只把stream参数传进去,根本没有使用,但还是死掉了。所以我很补了解,所以我觉得timer_list中的data域是不是不能用变量的方法来初始化。

论坛徽章:
0
6 [报告]
发表于 2012-01-17 15:47 |只看该作者
这个timer_list分配在栈里面,退出这个switch之后,timer_list就不安全了。
不知道和这个有没有关系?

论坛徽章:
0
7 [报告]
发表于 2012-01-18 09:07 |只看该作者
应该如楼上所说

论坛徽章:
0
8 [报告]
发表于 2012-01-18 10:57 |只看该作者
ant艾草 发表于 2012-01-17 15:47
这个timer_list分配在栈里面,退出这个switch之后,timer_list就不安全了。
不知道和这个有没有关系?

应该不是吧,mod_timer之后定时器就可以工作了,即使推出switch也没关系吧。倒是这个stream指针有这个嫌疑,再试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP