Механизм
взаимного исключения
Доступ к ресурсу, операции с которым
одновременно выполняют несколько задач
и/или прерываний, должен контролиро-
ваться механизмом взаимного исключения
(mutual exclusion).
Механизм взаимного исключения гаранти-
рует, что если задача начала выполнять неко-
торые действия с ресурсом, то никакая другая
задача (или прерывание) не сможет получить
доступ к данному ресурсу, пока операции
с ним не будут завершены первой задачей.
FreeRTOS предлагает несколько способов
реализации механизма взаимного исключе-
ния:
критические секции;
•
мьютексы;
•
задачи-сторожа.
•
Однако наилучшая реализация взаимно-
го исключения — это написание програм-
мы, в которой ресурсы не разделяются меж-
ду несколькими задачами и доступ к одному
ресурсу выполняет единственная задача или
прерывание.
Критические секции
Сразу следует отметить, что критические
секции — это очень грубый способ реализа-
ции взаимного исключения.
Критическая секция — это часть програм-
мы, которую в один момент времени может
выполнять только одна задача или прерыва-
ние. Обычно защищаемый критической сек-
цией участок кода начинается с инструкции
входа в критическую секцию и заканчивается
инструкцией выхода из нее.
Во FreeRTOS, в отличие от более сложных
операционных систем, существует одна гло-
бальная критическая секция. Если одна за-
дача вошла в критическую секцию, то ника-
кая другая задача не будет выполняться, пока
не произойдет выход из критической секции.
FreeRTOS допускает два способа реализа-
ции критической секции:
запрет прерываний;
•
приостановка планировщика.
•
Запрет прерываний
Во FreeRTOS вход в критическую сек-
цию, реализованную запретом прерываний,
сводится к запрету всех прерываний про-
цессора или (в зависимости от конкретно-
го порта FreeRTOS) к запрету прерываний
с приоритетом равным и ниже макроопре-
деления configMAX_SYSCALL_INTERRUPT_
PRIORITY.
Во FreeRTOS участок кода, защищаемый
критической секцией, которая реализо-
вана запретом прерываний, — это участок
кода, окруженный вызовом API-макросов:
Достарыңызбен бөлісу: |