Выкуп в FreeRTOS

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

Есть ли способ сделать это во FreeRTOS? (Это достигается через приоритет задачи?)

5 ответов

НЕТ! Оба приведенных выше ответа ОПАСНЫ.

НЕ ИСПОЛЬЗУЙТЕ taskENTER_CRITICAL() или taskEXIT_CRITICAL() внутри ISR - необычно иметь критический раздел в ISR, но если вы это сделаете, тогда используйте http://www.freertos.org/taskENTER_CRITICAL_FROM_ISR_taskEXIT_CRITICAL_FROM_ISR.html. (возможно, порт AVR32 является исключением из этого правила?)

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

Если мое понимание вашего вопроса верное, вы хотите, чтобы прерывание разблокировало задачу, а затем, если эта задача является задачей с наивысшим приоритетом, из которой она может быть запущена, пусть прерывание возвращается непосредственно к разблокированной задаче. Если я правильно понимаю, есть пример того, как сделать это эффективным способом, на следующей странице: http://www.freertos.org/RTOS_Task_Notification_As_Counting_Semaphore.html

Короткий ответ будет таким: Да, это достигается с помощью приоритета задачи.

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

Следует отметить, что это действительно так, только если обработчик вызывается через FreeRTOS. На процессоре Cortex-A есть общая точка входа IRQ в обработчике исключений IRQ или FIQ, которая, скорее всего, обрабатывается FreeRTOS или иным образом диспетчером IRQ, который легко оборачивается FreeRTOS, обычно функцией на уровне порта называется vApplicationIRQHandler().

На Cortex-M это не всегда так, поскольку вектором обычно манипулирует API MCU поставщика. На Cortex-M я бы защитился от этого, используя portYIELD_FROM_ISR() в ISR, который должен быть реализован, чтобы предоставить ядру возможность выполнять переключение контекста.

Вы можете использовать xTaskResumeFromISR для этого.

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

1. включить приоритет

Это очень просто сделать.

Все параметры конфигурации FreeRTOS находятся в "FreeRTOSConfig.h"

#define configUSE_PREEMPTION                    1

Вы можете установить значение 1, чтобы использовать упреждающий планировщик RTOS, или 0, чтобы использовать кооперативный планировщик RTOS.

Проверьте эту ссылку для получения дополнительной информации

2. Используйте критический раздел внутри ISR

void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

RTOS не сделает ничего лишнего в этой критической части

ссылка: здесь

это легко,

когда вы создаете задачу, вы можете установить приоритет.

Принимая во внимание, что 0 — это самый высокий приоритет, а, например, в процессоре M4 15 — самый низкий, вам нужно только присвоить этой задаче меньший приоритет. FreeRTOS также предоставляет несколько макросов, которые еще больше упрощают задачу, например, вы можете просто указать osPriorityHigh вместо числа.

вот вам и пример конфигурации задачи:

            xReturned = xTaskCreate(
                   vSafety_Inputs,       /* Function that implements the task*/
                   "NAME",          /* Text name for the task. */
                  configMINIMAL_STACK_SIZE,/* Stack size in words, not bytes. */
                   ( void * ) 1,    /* Parameter passed into the task. */
               osPriorityHigh,/* Priority at which the task is created. */
                  &xHandle );  /* Used to pass out the created task's handle. */
Другие вопросы по тегам