Остановка и запуск задачи - PullRequest
0 голосов
/ 15 января 2019

Итак. Это абстрактный вопрос.
Узнав о FreeRTOS, я застрял в некоторых проблемах.

В качестве фона я пытался моргнуть светодиодом из функции, и он мигает в отношении того, находится ли он внутри (;;) или снаружи, что несколько не соответствует тому факту, что задача выполняется только внутри для (;;) цикл после инициализации / первого запуска через него.

Пытаться быть максимально ясным:

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

Задача определяется как:

void vATaskFunction( void *pvParameters )
{
    for( ;; )
    {
        -- Task application code here. --
    }

    /* Tasks must not attempt to return from their implementing
    function or otherwise exit.  In newer FreeRTOS port
    attempting to do so will result in an configASSERT() being
    called if it is defined.  If it is necessary for a task to
    exit then have the task call vTaskDelete( NULL ) to ensure
    its exit is clean. */
    vTaskDelete( NULL );
}

Зная это, мой вопрос:

  • Если задача представляет собой бесконечный цикл, как планировщик приостанавливает ее (переключается на другую задачу)?
  • Что происходит с текущими значениями внутри локальных переменных?
  • При переключении обратно к нашей задаче, задача переходит непосредственно в цикл for (;;) или проходит через функцию нормально, как обычно?

1 Ответ

0 голосов
/ 16 января 2019

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

ОСРВ работают совершенно иначе, чем "нормальные" ОС.

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

Как пример: если вы запускаете задачи A и B , приоритет задачи A выше, чем B , если задача A не вернет управление системе, войдя в состояние «приостановлено» или «заблокировано» (например, в ожидании уведомления, семафора, мьютекса или чего-то еще), задача A будет есть 100% времени выполнения и задания B 0% (ноль)

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

...