FreeBSDのシリアルポート割り込みフック

FreeBSDのシリアルポート割り込みフック

FreeBSD 10.3システムのシリアルポートにあるモデム制御ラインの変更に反応するプログラムを作成する必要があります。私はそれから何のデータも読みたくありません(何もありません)。これが発生した場合は、IRQ4を生成するようにポートを設定できることを知っていますが、私のプログラムはどのように割り込みを受け取りますか?割り込み記述子テーブルに関数ポインタをインストールする必要がありますか?必要に応じてどのようにインストールしますか?それとも、もっと簡単に活用できるものがありますか?

担当者が不足しているため、ここでplonkの有用な回答について言及することはできません。シリアルポートの回線ステータスの表示(モニタリング)

しばらく前にフライス盤のデジタル読み取りを実行したときにMS-DOSのパラレルポートと同様の作業を行いましたが、覚えている限り、それはリアルモードにあり、IVTに接続されていました。比較すると簡単です。

(注:動作するが通信ポートを持たない単純なUPSを継承しました。基本的に、サーバーシリアルポートの制御線を電気的に分離/レベル移動してパネルLEDとビープ音を「読む」ことができると考えました。機械に関してはUPSがいつものようにシャットダウンスクリプトを起動することを知っていますが、かなり早く設定できる場合は、新しいマシンを購入するときに£100を節約できます。)

ベストアンサー1

UPSなので、10秒ごとにモデム信号をポーリングする余裕があるようです(freebsdから)。ターミナル(4)):

int state;
if(ioctl(fd, TIOCMGET, &state)...)
if(state & TIOCM_DTR)...

ただし、モデム信号(DCDなど)の変更についてすぐに通知を受け取るには、ttyフラグをClearに設定できますCLOCAL (参照:テミオス)、 open()モデム信号DCDがアクティブになるまでポートが停止します。 DCDを紛失するとSIGHUPも受け取ります。

別のメカニズムは、ラインの1つを入力RXデータピンに接続することです。この値を設定した速度に対応する文字時間よりも高く設定すると、フレームエラーが発生します。 IGNBRK = 0およびBRKINT = 0が設定されている場合、ドライバは\0入力キューにNULLバイトを配置し、read()rawモードの場合は保留中のエントリのブロックを解除します。

おすすめ記事