首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于同步数据采集的硬件中断

用于同步数据采集的硬件中断
EN

Stack Overflow用户
提问于 2013-07-02 07:43:46
回答 4查看 4.2K关注 1票数 8

我正在寻找一种使用外部TTL脉冲触发我的数据采集软件的简单方法。我需要使用5 Hz参考时钟同步从多个来源采样数据。采集不需要实时优先级,但我希望确保我的软件尽快触发,并且每个外部时钟周期恰好触发一次。我更喜欢通过某种方式从外部触发器获得中断,而不需要使用快速轮询循环。据我所知,在像Linux这样的现代操作系统中,你不能仅仅使用并行端口引脚来中断。有什么想法吗?

我还在考虑在我的网络上生成广播数据包,以通知网络上的其他计算机发生了触发事件。然而,由于网络延迟,在触发之间的200ms时间段内可能没有足够的时间进行采集。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-02 10:21:48

您是否考虑过使用串行设备,而不是使用并行端口?因为你有一个TTL信号,你可能需要一个电平转换器来将TTL转换为RS232 +/- 12V电平。一旦使用了串行设备,就可以使用标准的串行ioctl()调用来检测控制信号状态的变化。

具体地说,您可以在连接的串行设备上使用TIOCMIWAIT ioctl来等待DCD线上的变化,您可以将DCD线连接到时钟源。

您的用户空间应用程序将被阻塞,等待TIOCMIWAIT ioctl系统调用,直到时钟线路上的状态发生更改,此时您的应用程序将变为可运行状态并从ioctl返回。您可能需要注意确保在串行控制信号的上升沿和下降沿都获得状态中断变化的情况下进行处理。在一些通用异步收发器硬件(例如TL16C554A通用异步收发器)上,你可能只会得到一个单一方向的信号转换的中断。例如,对于TL16C554A,TIOCMIWAIT只会在任何环指示信号变化的上升沿下降。

以这种方式使用串行ioctls还有一个好处,即如果需要,您可以使用支持TIOCMIWAIT的USB串行加密狗(例如PL2303),并且仍然保持用户级软件兼容性,尽管代价是由于USB而增加了延迟。

如果你需要比用户空间更低的延迟,你最好编写一个内核驱动模块,它可以处理定时和采样,但除非绝对必要,否则我不建议使用这种方法。开发用户空间代码更容易。

下面是使用TIOCMIWAIT ioctl的一些不完整的示例C代码片段。

代码语言:javascript
复制
int serial_fd = open(cmdline.device_name, O_RDWR | O_NONBLOCK | O_NOCTTY);
static const unsigned int ri_flag = TIOCM_RNG;

/* Set up serial port here using tcsetattr.  Set CRTSCTS | CLOCAL to ensure status interrupts
 * are generated.
 */

while (1) {
        /* Wait for positive RI transition.  TIOCMIWAIT takes a mask
         * as argument, only returning when the appropriate signal has changed.
         */
        if (ioctl(serial_fd, TIOCMIWAIT, ri_flag)) {
            fprintf(stderr, "ioctl() failed waiting for RI edge [%s]\n", strerror(errno));
            break;
        }

        /* Do sensor sampling here.  You could use TIOCMGET to first verify that
         * the clock line is in the expected state, eg high, before continuing.
         */
}
票数 10
EN

Stack Overflow用户

发布于 2013-07-02 08:11:06

对于如此缓慢的数据速率,轮询是一种很好的方法。轮询时间为1毫秒。这应该没问题。尝试使用硬件中断将会带来很多痛苦。

谷歌搜索“中断Linux GPIO”,如果你想用更难的方式。:)

https://developer.ridgerun.com/wiki/index.php/How_to_use_GPIO_signals

票数 3
EN

Stack Overflow用户

发布于 2013-09-05 18:01:06

考虑将外部脉冲源连接到real (!)的'CD‘ping不是USB RS232转换器)串行端口。然后,您可以使用"PPS api“来获取引脚”变高“的尽可能精确的时间戳。

您可能需要TTL信号移位器;并不是所有的串行端口都能在TTL信号电平下正常工作。

PPS api通常用于计时。例如,将GPS模块的PPS引脚连接到您的pc,并让NTP与其同步。这为您提供了微秒级的精度。

这个PPS api应该比任何其他用户空间解决方案(例如TIOCMIWAIT ioctl)更准确,因为它完全是在内核中处理的,当中断(由CD信号变化触发)进入时立即进行处理。使用ioctl解决方案,您至少需要进行一次上下文切换。我在覆盆子pi上做了一些测试,一个用户空间解决方案至少有6us的抖动。

PPS api为您提供了检测到脉冲时的时间戳。

为什么不使用USB到RS232的转换器:我在某处读到(与计时有关),USB设备每+/- 1ms轮询一次。轮询频率还取决于系统对其他USB设备的繁忙程度,我认为USB设备的内部时钟也可能会影响事情。但是我从来没有测量过这个。

相关URLS:

USB描述了PPS实现PPS (它在标准的kernel)

关于网络功能:使用UDP广播,不要使用TCP。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17415354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档