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

Mik*_*ike 6 python linux hardware-interface

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

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

Aus*_*ips 8

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

具体来说,您可以使用TIOCMIWAIT连接的串行设备上的ioctl来等待更改DCD线,您将连接到您的时钟源.

您的用户空间应用程序将在TIOCMIWAITioctl系统调用中等待,直到您的时钟线上的状态发生更改,此时您的应用程序将变为可运行并从ioctl返回.您可能需要注意确保处理在串行控制信号的上升沿和下降沿上更改状态中断的情况.在某些UART硬件(例如TL16C554A UART)上,您可能只会获得单向转换信号的中断.例如,对于TL16C554A,TIOCMIWAIT只会在任何Ring指示信号变化的上升沿下降.

以这种方式使用串行ioctls还具有以下优点:您可以使用支持TIOCMIWAIT所需的USB串行加密狗(例如PL2303),并且仍然保持用户级软件兼容性,但代价是由于USB导致的延迟增加.

如果您需要的延迟低于通过用户空间可以实现的延迟,那么您最好编写一个可以处理时序和采样的内核驱动程序模块,但除非绝对需要,否则我不建议使用此路由.开发用户空间代码更容易.

以下是使用TIOCMIWAITioctl 的一些不完整的示例C代码片段.

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.
         */
}
Run Code Online (Sandbox Code Playgroud)