Общая функция задержки микроконтроллера

Приходите, пожалуйста, скажите мне, как эта функция работает? Я использую его в коде и знаю, как это работает, но я не уверен на 100%. Я понимаю концепцию увеличения входной переменной N, но как, черт возьми, это работает? Кроме того, если я многократно использую его в своем main() для разных задержек (разные входы для N), нужно ли мне «обнулять» функцию, если я использовал ее где-то еще? Справка: MILLISEC — это константа, определяемая Fcy/10000 или системными часами/10000.

Заранее спасибо.

// DelayNmSec() gives a 1mS to 65.5 Seconds delay
/*  Note that FCY is used in the computation.  Please make the necessary
    Changes(PLLx4 or PLLx8 etc) to compute the right FCY as in the define
    statement above. */
void DelayNmSec(unsigned int N)
{
unsigned int j;
    while(N--)
        for(j=0;j < MILLISEC;j++);
}

person Stumpyhuck29    schedule 04.06.2014    source источник


Ответы (3)


Это называется ожидание занятости, концепция, которая просто сжигает некоторые циклы ЦП, таким образом, "ожидая" держать ЦП «занятым», выполняя пустые циклы. Вам не нужно сбрасывать функцию, она будет делать то же самое при повторном вызове.

Если вы вызовете его с N=3, он повторит цикл while 3 раза, каждый раз считая с j от 0 до MILLISEC, что предположительно является константой, зависящей от тактовой частоты процессора.

person Pavel    schedule 04.06.2014

Первоначальный автор кода замерил время и просмотрел сгенерированный ассемблер, чтобы получить точное количество инструкций, выполняемых за миллисекунду, и настроил константу MILLISEC, чтобы она соответствовала константе для цикла for, как ожидание занятости.

В этом случае входной параметр N представляет собой просто количество миллисекунд, в течение которых вызывающая сторона хочет ждать, и количество выполнений цикла for.

Код сломается, если

  • используется на другом или более быстром микроконтроллере (в зависимости от того, как поддерживается Fcy), или
  • уровень оптимизации компилятора C изменен, или
  • изменена версия c-компилятора (поскольку он может генерировать другой код)

так что, если парень, который это написал, умен, может быть программа калибровки, которая определяет и настраивает константу MILLISEC.

person Soren    schedule 04.06.2014

Это то, что известно как ожидание занятости, при котором время, необходимое для конкретного вычисления, используется в качестве счетчика, вызывающего задержку.

У этого подхода есть проблемы, заключающиеся в том, что на разных процессорах с разной скоростью вычисления необходимо корректировать. Этот подход использовался в старых играх, и я помню симуляцию с использованием этого подхода ожидания, который был нацелен на старый процессор типа 8086, чтобы анимация двигалась плавно. Когда игра использовалась на ПК с процессором Pentium, вместо ракеты, величественно поднимающейся вверх по экрану в течение нескольких секунд, вся анимация мелькала перед глазами так быстро, что было трудно разобрать, что это за анимация.

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

Если операционная система не является вытесняющей многозадачной ОС, то ничего больше не будет выполняться до завершения обратного отсчета, что может вызвать проблемы в других потоках и задачах.

Если операционная система является вытесняющей многозадачностью, результирующие задержки будут иметь изменчивость, поскольку управление переключается на какой-то другой поток на некоторый период времени, прежде чем переключиться обратно.

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

person Richard Chambers    schedule 04.06.2014