1911_野火FreeRTOS教程阅读笔记_请求任务切换
全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 (gitee.com)
还有一部分任务切换请求的代码没有分析。
实现上是一个宏定义,实现的工作主要的核心点还是请求PendSV的exception。当这个调用的时候,下面的接口会被执行。
先不看代码,先考虑一个OS进行任务切换的时候会做什么?肯定是先把当前的任务的相关状态存一下,做一下现场保护。之后呢,寻找更高优先级的任务,让更高优先级的任务执行。而任务执行的过程判断,之前已经看过了,这个与在SVC的Handler中的执行的类似。因此,在当前的PendSV阶段,我们需要做好任务优先级判断的处理,确认接下来需要执行哪一个任务。
再看之前的SVC的Handler的设计。究竟执行哪一个任务,决定的因素其实是pxCurrentTCB指向的内容。因此,我们的PendSV的Handler中需要完成这个信息的更新。完成之后,自然得把前面做过的工作反着来一遍,也就是现场回复。
等这部分工作完成,接下来的处理工作其实就是切换到新的任务执行了。
这样,我们对这部分代码拆分再读一下。这里先根据PSP做了现成的堆栈信息的更新,也就是保护现场。接着,r3、r14两个寄存器压栈。为什么会直接用sp而不是跟上面一起继续压栈呢?
这里顺便复习之前看过的信息,因为Handler 模式下,一直使用MSP。因此,这里其实是MSP。所以,这里的处理前后两部分是不同的。
在这部分,完成任务切换并且恢复现场保护。而这里的中断处理涉及到FreeRTOS的中断模型,其实也类似于AUTOSAR OS中的一类中断和二类中断。
这部分的处理,与SVC的处理其实是类似的。
再看一下这俩exception的用法。超级调用(SVC)是由SVC指令触发的异常。在操作系统环境中,应用程序可以使用SVC指令访问操作系统内核函数和设备驱动程序。PendSV是系统级服务的中断驱动请求。在操作系统环境中,当没有其他异常活动时,使用PendSV进行上下文切换。
从这部分文档的描述看,其实这个PendSV的作用是非常固定的。
至于这部分的处理,其实是没啥可以看的。这里只是一个任务交换而已。
关于野火的FreeRTOS教程,我觉得基本看到这里就可以是一个分界点了。其他的都是关于逻辑的方法的,其实直接拿成熟的代码直接看或许更好一些。