zhengchengkun 发表于 2012-2-5 11:32:07

在linux中如何做定时ADC采集

我的s3c2440的处理器上面移植了linux2.6.12,现在要在linux系统中做一个2ms的ADC采集,使用了linux提供的定时器函数setitimer,发现setitimer定时2ms根本不准确,一般有很大的延时,可能是中断信号丢失引起的。请问各位在linux中做定时器采集用的是什么方法啊?如果使用ARM自带的timer1定时器,如何在应用程序中去接受定时采集的数据啊。

zhengchengkun 发表于 2012-2-5 11:33:09

在ARM9的裸机程序中,直接使用timer4定时1ms都非常的准确,现在上了linux操作系统,对里面的定时处理部分不知道如何处理了。请各位高人告诉方法哈。

zhengchengkun 发表于 2012-2-5 16:12:52

各位linux高手来指导一下吧,我弄了好多天了,一筹莫展啊。

mangocity 发表于 2012-2-6 13:16:40

默认的linux kernel任务调度机制,1ms的中断,实时性做不到这么高。

zhengchengkun 发表于 2012-2-6 22:43:17

意思是用软件中断,只能最小1ms吧,用2440的timer0硬件定时器可以将精度提高吗?

mangocity 发表于 2012-2-7 10:00:42

可以尝试打实时补丁xenomai 之类的提高实时性。

zhengchengkun 发表于 2012-2-7 10:23:07

请问一下各位,如果我单独循环采集1000次ADC,花费时间是1.67s,意思是单次ADC只有1.67ms。为什么我使用定时器之后,每次ADC采集的时间要4.5s才能完成。原来以为设定一个2ms定时器就能搞定,发现现在要设定5ms定时器才能完成一次ADC采集。为什么ADC采集的时间会变慢呢?时间花费在那里去了啊,这里面也没有执行其他程序调度啊。

hmd420304805 发表于 2012-2-7 16:00:14

时间被中断处理程序浪费了。

alasika 发表于 2012-2-7 17:04:52

可以在底层驱动里做采集,放到一个缓冲区里,应用程序只需要定时从驱动中将数据取出即可。

pcl001 发表于 2012-2-7 17:20:38

直接用 硬件定时器, 产生2ms中断, 在中断程序里面采集.

需要比较精确的定时时.....

hmd420304805 发表于 2012-2-7 17:32:38

回复【8楼】alasika 绿
-----------------------------------------------------------------------

如果是用片内ADC,估计在驱动里做也不行。我试过PWM的,速度非常的慢!

zhengchengkun 发表于 2012-2-7 19:40:52

回复【8楼】alasika 绿
-----------------------------------------------------------------------

我用过2440的timer0定时器,定时1ms产生一次中断,但是我在定时器的中断里面计数1000次,发现每次中断的时间差不多是3ms。意思是timer0定时器也没法做到1ms的定时精度。请问用内核定时器做2ms的定时器能否做,内核定时器的精度可以做到1ms啊。

mangocity 发表于 2012-2-12 20:34:46

因为Linux本身的限制,在做系统设计的时候很少会在linux系统里面做这样的实时处理。
建议将实时子系统和处理子系统分开,将实时任务放到实时子系统里,你的问题就可以解决了。

rockli 发表于 2012-2-12 21:38:14

linux很难做到ms级别的实时,简单一点可以外挂一个cpld作缓冲buffer。
采集一定数量的数据后,触发arm中断。

hyjstzzoro 发表于 2012-2-12 21:58:32

mark

jinpengfang 发表于 2012-2-16 18:47:55

RTLinux 能不能做到啊?
页: [1]
查看完整版本: 在linux中如何做定时ADC采集