1.多任务调度基础
1.1Cortex-M0中Systick重要性
- 系统滴答定时器就是为操作系统诞生的,是调度器的核心
1.2Cortex-M0中断管理
- 当异常或者中断发生的时候,处理器会把PC设置为一个特定的地址(存在于flash里面),这一个地址被称为异常向量,每一类异常源都对应一个特定的入口地址,这些地址按照优先级排列以后就组成了一张异常向量表
1.3Cortex-M0影子(进程栈)栈指针
- 在以往裸机编程里面,当产生外部中断的时候,CPU会保存当前状态去执行中断服务子程序,执行完毕之后会返回到原来任务继续执行.但在操作系统里面,存在多个任务,当中断执行完毕之后究竟该继续执行哪个任务呢?故诞生影子栈指针
- 操作系统除了依赖Systick之外,还要高度依赖R13即堆栈指针寄存器SP,Cortex-M0在不同物理位置上存在2个栈指针,主栈指针MSP,进程栈指针PSP.在处理模式下,只能使用主堆栈,在线程模式下,可以使用主堆栈也可使用进程堆栈,主要由CONTROL寄存器配置,系统上电默认是MSP
- 在线程模式下面一旦产生一个systick那么就会变成处理模式,在还没进入处理模式之前将当前任务栈内容给进程栈PSP,之后进入处理模式,当重处理模式恢复到线程模式的时候,通过配置CONTROL寄存器配置使用进程堆栈PSP
- 不使用OS时: 如图1,只用到MSP(中断和非中断都使用MSP)
- 使用OS时:如图2,main函数和中断使用MSP;各个Task(线程)使用PSP(即任务栈)
![]()
![]()
1.4Cortex-M0SVC和pendSV异常
- 在操作系统启动之后运行任务A当产生Systick的时候会产生PendSV异常,之后切换到任务B
- 为啥要PendSV异常呢?如果只有Systick的话,操作系统将只会是基于时间片的调度,如果在某任务执行期间有一个紧急任务发生,那么紧急任务将无法立即执行,进而没有实时性
- 引入PendSV异常,即提供一种处理方式,Systick与其他任务均可触发该异常,进而可以完成任务切换
1.5Cortex-M0工作模式
- 线程模式(Thread Mode):芯片复位之后,进入线程模式,执行用户程序
- 处理模式(Handler Mode):当处理器发生异常或者中断,则进入处理模式进行处理,处理完毕之后返回线程模式
- Thumb状态:正常运行时处理器状态
- 调试状态:调试程序时处理器的状态
posted @
2021-08-05 23:20
MHDSG
阅读(
285)
评论()
收藏
举报