FreeRTOS任务切换——PendSV

前言:

本文分析一下FreeRTOS任务切换相关内容。RTOS系统的核心是进行任务管理,任务切换。本文分SVC和PendSV异常、任务切换场景、pendSV中断函数、FreeRTOS时间片调度4部分讲解FreeRTOS任务切换。

一、SVC和PendSV

看下面内容之前,首先要明确的一点是FreeRTOS的任务切换是通过PendSV异常进行上下文切换。

1.1 异常与中断

ARM Cortex-M3 M4系列在内核基础上搭建了一个异常响应系统,支持系统异常和外部中断,编号1-15为系统异常,编号大于等于16则为外部中断。异常是CPU内部的中断,处理系统内部的指令异常事件或者其他指令执行等,外部中断则是外围硬件产生的中断,cpu响应外部中断事件。

1.2 SVC和PendSV

SVC和PendSV是由ARM硬件核提供的异常,SVC是系统服务调用,PendSV是可挂起的系统调用,它们多用于操作系统软件开发中。

1.2.1 SVC

SVC用于产生调用系统函数的请求,例如操作系统不允许用户应用程序直接访问操作硬件设备,而是通过一些系统服务函数操作硬件设备,当用户程序想要访问某个硬件时,首先触发一个SVC异常,发出对系统服务函数的调用请求,然后操作系统提供的SVC异常服务函数得到执行,该函数再调用操作硬件的系统函数,最终间接访问硬件设备,如下图所示:
SVC作为操作系统门户函数
SVC异常是必须立即得到响应的,如果因为优先级不比当前正在执行的异常高,或者其他原因导致不能立即执行,则将上访成为硬件fault。

1.2.1 PendSV

PendSV是可以挂起的异常,它和SVC协同使用,顾名思义,PendSV和SVC不同,PendSV可以像普通中断一样被挂起而延迟执行,OS可以利用该特点,等待其他重要任务处理完成后才执行该异常。挂起PendSV的方法是:往NVIC的PendSV挂起寄存器写1。

1.2 为什么在PendSV异常中进行任务切换

嵌入式实时操作系统要求能够实时快速响应处理中断请求,如果在处理中断的时候,发生一个任务切换请求,则会触发fault异常,这是不被允许的。为避免此问题,任务切换需要放在可以挂起的异常中去处理,即PendSV,并且将PendSV异常的优先级设为最低,让其处理在所有中断处理完毕后再执行,这有利于任务切换,也是嵌入式实时OS的设计关键,当系统正在处理中断时,此时请求任务切换,系统挂起PendSV异常,未完成的中断处理继续进行,中断处理完毕,退出中断后,PendSV服务程序开始运行,进行任务切换,这样既不耽误中断的处理也不影响任务切换。下图是PendSV控制任务切换,假设只有两个任务A、B,横轴为时间线,纵轴为优先级:

  • 14
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值