Контики задержка в секундах

Я пытаюсь разработать фрагмент кода 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*}; //сделай что-нибудь

Я не вижу, чтобы оба подхода были элегантными. В то время как один тратит впустую циклы ЦП, другой требует чрезмерно больших вычислений.

Есть ли лучший способ? Я знаю эти часы

К этому вопросу прилагаются следующие два:

  1. Как я могу вызвать один прототип Contiki из другого? Если я могу сделать это, я могу получить прерывание, которое заставляет transducerOutput вызывать процесс, из которого я могу инициировать etimer и события процесса.

  2. Что именно означает задержка процессора? Означает ли это, что все тактовые циклы ЦП задерживаются на заданную продолжительность? Если да, как влияют другие процессы, запущенные в настоящее время в системе?

Обновления Обновление 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 процесса для большего количества примеров.

Что именно означает задержка процессора?

Это форма занятого ожидания. Не используйте функции задержки или другие формы занятости, ожидая задержек, превышающих микросекунды - не энергоэффективных, не позволяющих запускаться другим процессам, и в худшем случае срок действия сторожевого таймера может истечь.

Другие вопросы по тегам