[英]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.