Как я могу изменить задачу callback_function FreeRTOS?

Приведенный ниже фрагмент кода создает две задачи, которые пытаются распечатать слово. Задача 2 создается с более высоким приоритетом. Поскольку обе задачи выполняются в бесконечном цикле и не отказываются от времени начала добровольно, задача 1 никогда не будет выполняться (время начала ... Если это правильное слово).

Как я могу изменить функцию обратного вызова Задачи 2, чтобы эта Задача 1 также получила время начала?

void vTaskFunction ( void *pvParameters ) {
      for( ;; ) {
            vPrintString((char *) pvParameters );
      }
}

static const char *pcTextForTask1 = "Task 1 is running\r\n";
static const char *pcTextForTask2 = "Task 2 is running\r\n";

int main( void ) {
      /* ...MCU initialization...*/
      xTaskCreate( vTaskFunction, "Task 1", 1000, (void*)pcTextForTask1, 1, NULL ); // Task with priority 1
      xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 2, NULL ); // Task with priority 2
      vTaskStartScheduler();

      for( ;; );
}

Я надеюсь это имеет смысл


person Vlad Paskevits    schedule 22.10.2020    source источник
comment
Это желаемое поведение? Почему бы не изменить configUSE_PREEMPTION? Какое поведение вы хотите получить? Как часто вы хотите запускать другую функцию? а почему не vTaskDelay(10)?   -  person KamilCuk    schedule 22.10.2020
comment
Вполне ожидаемо, что постоянно выполняющаяся задача с более высоким приоритетом блокирует любую задачу с более низким приоритетом. Вам нужно подумать о том, как выделить время для задач с более низким приоритетом. Задержки - это в одну сторону.   -  person the busybee    schedule 22.10.2020


Ответы (1)


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

Настоящий вопрос - какого поведения вы ожидаете? Из написанного вами кода я не вижу четкой причины, каким должно быть ожидаемое поведение, учитывая, что одна из задач имеет более высокий приоритет, чем другая. Должно ли Задача 2 печатать строку чаще, чем Задача 1? Если да, то как это чаще всего определяется?

Если вы хотите, чтобы у обеих задач было время поработать, у вас есть следующие варианты:

  • Назначьте одинаковый приоритет обеим задачам и запустите в конфигурации с вытеснением,

  • Добавьте vTaskDelay(time) в задачу с более высоким приоритетом (Задача 2). В этом случае вы переведете Задачу 2 в спящий режим на определенное время, которое будет использовано задачей с более низким приоритетом (Задача 1) для выполнения своей работы. В этом случае Задача 1 выполнит столько работы (напечатает как можно больше строк). По истечении этого времени он будет вытеснен, и выполнение будет продолжаться исключительно в Задаче 2, пока не произойдет следующая задержка,

  • Добавьте какую-то синхронизацию между задачами (семафор, очередь, ...). Например, вы можете добавить два семафора: SemaphoreA и SemaphoreB. Задача 1 в этом случае могла бы выполнить: Дождаться SemaphoreA - ›Напечатать строку -› Дать SemaphoreB. Задача 2: дождаться SemaphoreB - ›Напечатать строку -› Дать SemaphoreA. Такая компоновка приведет к тому, что строки будут печататься чередующимися друг с другом (Task 1 is running - ›Task 2 is running -› Task 1 is running - ›...), поскольку каждая задача фактически будет ждать, пока другая задача завершит свою работу, прежде чем продолжить. В этом случае, однако, нет никакой дополнительной пользы от наличия разных приоритетов между задачами.

person Jacek Ślimok    schedule 22.10.2020