[Armadillo:06683] Re: Armadillo-300にて、タイマーとselectを使うには?

SAITOH akinori email@hidden
2011年 1月 29日 (土) 10:31:59 JST


齊藤と申します

すでにいろいろ出てるので、屋上屋を重ねるようですが・・・

(2011/01/26 21:48), TFC 小林 wrote:
> ETHERにて、データを送受させながら、
> 拡張バス等の動作も行うようなプログラムを作っています。
> ETHERの処理や、1秒のタイマーの割り込みをさせたいのですが、
> selectの戻り値が-1になってしまい、その前後で数msの動作が
> 固まってしまうのか、他の作業が数ms止まってしまいます。

1. 1秒タイマーが厳密でなくていい(0.1秒程度の誤差は許される)のなら
タイマー割り込みを使わないというのが一つの方法だと思います。
そのかわり、selectのタイムアウト時刻をタイマー代わりに使います。
    struct timeval nexttime=現在時刻+1秒;
  for(;;) {
	if(nexttime≦現在時刻){
		拡張バス処理;
		nexttime+=1;
	}
	timediff=nexttime-現在時刻;
	select(・・・・,timediffでタイムアウト);
	if(データ送受信でselectを抜けた)
		通信処理
  }
こんなかんじ。

2.タイマーを必要とする拡張バスの操作を
 自作デバイスドライバとしてカーネルに入れる。

 もっとも素性の良い対策に思われますが、もっとも手間がかかります。

3.すでに提案されているように、1つのプロセスがselectとタイマー
 割り込みの両方を同時に使うのがトラブルの元なので、
 2〜3プロセスに分担して処理する。

 一つの方法として、バスを操作するプロセス1とネット通信を行う
 プロセス2はパイプやソケットでつなぐと、プロセス間通信の時間待ちを
 ネット通信のselectに統合出来ますね。

ざっとこんなところで
-- 
	齊藤明紀 email@hidden



armadillo メーリングリストの案内