Обработка времени прибытия с переносом в C - PullRequest
1 голос
/ 02 июля 2010

В настоящее время я пишу программное обеспечение на 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 на низком уровне, код будет проанализирован на предмет сложности и прочего.

Ответы [ 3 ]

3 голосов
/ 02 июля 2010

Если вы можете ГАРАНТИРОВАТЬ , что задержка между пакетами не будет 256 или больше, тогда следующее будет учитывать обтекание

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

Если вы не можете гарантировать, что задержкаменьше 256, тогда раскрутка верна, и вы не можете делать то, что хотите.

1 голос
/ 02 июля 2010

А?Вы не можете волшебным образом разобраться в случае пропажи информации.Если у вас есть только 8-битные временные метки без знака, то вы не сможете провести различие между тем, что произошло 3 такта назад, и тем, что произошло 259 тактов назад, и т. Д.

Узнайте, как увеличить (биты) метки времени доступны.

0 голосов
/ 02 июля 2010

Если вы можете гарантировать, что абсолютное значение дельты времени меньше, чем 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) и корректировке другого значения времени, чтобы соответствовать этому сдвигу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...