You are here

Задачи и сопрограммы

Перевод может содержать ошибки. Читайте первоисточник: Tasks and Co-routines

Назад: [Как работает FreeRTOS] Вверх: [Как работает FreeRTOS] Вперёд: [Как работает FreeRTOS]

 

Смотрите раздел "Как работает FreeRTOS" для ознакомления с основными понятиями многозадачности.

Страницы документации Tasks и Co-Routine предоставляют информацию, позволяющую судить о том, когда совместное использование уместно, а когда нет. Ниже приводится краткая сводка. Обратите внимание, что приложение может быть спроектировано с использованием только задач, только сопрограмм или их комбинации, однако задачи и сопрограммы используют разные функции API, и поэтому очередь (или семафор) не может использоваться для передачи данных из задачи в сопрограмму или наоборот.

Сопрограммы, вообще говоря, предназначены для использования только на очень маленьких процессорах, имеющих серьёзные ограничения ОЗУ.

 

Характеристики 'задачи'

Вкратце: Приложение реального времени, которое использует ОСРВ, может быть структурировано как набор независимых задач. Каждая задача выполняется внутри своего собственного контекста без случайных зависимостей от других задач внутри системы или от самого планировщика ОСРВ. Только одна задача в приложении может выполняться в любой момент времени, и планировщик ОСРВ отвечает за выбор задачи, которая будет выполняться. Следовательно, планировщик ОСРВ может многократно запускать и останавливать каждую задачу (загружать и выгружать каждую задачу) во время выполнения приложения. Поскольку задача не знает об активности планировщика, он отвечает за то, чтобы гарантировать что контекст выполнения (значения регистров, стека и т.д.) когда задача загружается был точно такой, как когда эта задача была выгружена. Для этого каждой задаче предоставляется свой стрек. Когда задача выгружается, контекст выполнения сохраняется в стеке задачи, поэтому он может быть точно восстановлен, когда эта же задача позже будет снова загружена. Смотрите раздел How FreeRTOS Works для получения более подробной информации.

 

Задачи: резюме

Просто.
Нет ограничений на использование.
Поддерживает полностью вытесняющую многозадачность.
Полностью настраиваемые приоритеты.
Каждая задача поддерживает свой собственный стек, что ведёт к увеличению требуемого объёма ОЗУ.
Реентерабельность должна быть тщательно продумана, если используется вытесняющая многозадачность.

 

Характеристики 'сопрограммы'

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

Сопрограммы концептуально похожи на задачи, но имеют следующие фундаментальные отличия (более подробно они описаны на странице co-routine documentation page):

  1. Использование стека

    Все сопрограммы внутри приложения используют один стек. Это значительно уменьшает требуемый объём ОЗУ по сравнению с аналогичным приложением, написанным с использованием задач.

  2. Планирование и приоритеты

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

  3. Реализация макросами

    Реализация сопрограмм обеспечивается с помощью набора макросов.

  4. Ограничения в использовании

    Сокращение используемого объёма ОЗУ достигается за счёт некоторых строгих ограничений в том, как могут быть структурированы сопрограммы.

 

Сопрограммы: резюме

Использование одного стека всеми сопрограммами уменьшает используемый объём ОЗУ.
Кооперативная многозадачность делает реентерабельность меньшей проблемой.
Высокая переносимость между архитектурами.
Полностью настраиваемые приоритеты по отношению к остальным сопрограммам, но всегда могут быть вытеснены задачами, если используются и те, и другие вперемешку.
Отсутствие (переполнение?) стека требует пристального внимания. Lack of stack requires special consideration.
Ограничения на то, где могут быть сделаны вызовы API.
Кооперативная многозадачность только внутри самих сопрограмм.

 

Hobby's category: