免费注册 查看新帖 |

Chinaunix

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

求救,dreamice大大请进 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-01 17:25 |只看该作者 |倒序浏览
之前好不容易把驱动弄好了
今天在写应用层的程序

发现一个问题 不知道怎么才能隔段时间 提取一下驱动的数据 也就是read下
我在程序里,加了一个定时器,可是好像不管用

  1. #include "adc0809_ioctl.h"
  2. char ret[2];
  3. int adc_fd ,sec;
  4. int AD_i=0,AD_v,AD_sum,speed_avg,speed_v;
  5. int v[100]={0};

  6. void sigroutine(int signo){
  7.         int i,n=100;//300;

  8.     switch (signo){
  9.       case SIGALRM:       
  10.                 read(adc_fd,ret,1);
  11.                 AD_v=ret[0];
  12.                 v[AD_i]=AD_v;
  13.                 AD_i=AD_i+1;
  14.         printf("AD_v = %d  \n", AD_v);

  15.         if(AD_i==100){                     
  16.                 for(i=0;i<n;i++)
  17.                 { AD_sum+=v[i];
  18.                 }
  19.                 AD_sum/=n;
  20.                 AD_i=0;
  21.            }
  22.         printf("AD_sum = %d  \n", AD_sum);
  23.             signal(SIGALRM, sigroutine);
  24.             break;
  25.      }
  26.        
  27.     return;
  28. }

  29. int main()
  30. {       
  31.     struct itimerval value, ovalue;
  32.     sec = 5;
  33.    
  34.     signal(SIGALRM, sigroutine);
  35.        value.it_value.tv_sec = 0;
  36.     value.it_value.tv_usec = 200000;//
  37.     value.it_interval.tv_sec = 0;
  38.     value.it_interval.tv_usec = 200000;
  39.     setitimer(ITIMER_REAL, &value, &ovalue);
  40.    
  41.     adc_fd = open("/dev/adc0809",O_RDWR);
  42.         if (adc_fd <= 0){
  43.                 printf("open adc0809 device error\n");
  44.                 return ;
  45.         }

  46.         speed_v=AD_v*20;
  47.         speed_avg=AD_sum*20;
  48.         printf("speed_v = %d km/h \n", speed_v);
  49.         printf("speed_avg = %d km/h \n", speed_avg);
  50. }
复制代码

感觉像是没有跳到 定时器里去运行 奇怪哦

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

回复 #1 ady2002 的帖子

你这程序一下就跑完退出了,还运行什么
看看apue再来问

论坛徽章:
0
3 [报告]
发表于 2008-12-01 22:23 |只看该作者
恩  就是一下就跑完了 郁闷哦
想让它能循环工作的哦

apue是什么?、不了解

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

回复 #3 ady2002 的帖子

linux 环境高级编程

程序都退出了还捕捉什么信号?

论坛徽章:
0
5 [报告]
发表于 2008-12-02 08:36 |只看该作者
原帖由 dreamice 于 2008-12-1 22:50 发表
linux 环境高级编程

程序都退出了还捕捉什么信号?

恩 我也正是为此苦恼啊

论坛徽章:
0
6 [报告]
发表于 2008-12-02 08:40 |只看该作者
dreamice 我的理解是 只要让程序运行0.2S以上
是不是队列就开始循环了???

论坛徽章:
0
7 [报告]
发表于 2008-12-02 08:53 |只看该作者
能不能给我点建议

该冲哪方便来处理这个问题?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-12-02 09:03 |只看该作者
原帖由 ady2002 于 2008-12-2 08:40 发表
dreamice 我的理解是 只要让程序运行0.2S以上
是不是队列就开始循环了???


加一个while {
pause();
}

论坛徽章:
0
9 [报告]
发表于 2008-12-02 09:43 |只看该作者
原帖由 dreamice 于 2008-12-2 09:03 发表


加一个while {
pause();
}



【pause系统调用】

功能描述:
暂停进程的执行,等待信号的出现。


用法:
#include <unistd.h>

int pause(void);


返回说明:
调用只有在接收到信号时才返回,而且返回值为-1,errno被设为EINTR。

拿这个是不是会占用一整个进程呢?

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

回复 #9 ady2002 的帖子

你对你自己的需求没有一个明确的认识吗?如果要干其他的事情,确保你得程序不会退出,那还pause需要干什么呢。具体应用,具体需求,你要充分开动你的大脑,来完成一项任务啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP