在Cortex-M3的平台,为什么UCOS-III不能使用SVC执行PENDSV?

问题描述 投票:0回答:2

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

  1. 任务A调用SVC任务切换(例如,等待一些工作来完成)。
  2. 所述OS接收请求,准备的上下文切换,并且暂时搁置PendSV异常。
  3. 当CPU退出SVC,它立即进入PendSV的并执行上下文切换。
  4. 当PendSV的结束并返回到线程级别,它执行任务B.
  5. 发生中断和进入中断处理程序。
  6. 当运行在中断服务程序,一个SYSTICK异常(OS打勾)发生。
  7. 操作系统进行必要的操作,则暂时搁置PendSV异常并准备了上下文切换。
  8. 当SYSTICK异常退出,返回到中断服务程序。
  9. 当中断服务程序完成后,PendSV的启动和执行实际的上下文切换操作。
  10. 当PendSV的完成,程序返回到线程级;这一次它返回到任务A继续进行处理。
cortex-m3 svc ucos
2个回答
1
投票

除非您使用的是MPU扩展真的不会使用户或特权模式下运行之间相差太大。是的,它是在用户模式下比较安全的运行,你不能修改所有寄存器,但你必须提供一个SVC呼叫能够提高特权,必须创建一个是用户模式或特权模式任务的能力。我希望当你有MPU的扩展,这是提供。

我不知道UCOS-III,但我会假设所有的任务都运行特权像大多数的Cortex-M RTOS,除非他们支持MPU。


0
投票

例如SAFERTOS使用上Cortex-M3的MPU。

© www.soinside.com 2019 - 2024. All rights reserved.