F5 物联网操作系统多任务调度原理

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)  评论(0)    收藏  举报