Хотя вложенный захват ресурсов является допустимым, запрещается вложенный захват задачей одного и того же ресурса.
Не допускается применение сервиса TerminateTask и WaitEvent внутри критической секции. Перед завершением задача обязана освободить все захваченные ресурсы.
Кроме того, запрещается использование критических секций в обработчиках прерываний.
Обработка прерываний
В этом разделе приводится информация, необходимая для реализации обработки прерываний в проекте RTOS. Следование рекомендациям этого раздела является обязательным, если в ваше индивидуальное задание включена обработка прерываний.
Наряду с задачами в пользовательских приложениях могут использоваться обработчики прерываний (interrupt service routine – ISR). Тем не менее, на их использование накладывается важное ограничение: целый ряд сервисов ОСРВ из обработчика вызывать запрещается. С другой стороны, в ISR можно использовать некоторые сервисы, которые запрещено вызывать из пользовательских задач. Более подробная информация приведена в таблице 1.
Таблица 2
Сервис ОСРВ | Вызов из обработчика | Вызов из задачи |
ActivateTask | запрещён | разрешён |
ISRActivateTask | разрешён | запрещён |
TerminateTask | запрещён | разрешён |
GetResource | запрещён | разрешён |
ReleaseResource | запрещён | разрешён |
PIP_GetRes | запрещён | разрешён |
PIP_ReleaseRes | запрещён | разрешён |
P | запрещён | разрешён |
V | запрещён | разрешён |
WaitEvent | запрещён | разрешён |
SetEvent | разрешен | разрешён |
ClearEvent | запрещен | разрешен |
GetEvent | запрещён | разрешён |
WaitSysEvent | запрещён | разрешён |
SetSysEvent | разрешен | разрешён |
GetSysEvent | запрещён | разрешён |
EnterISR | разрешён | запрещён |
LeaveISR | разрешён | запрещён |
StartOS* | запрещён | запрещён |
ShutdownOS | разрешён | разрешён |
*сервис StartOS может вызываться только когда система ещё не запущена, но не может вызываться в процессе её работы (задачами или обработчиками прерываний).
Вызов сервиса EnterISR должен предшествовать вызову любого другого сервиса ОС из ISR. Сервис LeaveISR всегда располагается в конце обработчика и вызывается только если ранее был вызван EnterISR
Вызов сервиса ActivateTask из обработчика запрещается. Вместо этого для активизации задач используется сервис ISRActivateTask. При этом происходит только планирование задачи (постановка задачи в очередь готовых)..
Использование вложенных прерываний не допускается.