5

現在、ほとんどのサブシステムがタイミングに基づいている組み込みプロジェクトに取り組んでいます。

タイマーがロールオーバーする問題を回避するために多くの解決策を探しましたが、まだ1つ困惑しています。

現時点では、このような unsigned long の 2 の補数を使用しています。

ulong t1 = tick of last event;
ulong t2 = current tick;
if ( t2 - t1 >= limit ){
 do something
}

他の人は、これが機能する前に t2-t1 の結果を署名付きエンティティにキャストする必要があることを示唆していますが、その理由はわかりません。他の洞察や提案はありますか?

4

3 に答える 3

2

時々私はこのようにします:

ulong t1 = tick of last event;
ulong t2 = current tick;

if ( t1 > t2 ){
    if ((ULONG_MAX-t1+t2+1)>=limit){
       do something
    }
} else {
if ( t2 - t1 >= limit ){
    do something
}
于 2012-07-25T20:51:58.220 に答える
0

署名済みにキャストする必要はありません。「何かをする」がアラーム処理コードで、制限が時間間隔の場合。

定期的な間隔のベスト プラクティスは次のとおりです。

 ulong next_alarm_ticks = 0;

 void poll_alarm()
 {
     if (get_ticks() - next_alarm_ticks < ULONG_MAX/2) { 
         // current time is "greater" than next_alarm_ticks
         handle_alarm();
         next_alarm_ticks += alarm_interval;
     }
 }
于 2012-07-25T10:01:56.030 に答える
0

t2が概念的に常に よりも大きいことが保証されている場合t1、署名付きエンティティへのキャストは間違っています。符号なし整数の算術演算は、標準によって正しい modulo であることが保証されているため、sとして計算するとUTYPE_MAX + 1、差t2 - t1は正しい modulo になります。署名されたエンティティにキャストする場合、値がターゲットの型で表現できない場合、動作は実装定義です。多くの場合、大きな正の値が負の値に変換されます。ULONG_MAX + 1unsigned long

テスト

if ( t2 - t1 >= limit ){

は、現在のティック カウントと、タイマーをラップしていない以前のティック カウントとの差が より大きい場合に故障しますULONG_MAXが、それ以外の場合は機能します。

しかし、t2が よりも早い場合t1、真の差t2 - t1は負になりますが、 としてはunsigned long、潜在的に大きな正の数になります。次に、署名されていない型を使用するとうまくいかない場合に、署名された型へのキャストが正しく機能します。

于 2012-07-25T09:59:16.867 に答える