Как перезапустить задачу - PullRequest
0 голосов
/ 12 февраля 2019

Как перезапустить задачу с более низким приоритетом из задачи с более высоким приоритетом?

Это общий вопрос о том, как работает ОСРВ во встроенных системах.

У меня есть несколько задач с разными приоритетами.Задача с более низким приоритетом имеет определенные шаги, например, шаг1, шаг2, шаг3.

Задача с наивысшим приоритетом обрабатывает системные сбои.Если происходит сбой, то ISR в системе приведет к немедленному запуску задачи с более высоким приоритетом.

Мой вопрос ... Если сбой системы происходит во время выполнения задачи с более низким приоритетом в середине, например, step2, и мы не хотимчтобы выполнить остальные шаги в задаче с более низким приоритетом, тогда как мы ее выполним?

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

Обеспечивает ли встроенная ОСРВ (например, Keil RTX или FreeRTOS) такой механизм, чтобы по определенному сигналу из задачи с более высоким приоритетом / ISR можно было перезапустить задачу с более низким приоритетом?

1 Ответ

0 голосов
/ 12 февраля 2019

Механизм, который вы предлагаете, вряд ли будет поддерживаться ОСРВ, поскольку он будет недетерминированным по своему поведению.Например, такой механизм RTOS не будет знать о распределении ресурсов для инициализации в рамках задачи и о том, будет ли безопасно просто «перезапустить», или о том, как выполнить очистку, если это не так.

Более того, RTOSвытесняет на уровне машинных команд, а не между логическими функциональными «шагами» - нет определения того, где он находится в процессе.

Любой такой механизм должен быть встроен в реализацию задачи на уровне приложения, а не в ОСРВ.уровень для того, чтобы процесс был управляемым и детерминированным.Например, у вас может быть такая структура, как:

for(;;)
{
    step1() ;
    if( restart() )
    {
        clean_up() ;
        continue ;
    }

    step2() ;
    if( restart() )
    {
        clean_up() ;
        continue ;
    }

    step3() ;
}

Где неисправность запрашивает перезапуск, и запрос опрашивается через restart() в определенных точках задачи, где перезапускдействителен или безопасен.clean_up() выполняет любое необходимое управление ресурсами, а continue вызывает переход к началу цикла задач (в более сложной ситуации может использоваться goto, но это, вероятно, уже плохая идея - донхуже не будет!).

По сути, дело в том, что вы должны закодировать задачу для надлежащей обработки неисправности, а ОСРВ не может «знать», что уместно.

Пока нетуниверсальный механизм RTOS для того, что вы предлагаете, возможно, возможно реализовать платформу для поддержки требуемого поведения, но это потребовало бы, чтобы вы записали все свои задачи в определенный шаблон, диктуемый такой платформой - реализуя комплексное решение, которое обрабатывает ресурсыочистка простым способом, однако, нетривиальна.

QNX Neutrino имеет "High Availability Framework" , например, который поддерживает перезапуск процесса и автоматическую очистку.Это пример того, что можно сделать, но это, конечно, специфично для этой ОСРВ.Если это поведение имеет решающее значение для вашего приложения, то вам необходимо соответствующим образом выбрать ОСРВ, а не полагаться на «традиционные» механизмы, доступные для любой ОСРВ.

...