最近,我正在阅读UCOS-III的源代码,当它在Cortex-M3平台上运行时,我有一个关于UCOS-III的任务切换的问题。它使用PendSV直接写寄存器SCB_ICSR (中断控制和状态寄存器)进行任务切换,但访问寄存器SCB_ICSR需要权限操作级别。这意味着处理器在进程模式下运行在特权操作级别,没有异常和中断,我认为这是不安全的。为什么UCOS-III不使用SVC来执行任务?这是效率的问题吗?有人能帮我解释一下吗?谢谢。
背景:软件:UCOS-III
硬件:皮质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我认为这个方法更好:基于SVC和Pensv的皮层-m3任务切换
发布于 2018-05-22 08:49:10
除非您正在使用MPU扩展,否则在用户模式和特权模式下运行并没有太大的区别。是的,在用户模式下运行会安全一些,因为您不能修改所有寄存器,但是您必须提供SVC调用才能提高特权并能够创建属于用户模式或特权模式的任务。我希望这是在您有MPU扩展时提供的。
我不知道UCOS-III,但我假设所有任务都像大多数Cortex-M RTOS一样具有特权运行,除非它们支持MPU。
发布于 2019-02-07 13:19:37
例如,SafERTOS在Cortex-M3上使用MPU。
https://stackoverflow.com/questions/50444352
复制相似问题