Недавно я читаю исходный код UCOS-III, и у меня возник вопрос о переключении задач UCOS-III, когда он работает на платформе Cortex-M3.Он использует PendSV для переключения задач, напрямую записывая регистр SCB_ICSR (контроль прерываний и регистр состояния), но для доступа к регистру SCB_ICSR требуется уровень привилегий.Это означает, что процессор работает в режиме процесса на уровне привилегированных операций без исключений и прерываний, что я не считаю безопасным.Почему UCOS-III не использует SVC для выполнения pendsv?Это вопрос эффективности?Может ли кто-нибудь объяснить это мне?Спасибо.
Справочная информация: Программное обеспечение: UCOS-III
Аппаратное обеспечение: Cortex-M3 (STM32F103)
Код:
.thumb_func
OSStartHighRdy:
LDR R0, =NVIC_SYSPRI14 @ Set the PendSV
exception priority
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0]
MOVS R0, #0 @ Set the PSP to 0 for initial context switch call
MSR PSP, R0
LDR R0, =OS_CPU_ExceptStkBase @ Initialize the MSP to the OS_CPU_ExceptStkBase
LDR R1, [R0]
MSR MSP, R1
LDR R0, =NVIC_INT_CTRL @ Trigger the PendSV exception (causes context switch)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
CPSIE I @ Enable interrupts at processor level
Я думаю, что этот методлучше: Переключение задач Cortex-M3 с использованием SVC и Pensv
- Задача A вызывает SVC для переключения задач (например, ожидая завершения какой-либо работы).
- ОС получает запрос, готовится к переключению контекста и ожидает исключения PendSV.
- Когда ЦП выходит из SVC, он немедленно входит в PendSV и переключает контекст.
- Когда PendSV завершает работуи возвращается к уровню потока, он выполняет задачу B.
- Происходит прерывание и вводится обработчик прерывания.
- Во время выполнения процедуры обработчика прерывания возникает исключение SYSTICK (для тика ОС).
- ОС выполняет основную операцию, затем ожидает исключения PendSV и готовится к переключению контекста.
- При выходе из исключения SYSTICK возвращается к процедуре обработки прерывания.
- Когда процедура обработки прерывания завершается, PendSV запускается и выполняет фактические операции переключения контекста.
- Когда PendSV завершается, программа возвращается к уровню потока;на этот раз он возвращается к заданию A и продолжает обработку.