首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法在用户模式下运行线程为azure-rtos (threadx)?

是否有一种方法在用户模式下运行线程为azure-rtos (threadx)?
EN

Stack Overflow用户
提问于 2020-08-25 05:44:48
回答 1查看 408关注 0票数 0

我一直在玩天蓝色rtos (THREADX),并试图移植基于皮质R5系统的操作系统。在查看端口文件之后,操作系统似乎以Supervisor (SVC)模式运行线程。

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

下面是在线程堆栈上存储CPSR初始化值的函数_tx_thread_stack_build的片段。有关您的参考资料,请参阅文件build.S

代码语言:javascript
复制
    .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模式下运行。有关参考资料,请参阅文件restore.s

下面是正在切换的线程的函数保存上下文的片段。

代码语言:javascript
复制
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

这就引出了一个问题,是否有一种在用户模式下运行线程的方法?在OS中,线程通常以用户模式运行,而内核和它提供的服务则运行在SVC模式下,而Azure RTOS似乎并非如此。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-25 16:07:04

这是设计上的,ThreadX是一个小型的单块内核,应用程序代码与内核紧密集成,并且生活在相同的地址空间和模式中。这使得性能更好,占用空间更小。您还可以使用ThreadX模块,可用的MPU或MMU用于将内核和用户代码分离为不同的模式,并提供额外的保护,但这会带来很小的性能和占用空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63572697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档