簡體   English   中英

到達時間處理與C環繞

[英]Arrival-time handling with wrap around in C

我目前正在Ansi-C中編寫一個軟件,並且正在努力獲得一個基本功能。

該軟件將通過CAN網絡接收消息,當這些消息到達時,我需要確保它們在預期時間之前和之前的消息之后交付。

只允許使用無符號變量,因此當定時器達到最大值時會出現問題(在我的情況下為255)。

由於我知道兩條消息之間的最長時間,因此很容易驗證消息是否在預期時間之前到達。

此示例處理環繞並發現遲到的消息:

UC_8 arrival = 250;  
UC_8 expected = 15;
UC_8 maxInterArrTime = 30;

result = expected - arrival;

if(result <= maxInterArrTime){
// ON TIME!
}
else{
// DELAYED
}

這是一個簡單的部分,但我還必須檢查到達的消息實際上是在上一條消息之后到達的。 我的問題是我不知道如何用環繞問題來解決這個問題。 我試圖模仿找到延遲消息的解決方案,但沒有任何運氣。

UC_8 arrival = 10; // Wrapped around
UC_8 lastArrival = 250;  
UC_8 expected = 15;
UC_8 maxInterArrTime = 30;

result = expected - arrival;
result2 = lastArrival - arrival; //Problem

if(result2 >= ???){ // How should I compare and with what?
  //Message received after previous msg

  if(result <= maxInterArrTime){
  // ON TIME!
  }
  else{
  // DELAYED
  }
else{
  //Message received before previous msg - ERROR
}

我的問題是當到達時間值低於前一個到達時間,但實際上是“更大”,因為它已經纏繞。 我想我可能需要做幾步。

有什么建議我怎么解決這個? 我需要保持if語句的數量很少,代碼將被分析復雜性和其他東西。

如果您可以保證數據包之間的延遲不會超過256或更多,那么以下內容將考慮環繞

if (newerTime >= olderTime)
  delay = newerTime - olderTime;
else
  delay = 256 - olderTime + newerTime;

如果你不能保證延遲小於256,那么展開是正確的,你不能做你想做的事情。

咦? 你不能用神奇的方式圍繞一個缺少信息的情況。 如果您只有8位無符號時間戳,那么您將無法區分3個刻度前發生的事情和259個刻度之前發生的事情,依此類推。

考慮使更大(更多位)的時間戳可用。

如果可以確保時間增量的絕對值小於最大可測量時間跨度的1/2,則可以確定時間增量。

int8_t delta_u8(uint8_t a, uint8_t b) {
    int8_t delta = a - b;
    return delta;
}

...

  delta = delta_u8(newerTime, olderTime);
  delay = abs( (int) delta ); // or you could have a byte version of abs, since
                              // I suspect that you may be doing embedded stuff
                              // and care about such things.

如果你能確保時間總是向前發展,那么你可以做得更好。 隨着時間的推移,我的意思是在你的情況下, newerTime總是大於olderTime ,無論它們在數字上如何比較。 在這種情況下,您可以測量最大可測量時間跨度的增量 - 這實在不言而喻。

uint8_t delta_i8(uint8_t a, uint8_t b) {
    return a - b;
}

如果你知道在相同的時間段內不能發生兩個事件你可以做得更好1.如果你知道兩個事件不能發生在一起比一定時間更近,那么你可以計算到最大時間跨度的增量可以通過時間戳+事件之間必須存在的時間量來表示,但是您必須使用更大的可變大小來進行實際數學運算。

所有這些都是有效的,因為當你對它們進 您可以非常輕松地將此視為將已知時間值中的一個轉換為新原點(0)並調整其他時間值以匹配此移位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM