Есть ли способ запустить поток в режиме 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 используется для разделения кода ядра и пользователя в разные режимы и обеспечения дополнительной защиты, но это влечет за собой небольшие потери производительности и занимаемой площади.

Другие вопросы по тегам