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

影子指针优点
- OS 内核和其他任务栈不会遭到破坏
- 可以使用MPU防止应用任务栈溢出
OS处于处理模式才能使用进程栈
编程PSP,利用异常返回流程“跳转”到应用任务
- 当OS从线程模式启动时,可以利用SVC异常进入处理模式
- 创建进程栈中的栈帧,且触发使用PSP的异常返回
- 当加载栈帧时,应用任务就会启动。

OS设计中,怎么完成不同任务间切换
通常在PendSV异常处理中执行,该异常可由SysTick异常触发。
在上下文切换操作中需要:
- 将寄存器的当前状态保存到当前栈中
- 保存当前 PSP 数值
- 将 PSP 设置为下一个任务的上一次 SP 数值
- 恢复下一个任务的上一次的数值
- 利用异常返回切换任务

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

SVC_Handler_C
- 为什么传入栈帧地址
- 为什么需要返回值

PendSV 异常
上下文切换的触发条件
- 应用任务中SVC指令的执行。例如,当应用任务由于等待一些数据或事件被耽搁时,它可以调用系统服务以便切换到下一个任务。
- 周期性的SysTick异常。
怎么避免中断延迟,PenSV用于上下文切换

- Author:felixfixit
- URL:http://www.felixmicrospace.top/article/cortex_m_os_support
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!