Lazy loaded image
🪜实时操作系统
原理篇02-再说Cortex-M处理器对OS支持特性
Words 817Read Time 3 min
2024-11-7
2024-11-7
type
date
slug
category
icon
password
  • 影子栈指针:有两个栈指针可用,MSP用于OS内核以及中断处理,PSP则用于应用 任务。
  • SysTick定时器:位于处理器内部的简单定时器,使得同一个嵌入式OS可用在多种 Cortex-M微控制器上。SysTick的细节内容在9.5节中已经介绍过了。
  • SVC和PendSV异常:这两种异常对于嵌入式OS中的操作非常重要,如上下文切换 的实现等。
  • 非特权执行等级:可以利用其实现一种基本安全模型,限制某些应用任务的访问权 限。特权和非特权等级的分离还可同存储器保护单元(MPU)一起使用,进一步提高 嵌入式系统的健壮性。
  • 排他访问:排他加载和存储指令用于OS中的信号量和互斥体(MUTEX)操作。
  • 低中断等待带来了较小的上下文切换开销。
  • 指令跟踪宏单元(ITM)的调试特性可在多种调试工具中用于OS调试。

《权威指南》的“第 10 章OS支持特性”

影子指针

影子指针指什么
存在两种指针,MSP 和 PSP
notion image
影子指针优点
  1. OS 内核和其他任务栈不会遭到破坏
  1. 可以使用MPU防止应用任务栈溢出
OS处于处理模式才能使用进程栈
编程PSP,利用异常返回流程“跳转”到应用任务
  1. 当OS从线程模式启动时,可以利用SVC异常进入处理模式
  1. 创建进程栈中的栈帧,且触发使用PSP的异常返回
  1. 当加载栈帧时,应用任务就会启动。
notion image
OS设计中,怎么完成不同任务间切换
通常在PendSV异常处理中执行,该异常可由SysTick异常触发。
在上下文切换操作中需要:
  • 将寄存器的当前状态保存到当前栈中
 
  • 保存当前 PSP 数值
  • 将 PSP 设置为下一个任务的上一次 SP 数值
  • 恢复下一个任务的上一次的数值
  • 利用异常返回切换任务
notion image

SVC 异常

SVC 处理分为两部分
  • 第一部分提取栈帧的起始地址,并将其作为输人参数传递给第二部分。该处理要用汇编实现,这是因为需要检查LR的数值(EXC_RETURN),而其无法用C实现。
  • 第二部分从栈帧中提取压栈的PC数值,然后从程序代码中得到SVC编号。它还可以选择提取出压栈的寄存器数值等其他信息。
 
SVC_Handler
notion image
SVC_Handler_C
  1. 为什么传入栈帧地址
  1. 为什么需要返回值
notion image

PendSV 异常

上下文切换的触发条件
  • 应用任务中SVC指令的执行。例如,当应用任务由于等待一些数据或事件被耽搁时,它可以调用系统服务以便切换到下一个任务。
  • 周期性的SysTick异常。
怎么避免中断延迟,PenSV用于上下文切换
 
notion image
上一篇
原理篇01-从Cortex-M处理器架构谈起
下一篇
ROS 官网教程01-基础概念和操作

Comments
Loading...