免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: ady2002
打印 上一主题 下一主题

自己修改的ADC0809驱动,Godbach和版主请看看 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-11-19 15:37 |显示全部楼层
原帖由 Godbach 于 2008-11-19 14:30 发表
我做数据采集时候的设计时按块采集的,一旦设置启动之后,停止之前,就一直在采集数据,你随时都可以读取数据。

我也想这样啊
而且我不同的是 我其实不是要ad采集的数据
而是要采集的数据跳变的次数
比如 我采集的数据是0 1 0 0 1 1 0 1我想要的只是0-》1累计加1,1-》0 累计再加1,。。。。最后sum=5
主要是要这个sum值

论坛徽章:
0
22 [报告]
发表于 2008-11-19 15:58 |显示全部楼层
原帖由 dreamice 于 2008-11-19 12:36 发表


不是时钟中断很难完成,其实很简单,你看看我给你提那几个方法。关键的问题是,你对这个整体认识还不够。应该好好理一下思路,有几点要注意:
1、驱动是在内核空间,你要把数据提供给用户空间,这个就要求 ...


谢谢你们热心的知道和讨论

1、驱动是在内核空间,你要把数据提供给用户空间,这个就要求是用户空间主动来读,还是你以某种方式通知用户空间来读?
       不是通过使用read函数来读吗?关于空间数据转换是可以使用  copy_to_user(buf,&key,1);或者put_user(key,buf);这两种函数吧
2、你想一下,你在ADC模块里注册时钟中断,——一个很基本的问题:你要搞清楚如何写一个中断处理程序!
      这个关于如何写一个中断处理程序 我就是按照例子来写得,首页代码有贴出来 不知道是不是那写得不对啊???

论坛徽章:
0
23 [报告]
发表于 2008-11-19 16:00 |显示全部楼层
原帖由 dreamice 于 2008-11-19 15:47 发表


我真的不想太强调了,说得这么清楚了:

用一个内核定时器,不停的去采AD值,存到一个缓冲区中(缓冲区的大小依据你需求设置,如果你想一次读100个值,把缓冲区设置成100都可以)。
定时器不停的采集,更 ...

呵呵 dreamice  别生气啊
我这个是写给god看的 怕他不理解我的目的哦~~~~

呵呵 还是多谢了啊

论坛徽章:
0
24 [报告]
发表于 2008-11-19 17:34 |显示全部楼层
原帖由 dreamice 于 2008-11-19 16:48 发表


呵呵,不是生气,感觉总在强调同一个东西,翻来覆去的。
我也不是高手,同时,我也不是用激烈的言语来打击你,这里只是自由讨论。

