Как прочитать значение таймера в CAPL?
variables
{
mstimer T1;
long x,y;
}
on start
{
setTimer(T1,1); /*Timer set to 1ms*/
x=timeNow()/100000.0; /*Getting a time stamp when i start a timer*/
}
on timer T1
{
if(response==0) /*Check if response is sent or a function*/ has completed successfully*/ /*CONDITION*/
{
cancelTimer(T1); /*Cancel timer if response is correct*/
y=timeNow()/100000.0; /*Getting a timestamp when i stop a timer.*/
write("Total time taken is %d",y-x); /*Getting the time required to complete the condition (response==0)*/
}
else /*Setting timer again to check the condition*/
{
setTimer(T1,1);
write("Timer started again");
}
}
значение (yx) всегда показывает 1 мс, поскольку таймер установлен на 1 мс, но что, если условие стало истинным при 0,7 мс. Я хотел точное время, когда условие стало реальностью.
Я использовал функцию timeNow для получения меток времени.
5 ответов
Используя CAPL-функцию timeToElapse, можно прочитать оставшееся время вашего таймера, когда он истечет, будет вызвана процедура события, реализованная в таймере V2G.
В справке вы можете найти более подробное описание методов таймера в CANoe.
CAPL Functions » Classes » Timer, MsTimer
По поводу вашего обновления в оригинальном вопросе. Как насчет этого:
variables{
mstimer myTimer;
long timePoint = 0;
int somethinghappen = 0;
}
on start{
long firstTimeDuration, period;
firstTimeDuration = 1000; period = 100;
setTimerCyclic(myTimer, firstTimeDuration, period); /*Timer is set cyclical*/
timePoint = timeNow()/100000.0; /*
Remember the time on measurement start,
which is on start always 0, so what's the reason to do this here?
*/
write("Start time %5.3f", timePoint);
}
on timer myTimer{
if(somethinghappen != 0){
//you need to cancel the timer only when it was set as cyclic, see setTimerCyclic()
cancelTimer(myTimer); /*Cancel timer if response arrived*/
write("Total time taken is %5.3f", timeNow()/100000.0 - timePoint);
}else{
//nothing todo at the moment
}
}
on key 'b' {//boom
somethinghappen = 1;
}
Не забудьте нажать определенную клавишу во время измерения.
Если вам нужно измерить время меньше единицы мс, используйте функцию TimeNowNS() (наносекунды). В основном замените ваш код на TimeNow() на TimeNowNS() и настройте используемые переменные на двойные значения, чтобы записанные вами метки времени соответствовали должным образом.
Как уже отмечали многие, я полагаю, что вы используете on timer
uncorrectly. Из базы знаний Вектор,
Вы можете определить временные события в CAPL. Когда это событие происходит, то есть когда истекает определенный период времени,
on timer
процедура называется.
Из того, что я вижу здесь, выполнив вашу логическую проверку внутри on timer
, вы всегда будете читать текущее время, прошедшее в конце таймера. Если вы хотите выйти из таймера преждевременно из-за возникновения определенных условий, я бы предложил полный обход. Вы пытались установить системную переменную?
/* Timer values depend on the value that u gave in settimer() API, This is one of the way you can know the value of timer*/
Variable
{
mstimer t1;
timer t2;
}
on Start
{
Settimer(t1,10);/*waits for 10 ms and then goes to timer t1*/
}
on timer t1
{
settimer(t2,10);/*waits for 10 s and then goes to timer t2, so the value of timer t1 = 10s*/
}
on timer t2
{
}
/*This is what i understood from what you asked. For further clarification give some more explanation on what you are asking*/
Я не мог видеть какую-либо ценность для доступа. Здесь вы делаете булеву проверку, вот и все. Пожалуйста, уточните свой вопрос.