同步数据采集的硬件中断

2024-05-09 13:45:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 数据方法端口网络软件linux计算机方式
3条回答

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

具体地说,您可以使用所连接的串行设备上的TIOCMIWAITioctl来等待对DCD线路的更改,该线路将连接到您的时钟源。在

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

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

如果您需要比通过用户空间实现的延迟更低的延迟,那么最好编写一个内核驱动程序模块来处理计时和采样,但除非绝对需要,否则我不建议使用这种方法。更容易开发用户的代码。在

下面是一些不完整的示例C代码片段,用于使用TIOCMIWAITioctl。在

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.
         */
}

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

谷歌的“中断Linux GPIO”如果你想做的困难的方式。:)

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

最后,我使用串行端口CTS行作为触发器,使用TIOCMIWAITioctl per Austin Phillips答案。因为RS232需要+/-12V电平,所以我可以从其他串行控制线路获得电平转换器所需的电源。在

Level shifter schematic

实现这个解决方案的Python代码可以在问题中找到:Python monitor serial port (RS-232) handshake signals

相关问题 更多 >