在cortex-m3平台上,为什么UCOS-III不使用SVC进行pendsv?
On the cortex-m3 platform, why does UCOS-III not use SVC to perform pendsv?
最近在看UCOS-III的源码,对UCOS-III在Cortex运行时的任务切换有疑问- M3平台。它通过直接写寄存器SCB_ICSR(中断控制和状态寄存器)来使用PendSV进行任务切换,但是访问寄存器SCB_ICSR需要特权操作级别。这意味着处理器在特权操作级别的进程模式下运行,没有异常和中断,我认为这是不安全的。为什么UCOS-III不使用SVC来执行pendsv?是效率问题吗?有人可以为我解释一下吗?谢谢
背景:
Software: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
- 任务A调用SVC进行任务切换(例如,等待某项工作完成)。
- OS 收到请求,准备上下文切换,并挂起 PendSV 异常。
- 当CPU退出SVC时,它立即进入PendSV并进行上下文切换。
- 当 PendSV 完成并 returns 到线程级别时,它会执行任务 B。
- 中断发生,进入中断处理程序
- 当 运行 中断处理例程时,发生 SYSTICK 异常(对于 OS tick)。
- OS执行必要的操作,然后挂起PendSV异常准备
用于上下文切换。
- 当 SYSTICK 异常退出时,returns 进入中断服务程序。
- 当中断服务程序完成时,PendSV 启动并执行实际上下文
切换操作。
- 当PendSV完成后,程序returns进入Thread级别;
这次它 returns 到任务 A 并继续处理。
除非您使用 MPU 扩展,否则 运行 在用户模式或特权模式下确实没有太大区别。是的,它在用户模式下更安全 运行,因为您不能修改所有寄存器,但是您必须提供 SVC 调用才能提升权限并能够创建用户模式下的任务或特权模式。我希望当你有 MPU 扩展时会提供这个。
我不知道 UCOS-III,但我认为所有任务都像大多数 Cortex-M RTOS 一样 运行 享有特权,除非它们支持 MPU。
例如 SafERTOS 在 Cortex-M3 上使用 MPU。
最近在看UCOS-III的源码,对UCOS-III在Cortex运行时的任务切换有疑问- M3平台。它通过直接写寄存器SCB_ICSR(中断控制和状态寄存器)来使用PendSV进行任务切换,但是访问寄存器SCB_ICSR需要特权操作级别。这意味着处理器在特权操作级别的进程模式下运行,没有异常和中断,我认为这是不安全的。为什么UCOS-III不使用SVC来执行pendsv?是效率问题吗?有人可以为我解释一下吗?谢谢
背景: Software: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
- 任务A调用SVC进行任务切换(例如,等待某项工作完成)。
- OS 收到请求,准备上下文切换,并挂起 PendSV 异常。
- 当CPU退出SVC时,它立即进入PendSV并进行上下文切换。
- 当 PendSV 完成并 returns 到线程级别时,它会执行任务 B。
- 中断发生,进入中断处理程序
- 当 运行 中断处理例程时,发生 SYSTICK 异常(对于 OS tick)。
- OS执行必要的操作,然后挂起PendSV异常准备 用于上下文切换。
- 当 SYSTICK 异常退出时,returns 进入中断服务程序。
- 当中断服务程序完成时,PendSV 启动并执行实际上下文 切换操作。
- 当PendSV完成后,程序returns进入Thread级别; 这次它 returns 到任务 A 并继续处理。
除非您使用 MPU 扩展,否则 运行 在用户模式或特权模式下确实没有太大区别。是的,它在用户模式下更安全 运行,因为您不能修改所有寄存器,但是您必须提供 SVC 调用才能提升权限并能够创建用户模式下的任务或特权模式。我希望当你有 MPU 扩展时会提供这个。
我不知道 UCOS-III,但我认为所有任务都像大多数 Cortex-M RTOS 一样 运行 享有特权,除非它们支持 MPU。
例如 SafERTOS 在 Cortex-M3 上使用 MPU。