Есть ли способ запустить поток в режиме USER для azure-rtos (threadx)?
Я играл с azure-rtos (THREADX) и пытался портировать ОС для системы на основе Cortex R5. После просмотра файлов портов кажется, что ОС запускает потоки в режиме Supervisor (SVC).
Например, в функции _tx_thread_stack_build
, при построении стека для потоков значение инициализации для CPSR
таков, что биты режима соответствуют режиму SVC. Это значение инициализации позже используется для инициализации CPSR перед переходом к функции входа потока.
Ниже приведен фрагмент функции _tx_thread_stack_build
сохранение значения инициализации CPSR в стеке потока. Для справки см. Файл tx_thread_stack_build.S.
.global _tx_thread_stack_build
.type _tx_thread_stack_build,function
_tx_thread_stack_build:
@ Stack Bottom: (higher memory address) */
@
...
MRS r1, CPSR @ Pickup CPSR
BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR
ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled
STR r3, [r2, #4] @ Store initial CPSR
...
Другой пример: функция tx_thread_context_restore.S
переключается в режим SVC из режима IRQ, чтобы сохранить контекст отключаемого потока, что указывает на то, что ОС здесь предполагает, что поток работает в режиме SVC. Для справки см. Файл tx_thread_context_restore.s
Ниже приведен фрагмент функции сохранения контекста отключаемого потока.
LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers
MOV r1, lr ; Save lr (point of interrupt)
MOV r2, #SVC_MODE ; Build SVC mode CPSR
MSR CPSR_c, r2 ; Enter SVC mode
STR r1, [sp, #-4]! ; Save point of interrupt
STMDB sp!, {r4-r12, lr} ; Save upper half of registers
MOV r4, r3 ; Save SPSR in r4
MOV r2, #IRQ_MODE ; Build IRQ mode CPSR
MSR CPSR_c, r2 ; Enter IRQ mode
LDMIA sp!, {r0-r3} ; Recover r0-r3
MOV r5, #SVC_MODE ; Build SVC mode CPSR
MSR CPSR_c, r5 ; Enter SVC mode
STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack
Это приводит меня к вопросу, есть ли способ запускать потоки в режиме USER? Обычно в ОС потоки выполняются в режиме ПОЛЬЗОВАТЕЛЯ, в то время как ядро и предоставляемые им службы работают в режиме SVC, что, по-видимому, не относится к Azure RTOS.
1 ответ
Это задумано, ThreadX представляет собой небольшое монолитное ядро, в котором код приложения тесно интегрирован с ядром и находится в одном и том же адресном пространстве и режиме. Это позволяет повысить производительность и уменьшить занимаемую площадь. Вы также можете использовать модули ThreadX, где доступный MPU или MMU используется для разделения кода ядра и пользователя в разные режимы и обеспечения дополнительной защиты, но это влечет за собой небольшие потери производительности и занимаемой площади.