[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 メーリングリストの案内