首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在皮质-m3平台上,为什么UCOS-III不使用SVC来执行摆振?

在皮质-m3平台上,为什么UCOS-III不使用SVC来执行摆振?
EN

Stack Overflow用户
提问于 2018-05-21 07:58:42
回答 2查看 506关注 0票数 0

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

背景:软件:UCOS-III

硬件:皮质M3(STM32F103)

代码:

代码语言:javascript
复制
.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的皮层-m3任务切换

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-22 08:49:10

除非您正在使用MPU扩展,否则在用户模式和特权模式下运行并没有太大的区别。是的,在用户模式下运行会安全一些,因为您不能修改所有寄存器,但是您必须提供SVC调用才能提高特权并能够创建属于用户模式或特权模式的任务。我希望这是在您有MPU扩展时提供的。

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

票数 2
EN

Stack Overflow用户

发布于 2019-02-07 13:19:37

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50444352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档