在cortex-m3平台上,UCOS-III为啥不使用SVC来执行pendsv?
Posted
技术标签:
【中文标题】在cortex-m3平台上,UCOS-III为啥不使用SVC来执行pendsv?【英文标题】:On the cortex-m3 platform, why does UCOS-III not use SVC to perform pendsv?在cortex-m3平台上,UCOS-III为什么不使用SVC来执行pendsv? 【发布时间】:2018-05-21 07:58:42 【问题描述】:最近在看UCOS-III的源码,有一个关于UCOS-III在Cortex-M3平台上运行时的任务切换问题。它使用 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
-
任务 A 调用 SVC 进行任务切换(例如,等待某些工作完成)。
操作系统收到请求,准备上下文切换,并挂起 PendSV 异常。
当 CPU 退出 SVC 时,它会立即进入 PendSV 并进行上下文切换。
当 PendSV 完成并返回线程级别时,它会执行任务 B。
发生中断并进入中断处理程序。
在运行中断处理程序例程时,会发生 SYSTICK 异常(针对 OS 滴答)。
操作系统执行基本操作,然后挂起 PendSV 异常并准备就绪
用于上下文切换。
当 SYSTICK 异常退出时,它返回到中断服务程序。
当中断服务程序完成时,PendSV 启动并执行实际上下文
切换操作。
当 PendSV 完成后,程序返回线程级;
这次它返回到任务 A 并继续处理。
【问题讨论】:
你问的时候作者说了什么? 我在 micrium 论坛上提出了这个问题,正在等待回复。 【参考方案1】:除非您使用的是 MPU 扩展,否则在用户模式或特权模式下运行并没有太大区别。是的,在用户模式下运行会更安全一些,因为您无法修改所有寄存器,但是您必须提供 SVC 调用才能提高权限并能够创建用户模式或特权模式的任务。我希望当您拥有 MPU 扩展时会提供此功能。
我不了解 UCOS-III,但我会假设所有任务都像大多数 Cortex-M RTOS 一样以特权运行,除非它们支持 MPU。
【讨论】:
通过查看用户手册发现STM32F103支持MPU特性。您能否提供一些在具有 MPU 和 SVC 的 Cortex-M3 平台上运行的 RTOS 示例?谢谢。 如果您下载 FreeRTOS,其中有一些示例,但不确定它们是否是最新的。虽然 MPU 非常有用并提供更好的保护,但除非您了解它的工作原理,否则它会让您的生活更加艰难。我建议阅读 ARM 文档(Cortex-M4 通用用户指南是一个好的开始)。【参考方案2】:例如,SafERTOS 在 Cortex-M3 上使用 MPU。
【讨论】:
这不是问题的答案。以上是关于在cortex-m3平台上,UCOS-III为啥不使用SVC来执行pendsv?的主要内容,如果未能解决你的问题,请参考以下文章
为啥编译器标志“-mcpu=cortex-m3”与 stm32f10x 出错?