最近,我正在阅读UCOS-III的源代码,我对UCOS-III在Cortex-M3平台上运行时的任务切换有疑问。它通过直接写入寄存器SCB_ICSR(中断控制和状态寄存器)来使用PendSV进行任务切换,但是访问寄存器SCB_ICSR需要特权操作级别。这意味着处理器在特权操作级别以进程模式运行,没有异常和中断,我认为这不安全。为什么UCOS-III不使用SVC来执行pendsv?这是效率问题吗?有人可以帮我解释一下吗?感谢。
背景: 软件:UCOS-III
设备:Cortex-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
我认为这种方法更好: Cortex-M3 task switch using SVC and Pensv
答案 0 :(得分:1)
除非您使用的是MPU扩展,否则在用户或特权模式下运行之间并没有太大的区别。是的,在用户模式下运行更安全,因为您无法修改所有寄存器,但您必须提供SVC调用才能提升权限并能够创建用户模式或特权模式的任务。我希望在你有MPU扩展时提供这个。
我不了解UCOS-III,但我认为所有任务都像大多数Cortex-M RTOS一样运行特权,除非它们支持MPU。
答案 1 :(得分:0)
例如,SafERTOS在Cortex-M3上使用MPU。