就拿我给你提的两个问题吧(中断处理的编写,内核空间与用户空间的通信 ...



我觉得 我现在最大的麻烦是  加载驱动是老是提示 这个错误,不知道错误的怎么解决 这些才是最重要的

  1. Get assigne<1>Unable to handle kernel NULL pointer dereference at virtual addre0pgd = c0a40000
  2. *pgd = 00000000, *pmd = 00000000
  3. Internal error: Oops: 0
  4. CPU: 0
  5. pc : [<c6cb00a4>]    lr : [<c001f0e4>]    Not tainted
  6. sp : c0a6dda8  ip : c0a6ddc0  fp : c0a6dde8
  7. r10: c0223020  r9 : c0a6ddec  r8 : c021ae7c
  8. r7 : c021afdc  r6 : 20000000  r5 : 00000000  r4 : c6cb078c
  9. r3 : 00000000  r2 : c6cb0958  r1 : 00000000  r0 : c6cb0624
  10. Flags: nzcv  IRQs off  FIQs on  Mode SVC_32  Segment user
  11. Control: C000317F  Table: 30A40000  DAC: 00000015
  12. Process insmod (pid: 67, stackpage=c0a6d000)
  13. Stack: (0xc0a6dd98 to 0xc0a6e000)
  14. dd80:                                                       c001f0e4 c6cb00a4
  15. dda0: 00000093 ffffffff c3561540 0000000b c0a6dde8 c0a6ddc0 c001f0e4 c6cb0070
  16. .........
  17. dfe0: 4009eb40 bfffd0b0 02010064 4009eb4c 60000010 0201f3b0 00000000 00000000
  18. Backtrace:
  19. Function entered at [<c001f024>] from [<c001e4e0>]
  20. Function entered at [<c00ca7b8>] from [<c002b0a0>]
  21. r5 = 000027B6  r4 = C020F354
  22. ..................
  23. r5 = 00000000  r4 = C6CB0000
  24. Function entered at [<c002bd58>] from [<c001e820>]
  25. Code: e59f305c e59f405c e5933000 e59f2058 (e5933000)
  26. Kernel panic: Aiee, killing interrupt handler!
  27. In interrupt handler - not syncing
复制代码


能不能帮我把这个问题解决了啊???
头痛~~~~

论坛徽章:
0
25 [报告]
发表于 2008-11-20 08:36 |显示全部楼层
原帖由 dreamice 于 2008-11-19 17:53 发表
治标不治本,解决这个问题依旧解决不了你问题的本质。
思路给你指清楚了,代码差不多也有框架了,最好冷静一下,从头分析,参考一下前面给你说的那么多。



多谢 deamice的指点
我现在是时间很紧哦,老板要求周末就要出东西哦~~~~~
所以没时间全面的学习,只能先过这一关,再全面学习哦~~
只能怪自己来晚了,早一个月过来就好了,郁闷啊·~~~~

能不能指点一下治标的方法啊

论坛徽章:
0
26 [报告]
发表于 2008-11-21 14:39 |显示全部楼层
原帖由 Godbach 于 2008-11-21 14:38 发表
很惭愧最近没有仔细研究LZ的问题。主要是具体的驱动现在没在做,很多不知道该怎么说。
对于insmod出现OOPs的情况,我没怎么遇上过。不知道dreamice兄,以及其他朋友遇上过没有?



呵呵 还是要多谢god兄的关注,dreamice已经给我指点方向了 虽然还没有解决
呵呵

论坛徽章:
0
27 [报告]
发表于 2008-11-21 17:27 |显示全部楼层
原帖由 dreamice 于 2008-11-21 15:06 发表
另外,我不知道你这一段address map有什么依据?还是自己随意定的?
r_TCFG0 = ioremap(0x51000000,4); //........0
        r_TCFG1 = ioremap(0x51000004,4); //........1
        r_TCNTB1 = ioremap(0x5 ...

恩 是自己定义的哦
主要是由一个使用s3c2410的timer1的例子,是客服提供的,是这样定义的  所以我也就照搬了。

关于打印一些信息,我也打印了就是打印到 request_irq的时候过不去,也就是说申请中断没有成功,
具体那个我帖子(0oops错误)上对照代码又说的比较清楚哦


ps: god   我在网上搜了很多,都试只是提示指针错误,但都不具体  获得信息有限哦

论坛徽章:
0
28 [报告]
发表于 2008-11-24 08:38 |显示全部楼层
原帖由 dreamice 于 2008-11-22 10:39 发表



我觉得你应该查一下这个timer是不是在其他地方已经用过了。

我也这样考虑过,但是我单独使用timer里程的时候是可以用的,就是说timer0是没有被使用过得

论坛徽章:
0
29 [报告]
发表于 2008-11-25 17:35 |显示全部楼层
原帖由 dreamice 于 2008-11-24 11:13 发表



它这里好像并不是共享中断

不是共享形式的 ,之前的可用的那些驱动都试用 null的哦~~
还有我就是加载一个最简单的 timer1定时器时,好像加载不了

result=request_irq(IRQ_TIMER1,&timerirq_interrupt,SA_INTERRUPT,"timerirq",NULL);
if (!result)
        {
                printk("Get assigned irq %d,result=%d\n",IRQ_TIMER1,result);
                return result;
        }

        printk("***********Init ok!!***********\n");
       
        return 0;

insmod  后的信息:Get assigned irq 11,result=0  也就是说没有成功,但是中断号是正确的  
但是这个不会出现0oop是错误啊,就算我的adc0809的timer不成功,也不至于出现0oops错误哦

郁闷啊  这段时间一直再看  中断 还是没找出问题来哦

对了dreamice  有没有关于那个 你上次说得循环缓存区的  使用方法的好文章啊
我看IDD2里面 基本没怎么介绍啊

论坛徽章:
0
30 [报告]
发表于 2008-11-26 08:47 |显示全部楼层
原帖由 zhonghan 于 2008-11-26 08:13 发表
比如是不是应该写成split(/\s++/,$var)?

你是说哪里 该写成split啊??
不懂你的意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP