在cortex-m3平台上,为什么UCOS-III不使用SVC来执行pendsv?

时间:2018-05-21 07:58:43

标签: cortex-m3 svc ucos

最近,我正在阅读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

  1. 任务A调用SVC进行任务切换(例如,等待一些工作完成)。
  2. 操作系统接收请求,准备上下文切换,并挂起PendSV异常。
  3. 当CPU退出SVC时,它立即进入PendSV并进行上下文切换。
  4. 当PendSV完成并返回Thread级别时,它会执行任务B.
  5. 发生中断并进入中断处理程序。
  6. 在运行中断处理程序例程时,会发生SYSTICK异常(用于OS勾号)。
  7. 操作系统执行基本操作,然后挂起PendSV异常并做好准备 用于上下文切换。
  8. 当SYSTICK异常退出时,它将返回中断服务程序。
  9. 当中断服务程序完成时,PendSV启动并执行实际上下文 开关操作。
  10. 当PendSV完成时,程序返回Thread级别; 这次它返回到任务A并继续处理。

2 个答案:

答案 0 :(得分:1)

除非您使用的是MPU扩展,否则在用户或特权模式下运行之间并没有太大的区别。是的,在用户模式下运行更安全,因为您无法修改所有寄存器,但您必须提供SVC调用才能提升权限并能够创建用户模式或特权模式的任务。我希望在你有MPU扩展时提供这个。

我不了解UCOS-III,但我认为所有任务都像大多数Cortex-M RTOS一样运行特权,除非它们支持MPU。

答案 1 :(得分:0)

例如,SafERTOS在Cortex-M3上使用MPU。