FreeRTOS任务切换

目录

一、PendSV异常

二、任务切换场合

1、执行系统调用

2、滴答定时器(SysTick)中断

三、PendSV中断服务函数

1、分析xPortPendSVHandler中断服务函数

四、查找下一个要运行的任务的两种方法

1、获取下一个要运行的任务

2、查找下一个要运行的任务的两种方法

2.1、通用方法:所有处理器都可以使用的方法

2.2、硬件方法:需要硬件支持的方法


一、PendSV异常

        PendSV(可挂起的系统调用)其优先级可以通过编程设置。可以通过将中断控制和壮态寄存器 ICSR 的 bit28,也就是 PendSV 的挂起位置 1 来触发 PendSV 中断。

        与SVC异常不同,它是不精确的,因此它的挂起壮态可在更高优先级异常处理内设置,且会在高优先级处理完成后执行。利用该特性,若将PendSV设置为最低的异常优先级,可以让PendSV异常处理在所有其他中断处理完成后执行,这对于上下文切换非常有用,也是各种OS设计中的关键。

        在具有嵌入式OS的典型系统中,处理时间被划分为了多个时间片。若系统中只有两个任务,这两个任务会交替执行,如下图所示:

二、任务切换场合

1、执行系统调用

        执行系统调用就是执行FreeRTOS系统提供的相关API函数,比如任务切换函数taskYIELD(), FreeRTOS有些API函数也会调用函数taskYIELD(),这些API函数都会导致任务切换,这些API函数和任务切换函数taskYIELD()都统称为系统调用。函数taskYIELD()其 实就是个宏,在文件task.h中有如下定义:

在文件portmacro.h中有如下定义:

        通过向中断控制和壮态寄存器 ICSR 的 bit28 写入 1 挂起 PendSV 来启动 PendSV 中断;这样就可以在PendSV中断服务函数中进行任务切换了。

2、滴答定时器(SysTick)中断

FreeRTOS中滴答定时器(SysTick)中断服务函数中也会进行任务切换,滴答定时器中断服务函数如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值