【问题标题】:Is there a way to run thread in USER Mode for azure-rtos (threadx)?有没有办法在 azure-rtos (threadx) 的用户模式下运行线程?
【发布时间】:2023-03-26 09:42:01
【问题描述】:

我一直在使用 azure-rtos (THREADX) 并尝试为基于 cortex R5 的系统移植操作系统。查看端口文件后,OS 似乎以 Supervisor (SVC) 模式运行线程。

例如,在函数_tx_thread_stack_build 中,在为线程构建堆栈时,CPSR 的初始化值使得模式位对应于 SVC 模式。这个初始化值稍后用于在跳转到线程入口函数之前初始化CPSR。

下面是函数_tx_thread_stack_build的sn-p,它将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从IRQ模式切换到SVC模式,以保存线程被切换出去的上下文,这表明OS在这里假设线程在SVC模式下运行。供您参考,请参阅文件tx_thread_context_restore.s

以下是被切换线程的函数保存上下文的sn-p。

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 模式下运行线程?在操作系统中,线程通常以 USER 模式运行,而其提供的内核和服务以 SVC 模式运行,这在 Azure RTOS 中似乎并非如此。

【问题讨论】:

    标签: threadx azure-rtos


    【解决方案1】:

    这是设计使然,ThreadX 是一个小型单片内核,其中应用程序代码与内核紧密集成,并存在于相同的地址空间和模式中。这允许更高的性能和更低的占用空间。您还可以使用 ThreadX 模块,其中可用的 MPU 或 MMU 用于将内核和用户代码分离到不同的模式并提供额外的保护,但这会导致较小的性能和占用空间损失。

    【讨论】:

    • 感谢安德烈斯的回答。
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多