首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从并行口读取4秒长+5V的TTL --何时使用内核中断

从并行口读取4秒长+5V的TTL --何时使用内核中断
EN

Stack Overflow用户
提问于 2014-07-11 23:10:28
回答 1查看 246关注 0票数 3

我有一个实验箱的技巧运行,每100毫秒左右,将吐出一个4微秒长+5V脉冲的电力在一条TTL线。这种情况发生的确切时间还不清楚,但这是很重要的--所以我想使用RedHat5.3计算机来运行这个实验来服务这个TTL,并创建一个光荣的时间戳。

目前,我所做的是将TTL连接到linux盒上并行接口的第13引脚(STATUS_SELECT,并行接口上的输入行之一),在实验开始时生成一个进程,使用chrt将其预定的优先级更改为99 --即高优先级--然后在while循环中反复轮询并行口,直到引脚变高。然后,我创建了一个精确的时间戳,并以非阻塞的方式将其写入磁盘。

显然,这是低效的--有时进程被暂停,一个TTL就会被错过。就像计算机本身一样,忙着做其他事情(即从我的实验工具包中获取数据--核磁共振扫描仪!)这种情况经常发生。投票很容易,但可能很糟糕。

我的问题是:当TTL出现时,快速地做一些事情似乎是计算的必需品,但据我所知,只有当您是内核模块时,才有可能处理linux上的中断。并行端口可以生成中断,像近端这样的库可以相对较快地构建内核模块,在那里您必须提供自己的处理程序。

当TTL出现时,最好的方法是处理这个问题并为实验创建精确的(±25 ms)时间戳--编写一个内核模块,提供/proc中某个地方最近中断的列表,然后用正常的过程读取它们?这种方法不起作用,而且CPU效率很低--或者打开一袋蠕虫来处理我不知道的中断优先级?

最重要的是,这似乎应该是一个解决的问题--是吗?如果是的话,是否有任何明智的人希望把我引向正确的方向?坦率地说,编写内核模块似乎是一项艰巨而危险的工作,它似乎应该很简单。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-06 19:34:40

“只有当您是内核模块时才有可能处理linux上的中断”这一假设否定了一些相当常见和有效的策略。

响应用户空间中的中断(特别是频繁中断)的简单操作是有一个驱动程序,该驱动程序创建一个内核设备(在某些情况下是sysfs节点),其中来自userspace的read()或自定义ioctl()将被阻塞,直到中断发生。您必须检查默认的并行口驱动程序是否支持这一点,但是这在嵌入式板卡上的GPIO驱动程序中是非常常见的,并且基本方案可以借用到并行口--只要硬件支持真正的中断。

如果目标是非常精确的时间,您可能会做得更好,定制内核模块来记录时间戳,并实现一种机制,在中断发生之前,从userspace中读取一个read(),然后获取内核已经记录的时间戳作为读取数据--从而避免唤醒用户空间和调用内核以获得时间的可变延迟。

您还可以将真正的本地总线串行端口(如果存在的话)看作是一个备用的具有中断能力的接口,如果可用的并行口是一些不支持它们的部分或间接实现的话。

在您唯一可用的接口是一些间接和高延迟的情况下,例如USB,或者您需要大量的主机和操作系统独立,那么使用外部微控制器确实是有意义的。在这种情况下,您可能会尝试从主机系统设置微时钟,然后让它在每次看到事件时给您时间戳消息。如果您的实验只需要时间戳相对于给定的实验会话,这应该是很好的工作。但是,如果您需要建立跨USB延迟的绝对时间同步,则可能需要进行一些仔细的往返测量,然后估计延迟以进行补偿(请参阅NTP中的一个极端示例)。

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

https://stackoverflow.com/questions/24707931

复制
相关文章

相似问题

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