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