8

外部 TTL パルスを使用してデータ収集ソフトウェアをトリガーする簡単な方法を探しています。5 Hz の基準クロックと同期して、複数のソースからデータをサンプリングする必要があります。取得にリアルタイムの優先度は必要ありませんが、ソフトウェアができるだけ早く、外部クロック サイクルごとに正確に 1 回トリガーされるようにしたいと考えています。高速ポーリング ループを使用せずに、何らかの方法で外部トリガーから割り込みを取得することで、これを行うことをお勧めします。私の知る限り、Linux のような最新の OS では、パラレル ポート ピンを割り込みに使用することはできません。何か案は?

トリガー イベントが発生したことをネットワーク上の他のマシンに通知するために、ネットワーク上でブロードキャスト パケットを生成することも考えています。ただし、ネットワークの遅延が原因で、トリガー間の 200 ミリ秒の間に取得を行うのに十分な時間がない場合があります。

4

4 に答える 4

10

パラレル ポートを使用する代わりに、シリアル デバイスを使用することを検討しましたか? TTL 信号があるため、TTL を RS232 +/- 12V レベルに変換するレベル コンバーターが必要になる場合があります。シリアル デバイスを使用すると、標準のシリアルioctl()呼び出しを使用して、制御信号の状態の変化を検出できます。

具体的にはTIOCMIWAIT、接続されたシリアル デバイスで ioctl を使用して、たとえばクロック ソースに接続する DCD ラインの変更を待つことができます。

ユーザー空間アプリケーションはTIOCMIWAIT、クロック ラインのステータスが変化するまで ioctl システム コールでブロックされ、その時点でアプリケーションが実行可能になり、ioctl から返されます。シリアル制御信号の立ち上がりエッジと立ち下がりエッジの両方でステータス割り込みの変更が発生するケースを確実に処理するように注意する必要がある場合があります。一部の UART ハードウェア (TL16C554A UART など) では、単一方向に遷移する信号に対してのみ割り込みが発生する可能性があります。たとえば、TL16C554A の場合、TIOCMIWAITRing Indicate 信号の変化の立ち上がりエッジでのみフォールスルーします。

この方法でシリアル ioctl を使用するとTIOCMIWAIT、必要に応じてサポートする USB-Serial ドングル (PL2303 など) を使用できるという利点もあり、USB による遅延の増加を犠牲にしても、ユーザー レベルのソフトウェア互換性を維持できます。

ユーザー空間で達成できるよりも低いレイテンシーが必要な場合は、タイミングとサンプリングを処理できるカーネル ドライバー モジュールを作成するのが最善ですが、どうしても必要な場合を除き、この方法はお勧めしません。ユーザー空間のコードを開発する方が簡単です。

TIOCMIWAIT以下は、 ioctlを使用するための不完全なサンプル 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.
         */
}
于 2013-07-02T02:21:47.910 に答える
3

ポーリングは、このようにデータ速度が遅い場合に適した方法です。1 ミリ秒でポーリングします。それでいいはずです。ハードウェア割り込みを使用しようとすると、多くの苦痛が生じます。

難しい方法でやりたい場合は、「Interrupt Linux GPIO」を Google で検索してください。:)

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

于 2013-07-02T00:11:06.293 に答える