Контики задержка в секундах
Я пытаюсь разработать фрагмент кода contiki, в котором мне нужно три секунды ждать вывода преобразователя. Хотя может показаться, что это не похоже на преобразователь, во время разработки я хочу смоделировать поведение на людских скоростях, и, следовательно, мне нужно установить таймер на 3 секунды.
Библиотека таймеров contiki довольно хорошо документирована и содержит множество примеров, в которых упоминается создание, настройка и сброс таймера. Однако, если у меня есть код, подобный следующему:
timer_set(&transducerOutputWaitTimer);
bool if_blk_executed;
if(timer_expired(&&transducerOutputWaitTimer)){
if_blk_executed = true;
//do something
}
if(if_blk_executed)
printf("Sunrise");
else
printf("It is not dawned yet");
Теперь истечение не запускается сразу после установки таймера. Таким образом, блок if никогда не выполняется. По сути это никогда не рассвет.
Теперь есть два способа заставить систему ждать. Во-первых, добавление цикла таймера к таймеру следующим образом: while(! Timer_expired(&&transducerOutputWaitTimer))){}; //сделай что-нибудь
или cpu_delay_usecs{mytimerdur_in_secs*10^6*}; //сделай что-нибудь
Я не вижу, чтобы оба подхода были элегантными. В то время как один тратит впустую циклы ЦП, другой требует чрезмерно больших вычислений.
Есть ли лучший способ? Я знаю эти часы
К этому вопросу прилагаются следующие два:
Как я могу вызвать один прототип Contiki из другого? Если я могу сделать это, я могу получить прерывание, которое заставляет transducerOutput вызывать процесс, из которого я могу инициировать etimer и события процесса.
Что именно означает задержка процессора? Означает ли это, что все тактовые циклы ЦП задерживаются на заданную продолжительность? Если да, как влияют другие процессы, запущенные в настоящее время в системе?
Обновления Обновление 1: метод while не работает. Код, возможно, вошел в бесконечный цикл. Обновление 2: я попытался с подходом clock_delay(3*CLOCK_SECOND) после установки таймера. Это сработало. Однако, в этом случае, зачем вообще нужен метод таймера?
Обновление 3 (это изменяет контекст ответа, следовательно, добавляя этот комментарий согласно предложению)
Мой таймер должен использоваться вне процесса в другой функции void. В этом случае мне нужно использовать библиотеку timer(), а не e timer(что характерно для процесса. Так как же заставить мой метод ожидать нужного времени в таких случаях?
1 ответ
Есть несколько абстракций Contiki, построенных поверх библиотеки таймеров - обычно нет необходимости использовать timer_t
структуры напрямую. Вместо этого есть таймеры событий (struct etimer
), которые хорошо сочетаются с процессами Contiki и таймерами обратного вызова (struct ctimer
), оба из которых используются внутри страны struct timer
, Для менее требовательного к ОЗУ варианта с более ограниченным API есть вторые таймеры (struct stimer
). Наконец, в системе есть один таймер реального времени (struct rtimer
).
Пример использования таймера события: установите и подождите 3 секунды:
static struct etimer timer;
etimer_set(&timer, 3 * CLOCK_SECOND);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
Как я могу вызвать один прототип Contiki из другого?
Есть process_poll
- см. документацию API процесса для большего количества примеров.
Что именно означает задержка процессора?
Это форма занятого ожидания. Не используйте функции задержки или другие формы занятости, ожидая задержек, превышающих микросекунды - не энергоэффективных, не позволяющих запускаться другим процессам, и в худшем случае срок действия сторожевого таймера может истечь.