SSブログ

RtSleep()の限界(誤った例)まとめ INTime [INtime]

以下のコードが正しく動作しない理由まとめ

 while(1){
   
    // 1ms周期でデバイスの状態を確認する。 
    RtSleep( 1 );
   
    bFlg   = inbyte( wBase + IRQ_TAG   );
    bState = inbyte( wBase + STATE_TAG );
   
}

上のコードは正しく意図どおり動作いたしません。これはINtimeの高レベルティック周期が10msであることに関連します。RtSleep()に指定できる最短周期は10msです。RtSleep( 1 ) は事実上 RtSleep( 0 )ということになり、指定した1msの周期で動作することにはならないのです。

さらに RtSleep( 15 ) とした場合、 この指定により意図どおり15ms待機を行うわけではありません。これは15msという時間値を高レベルティック値に変換するためです。

高レベルティックへの変換とは、指定値を高レベルティック周期 10ms単位に丸 めるということです。すなわちこの場合、周期単位10に満たない端数の5は切捨て されるということを意味します。そして実行時 にはRtSleep(10)のように動作します。


対応方法

1. 低レベルスリープ knRtSleep()

1msの周期で処理を行う必要がある場合もあるでしょう。

そういった場合、低レベル関数であるknRtSleep()を使用します。 


 knRtSleep( UsecsToKticks( 1000 ) );     // 1msのスリープ要求

ただしカーネルティックが1000us以下に設定されている必要があります。たとえばknRtSleep(100)のようにカーネルティック値よりも小さな値に設定しても、100usのスリープとはなりません。実際は以下のようにカーネルティックでの動作となってしまいます。

◆INtime 3.0 設定可能なカーネルティック

   100us
   125us
   200us
   250us
   500us
  1000us
  2000us
  5000us
10000us

2. RtSleepEx()

INtime3.0バージョン以降では、㍉秒単位で時間指定が可能なRtSleepExコールが実装されています。このコールを含んだアプリケーションは、以前のINtimeバージョンで動作しませんのでご注意ください。

 RtSleepEx( 6 );     // 6msのスリープ要求

 

参考サイト 


nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

MatgehasY

Vardenafil Generico http://cheapcialisir.com - п»їcialis Indomethacin For Sale <a href=http://cheapcialisir.com>Cialis</a> 2077 Buy Periactin Weight Gain Pills
by MatgehasY (2020-02-26 14:55) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。