最近,我读UCOS-III的源代码,我当它在Cortex-M3平台上运行约UCOS-III的任务切换的问题。它使用PendSV任务切换通过直接写入寄存器SCB_ICSR(中断控制和状态寄存器),但访问注册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
除非您使用的是MPU扩展真的不会使用户或特权模式下运行之间相差太大。是的,它是在用户模式下比较安全的运行,你不能修改所有寄存器,但你必须提供一个SVC呼叫能够提高特权,必须创建一个是用户模式或特权模式任务的能力。我希望当你有MPU的扩展,这是提供。
我不知道UCOS-III,但我会假设所有的任务都运行特权像大多数的Cortex-M RTOS,除非他们支持MPU。
例如SAFERTOS使用上Cortex-M3的MPU。