Открыть сервис

PendSV

PendSV (Pended Service Call, отложенный вызов обслуживания) — это программно управляемое прерывание в микроконтроллерах и процессорах с архитектурой ARM Cortex-M, предназначенное для отложенного выполнения задач операционной системы реального времени (RTOS) и обработки исключительных ситуаций. PendSV имеет наименьший приоритет среди всех программируемых прерываний в архитектуре Cortex-M и используется для переключения контекста задач, обработки системных вызовов (SVC) и управления асинхронными событиями, не требующими немедленного вмешательства.

История и происхождение

PendSV было введено компанией ARM в 2004 году с выпуском архитектуры ARMv7-M, на которой основаны процессоры Cortex-M3, Cortex-M4 и более поздние версии (Cortex-M7, Cortex-M33 и другие). Разработчики ARM столкнулись с проблемой: в системах реального времени, использующих RTOS, необходимо было безопасно переключать контекст между задачами, не нарушая работу обработчиков прерываний с более высоким приоритетом. До появления PendSV для этой цели использовались либо программные прерывания с фиксированным приоритетом, либо специальные механизмы, которые требовали сложной настройки и могли приводить к состояниям гонки.

PendSV было спроектировано как прерывание с самым низким приоритетом, которое может быть вызвано программно путём записи единицы в бит PENDSVSET регистра ICSR (Interrupt Control and State Register). Это позволило разработчикам RTOS откладывать переключение контекста до момента, когда все более приоритетные прерывания будут завершены, что гарантирует детерминированное поведение системы.

Архитектура и механизм работы

Регистры и управление

PendSV управляется через системный блок управления прерываниями (NVIC — Nested Vectored Interrupt Controller) в процессорах Cortex-M. Для его вызова используется регистр ICSR, в котором бит 28 (PENDSVSET) при установке в 1 генерирует запрос на прерывание PendSV. Приоритет PendSV задаётся через регистр SHPR3 (System Handler Priority Register 3), где младшие 8 бит определяют его приоритет (от 0 до 255, где 0 — наивысший приоритет). По умолчанию PendSV имеет наивысший возможный приоритет (0), но в RTOS его обычно устанавливают на самый низкий уровень (255), чтобы он не мешал работе других прерываний.

Обработка прерывания

Когда PendSV вызывается, процессор сохраняет контекст текущей задачи (регистры R0–R3, R12, LR, PC, xPSR) в стеке задачи, затем переходит к обработчику PendSV. В обработчике выполняется переключение контекста: сохраняется указатель стека текущей задачи, загружается указатель стека следующей задачи, и выполняется возврат из прерывания с использованием инструкции BX LR, которая восстанавливает контекст новой задачи. Этот процесс называется «отложенным переключением контекста» (deferred context switch).

Приоритет и вложенность

PendSV имеет наименьший приоритет среди всех прерываний в системе, включая SysTick (системный таймер) и внешние прерывания. Это означает, что:

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

Применение в операционных системах реального времени

Переключение контекста задач

В RTOS, таких как FreeRTOS, Zephyr, RT-Thread и других, PendSV используется для безопасного переключения между задачами. Когда планировщик решает переключить задачу (например, по истечении кванта времени или при блокировке задачи), он не выполняет переключение немедленно, а устанавливает бит PENDSVSET. Это гарантирует, что переключение произойдёт только после завершения всех текущих прерываний, что предотвращает повреждение контекста задач.

Обработка системных вызовов (SVC)

Системные вызовы (Supervisor Call, SVC) используются задачами для запроса услуг ядра RTOS (например, выделение памяти, отправка сообщений). SVC — это прерывание с фиксированным приоритетом, которое может быть вызвано из задачи. Однако обработка SVC может быть отложена с помощью PendSV: обработчик SVC сохраняет запрос и устанавливает PendSV, а фактическая обработка выполняется в контексте PendSV, когда это безопасно.

Управление асинхронными событиями

PendSV также используется для обработки событий, которые не требуют немедленного внимания, например, обновление состояния системы, сбор статистики или обработка данных от низкоприоритетных периферийных устройств. Это позволяет избежать блокировки высокоприоритетных прерываний.

Примеры использования

FreeRTOS

В FreeRTOS PendSV используется для переключения контекста задач. Функция vTaskSwitchContext() вызывается из обработчика прерывания SysTick (системного таймера) и, если необходимо переключение, устанавливает PendSV. Обработчик PendSV (xPortPendSVHandler) сохраняет контекст текущей задачи, загружает контекст следующей задачи и выполняет возврат. Это стандартная реализация для архитектуры ARM Cortex-M.

Zephyr

В Zephyr RTOS PendSV также применяется для переключения контекста. В архитектуре ARM Cortex-M обработчик PendSV (_PendSV) выполняет сохранение и восстановление контекста задач, а также обработку системных вызовов, которые были отложены. Zephyr использует PendSV в сочетании с SysTick для реализации вытесняющей многозадачности.

RT-Thread

В RT-Thread PendSV используется для переключения контекста и обработки отложенных прерываний. Обработчик PendSV (rt_hw_context_switch_interrupt) выполняет переключение между задачами, а также обрабатывает отложенные системные вызовы, такие как создание или удаление задач.

Критика и ограничения

Задержки при переключении контекста

Использование PendSV вводит дополнительную задержку при переключении контекста, так как переключение происходит только после завершения всех более приоритетных прерываний. В системах с высокой частотой прерываний это может привести к увеличению времени отклика на переключение задач. Однако для большинства приложений реального времени эта задержка является приемлемой, так как она детерминирована и предсказуема.

Зависимость от архитектуры

PendSV является специфичным для архитектуры ARM Cortex-M. На других архитектурах (например, RISC-V, AVR, PIC) аналогичные механизмы могут отсутствовать или реализовываться иначе. Для портирования RTOS на другие платформы требуется разработка альтернативных методов переключения контекста, например, использование программных прерываний с наименьшим приоритетом.

Сложность отладки

Ошибки в обработчике PendSV могут привести к трудноотлавливаемым сбоям, таким как повреждение стека или неправильное восстановление контекста. Это особенно актуально при разработке собственных RTOS или при модификации стандартных обработчиков.

Альтернативы

В некоторых архитектурах и RTOS для переключения контекста используются другие механизмы:

  • Программные прерывания (SWI): В архитектурах без PendSV, таких как ARM7TDMI, используются программные прерывания с наименьшим приоритетом.
  • Таймерные прерывания: В некоторых системах переключение контекста выполняется непосредственно в обработчике SysTick, но это может нарушить работу других прерываний.
  • Аппаратное переключение контекста: В некоторых процессорах (например, Infineon TriCore) есть встроенная поддержка переключения контекста, что снижает нагрузку на программное обеспечение.

Интересные факты

  • PendSV является одним из системных исключений в архитектуре ARM Cortex-M, наряду с Reset, NMI, HardFault, MemManage, BusFault, UsageFault, SVC и SysTick.
  • В процессорах Cortex-M0 и Cortex-M0+ PendSV также присутствует, но его реализация упрощена из-за отсутствия поддержки вложенных прерываний.
  • В некоторых RTOS, например, в uC/OS-III, PendSV используется не только для переключения контекста, но и для обработки отложенных прерываний от периферийных устройств.

Источники

  • ARM Architecture Reference Manual ARMv7-M and ARMv8-M (ARM DDI 0403E)
  • FreeRTOS Reference Manual (Real Time Engineers Ltd.)
  • Zephyr Project Documentation — Kernel Services
  • RT-Thread Programming Guide
  • Joseph Yiu, «The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors», 3rd Edition, Newnes, 2013

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →