关于SVC和PendSV

  1. 这两个都属于异常而不是中断,所谓异常就是ARM内核中断
  2. 这两个中断都是由用户代码主动触发的,即软件触发,没有其它触发源
  3. SVC:系统服务调用,进入该异常可以进入特权模式,即在需要进行各种系统操作的时候主动触发该中断进入该中断内部操作;
  4. PendSV:可延时中断,此中断的特点就是可以延迟执行,它可以等待其它中断都执行完毕之后再执行
  5. 由于SVC和PendSV的这两个特性,一般操作系统都会用到它,正常SVC用于启动系统的第一个任务(空闲任务)然后后续就都在PendSV里面进行任务切换了;但是也有RTOS是不用SVC的,如uCos和RT-Thread
  6. 正是由于PendSV会等待其它所有中断执行完再执行的特性,使其成为了RTOS用于任务切换的首选;为了保证实时性,每个中断都应当被立即响应,所以任务切换就不应当阻碍中断响应,所以用PendSV是最理想的。
  7. RTOS中断处理/任务切换流程:
    1.任务A运行完毕,主动请求任务切换
    2.此时中断产生,进入IRQ处理程序
    3.systick中断发生,由于systick中断优先级高于该IRQ,所以IRQ被打断进入systick中断处理程序
    4.systick处理函数判定有任务需要切换,于是挂起(触发)PendSV中断
    5.systick退出后由于之前的IRQ中断未处理完所以先进入IRQ执行
    6.IRQ处理完毕,进入PendSV进行任务切换
    7.任务切换完成,任务B开始执行

你可能感兴趣的:(嵌入式系统,Free_RTOS,程序人生,c语言,单片机)