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



最近,我正在阅读UCOS-III的源代码,我对UCOS-III在Cortex-M3平台上运行时的任务切换有疑问。它使用 PendSV 通过直接写入寄存器SCB_ICSR(中断控制和状态寄存器(进行任务切换,但访问寄存器SCB_ICSR需要权限操作级别。这意味着处理器在权限操作级别的进程模式下运行,没有异常和中断,我认为这是不安全的。为什么UCOS-III不使用SVC来执行pendsv?是效率问题吗?有人可以为我解释一下吗?谢谢。

背景: 软件: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 的 Cortex-M3 任务切换

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新