Это — старая версия документа!
Для синхронизации работы задач между собой в системе применяются события. Например, есть две активные (созданные) задачи: одна измеряет температуру, а другая выводит данные на экран. Вторая задача не может выводить на экран значение температуры, если температура еще не измерена. Поэтому вторая задача ожидает событие от первой, что измерение завершено, т.е. находится в режиме ожидания. После того, как температура измерена, т.е. происходит событие, которого ожидала вторая задача, вторая задача переходит в состояние готовности. После этого она может получить управление, т.е. перейти в работу. Кроме того, есть возможность присотановить здачу, а потом запустить вновь с того же места.
Таким образом, все активные (т.е. созданные сервисом OS_Task_Create) задачи, работающие в OSA, могут находиться в одном из пяти состояний:
не создана | задачи нет в списке активных задач (она либо не создана, либо была удалена) |
в ожидании | задача ждет какого-то события |
в готовности | задача дождалась своего события, но еще не начала выполняться. |
в работе | задача непосредственно выполняется |
приостановлена | задача приостановлена из-вне. Она активна, но не получает управления. |
Для того чтобы задача получила управление, нужно, чтобы:
Все задачи имеют приоритет от 0 (самый высокий приоритет) до 7 (самый низкий приоритет). Если к выполнению готовы сразу несколько задач, то первой выполнится та, приоритет которой выше. Если есть несколько готовых задач с одинаковым приоритетом, то они выполнятся последовательно.
События в OSA:
О первых четырех типах событий речь пойдет в соответствующих разделах этой документации. Пятый тип - дополнительный - это некое расширение системы, которое позволяет ждать какого-нибудь несистемного события
Например:
OS_Cond_Wait(TMR1IF); // Ждем установки флага TMR1IF или OS_Cond_Wait(ReadADC(0) > 128); // Ждем, когда напряжение на входе АЦП будет > Vdd/2
Для ожидания событий пятого типа есть два системных сервиса OS_Wait и OS_Wait_TO, которые описаны в разделе системные сервисы.
Бывает так, что одного и того же события одновременно ожидают две или более задач. Например, они ждут освобождения какого-нибудь ресурса (USART или доступ к внешней EEPROM). Как поведет себя система в этом случае? После того, как событие произойдет, все задачи, ожидающие это событие, перейдут в состояние готовности. Управление же получит задача с наиболее высоким приоритетом. Если после того, как эта задача отработает, событие сбрасывается (например, все задачи ожидали включения семафора, а та задача, которая получила управление, его сбросила), то все остальные задачи опять переходят в состояние ожидания.