Выполнение сопрограмм
и их приоритеты
Как и при создании задачи, при создании
сопрограммы ей назначается приоритет.
Сопрограмма с высоким приоритетом имеет
преимущество на выполнение перед сопро-
граммой с низким приоритетом.
Следует помнить, что приоритет сопро-
граммы дает преимущество на выполнение
одной сопрограммы только перед другой со-
программой. Если в программе используют-
ся как задачи, так и сопрограммы, то задачи
всегда будут иметь преимущество перед со-
программами. Сопрограммы выполняются
только тогда, когда нет готовых к выполне-
нию задач.
Важно, что преимущество на выполнение
не означает, что если в системе появилась
готовая к выполнению сопрограмма с более
высоким приоритетом, чем та, что выполня-
ется в данный момент, то управление полу-
чит эта высокоприоритетная сопрограмма.
Сопрограммы выполняются в режиме ко-
оперативной многозадачности. Это означает,
что одна сопрограмма сменяет другую лишь
тогда, когда выполняющаяся в данный мо-
мент сопрограмма сама передает управление
другой сопрограмме посредством вызова
API-функции. Причем если в момент переда-
чи управления в состоянии готовности к вы-
полнению находятся несколько сопрограмм,
то управление получит самая высокоприори-
тетная среди них.
Итак, сопрограмма прерывает свое выпол-
нение только при выполнении одного из сле-
дующих условий:
1. Сопрограмма перешла в блокированное
состояние, вызвав соответствующую API-
функцию.
2. Сопрограмма выполнила принудительное
переключение на другую сопрограмму
(аналог принудительного переключения
контекста задачи).
3. Сопрограмма была вытеснена задачей, ко-
торая до этого находилась в приостанов-
ленном или блокированном состоянии.
Сопрограмма не может быть вытеснена
другой сопрограммой, однако появившаяся
готовая к выполнению задача вытесняет лю-
бую сопрограмму.
Д л я ко р р е к т н о г о в ы п о л н е н и я с о -
п р о г р а м м н е о б х о д и м о о р г а н и з о -
вать в программе периодический вы-
зов API-функции vCoRoutineSchedule().
Рекомендованное место для вызова API-
функции vCoRoutineSchedule() — тело за-
дачи Бездействие, подробнее об этом бу-
дет написано ниже. После первого вызова
Достарыңызбен бөлісу: |