FreeRtos 任务切换深入分析

一、背景知识:

1、任务切换包含三个基本流程:保护现场、更新TCB、恢复现场并跳转

2、freertos的任务切换是在xPortPendSVHandler 中断函数中完成的

3、中断函数在调用之前,硬件已经保存了r0,r1,r2,r3,r12,r14(LR),r15(pc),恢复现场的时候由硬件自动恢复r0,r1,r2,r3,r12,r14(LR),r15(pc),即r0~r3在中断服务函数中是可以随便使用的,剩下的r4~r11需要在中断函数中手动保存。

4、ARM中的栈有两个,msp和psp,主程序和中断中用msp,线程中是psp

5、ARM一般是满减栈

二、xPortPendSVHandler源代码:

void xPortPendSVHandler( void )
{/* This is a naked function. */__asm volatile("	mrs r0, psp							\n""	isb									\n""										\n""	ldr	r3, pxCurrentTCBConst			\n" /* Get the location of the current TCB. */"	ldr	r2, [r3]						\n""										\n""	tst r14, #0x10						\n" /* Is the task using the FPU context?  If so, push high vfp registers. */"	it eq								\n""	vstmdbeq r0!, {s16-s31}				\n""										\n""	stmdb r0!, {r4-r11, r14}			\n" /* Save the core registers. */"	str r0, [r2]						\n" /* Save the new top of stack into the first member of the TCB. */"										\n""	stmdb sp!, {r0, r3}					\n""	mov r0, %0 							\n""	cpsid i								\n" /* Errata workaround. */"	msr basepri, r0						\n""	dsb									\n""	isb									\n""	cpsie i								\n" /* Errata workaround. */"	bl vTaskSwitchContext				\n""	mov r0, #0							\n""	msr basepri, r0						\n""	ldmia sp!, {r0, r3}					\n""										\n""	ldr r1, [r3]						\n" /* The first item in pxCurrentTCB is the task top of stack. */"	ldr r0, [r1]						\n""										\n""	ldmia r0!, {r4-r11, r14}			\n" /* Pop the core registers. */"										\n""	tst r14, #0x10						\n" /* Is the task using the FPU context?  If so, pop the high vfp registers too. */"	it eq								\n""	vldmiaeq r0!, {s16-s31}				\n""										\n""	msr psp, r0							\n""	isb									\n""										\n"
#ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */
#if WORKAROUND_PMU_CM001 == 1"			push { r14 }				\n""			pop { pc }					\n"
#endif
#endif"										\n""	bx r14								\n""										\n""	.align 4							\n""pxCurrentTCBConst: .word pxCurrentTCB	\n"::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY));
}

三、xPortPendSVHandler分析:

1、先在xPortPendSVHandler中把pxCurrentTCB打印出来:

2、 

将psp给r0 

3、 

这两行,将r3保存了pxCurrentTCB,r2指向了上一个task的栈顶位置:pxTopOfStack

4、

 这是对FPU寄存器的判断,可以先不看

5、

将r4-r11,r14保存到任务栈psp中。并将栈顶位置写入到r2中,即 pxTopOfStack这个变量

6、

此时的sp为msp,即将r3、r0保存到msp中。

至此,现场保护已经完成。

7、


跳转到vTaskSwitchContext这个C函数中执行,这个函数中就将下一个要执行的任务的TCP更新到pxCurrentTCB中,主要代码如下:

这里要时刻注意,不要迷糊,更新pxCurrentTCB的同时,r3也会指向这个新的pxCurrentTCB。

8、

将r3和r0从msp中恢复出来,注意:此时的r3中的pxCurrentTCB已经是更新之后的了。

9、

 这两句,将新的pxCurrentTCB中的pxTopOfStack给了r0,即r0中记录了新task的栈顶位置

10、

从新task中恢复现场即恢复r4~r11,r14 

11、

恢复FPU相关寄存器

12、

 将栈顶的位置给psp

至此,恢复现场已经全部完成

13、

 

r14即LR中记录了中断返回的地址,跳转执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/190581.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C_11微机原理

一、单项选择题(本大题共 15 小题,每小题 3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。) .EXE 文件产生在()之后。 A.汇编 B. 编辑 C.用软件转换 D.连接 2,十进制-61的8位二进…

实力进阶,教你使用thinkphp6开发一款商城系统

0.开篇 你好!很高兴你能点开这个教程,相信你对这个教程有了那么一点点兴趣,接下来占用你一点点时间,邀你浏览一下本章内容,希望能够让你更加有兴趣去学完这个教程。 作者我是一名九零后程序员,搬砖了好几…

Unity3D 解决相机拉高之后物体阴影消失

在Edit-Project Settings-Quality中找到Shadow Distance,将其调大即可

Azure Machine Learning - Azure AI 搜索中的矢量搜索

矢量搜索是一种信息检索方法,它使用内容的数字表示形式来执行搜索方案。 由于内容是数字而不是纯文本,因此搜索引擎会匹配与查询最相似的矢量,而不需要匹配确切的字词。本文简要介绍了 Azure AI 搜索中的矢量支持。 其中还解释了与其他 Azure…

从0开始学习JavaScript--JavaScript 表达式与运算符

JavaScript中的表达式和运算符是构建逻辑、进行计算的基础。本文将深入研究JavaScript中各类表达式,包括算术表达式、关系表达式、逻辑表达式,以及运算符的使用方法,并通过丰富的示例代码来帮助读者更全面地了解和运用这些概念。 算术表达式…

component 动态组件的用法

一&#xff1a;前言 <component></component> 标签是Vue框架自定义的标签&#xff0c;它的用途就是可以动态绑定我们的组件&#xff0c;根据数据的不同需求来更换使用不同的组件。 在最上方的图片中&#xff0c;就是使用的 Element Plus 的 Tags 组件&#xff0c;根…

基于黑猩猩算法优化概率神经网络PNN的分类预测 - 附代码

基于黑猩猩算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于黑猩猩算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于黑猩猩优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

vb.net U盘或移动硬盘 插入 自动(静默)复制指定格式文件

U盘或移动硬盘 插入 自动复制指定格式文件至系统盘符 开发语言&#xff1a;vb.net 重要申明&#xff1a;该程序只是防止本人不在电脑旁时&#xff0c;别人偷偷copy你的电脑文件&#xff0c;让他偷鸡成了也要蚀把米。严禁从事黑客或违反道德等不良行为&#xff0c;故而不发布程…

【选题推荐】软件工程毕设选题可以选什么

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准&#xff1a; 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…

基于JAYA算法优化概率神经网络PNN的分类预测 - 附代码

基于JAYA算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于JAYA算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于JAYA优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

毅速丨金属3D打印将为模具制造企业带来变革

金属3D打印技术的发展给模具制造带来了巨大的创新价值&#xff0c;包括重塑产品、重组制造、重构业务。 首先&#xff0c;3D打印技术可以大幅度缩短模具制造的生产周期&#xff0c;提高生产效率。传统的模具制造需要经过多个工序和加工过程&#xff0c;而3D打印技术通过打印完成…

突发!“ChatGPT 之父”奥特曼被 OpenAI 开除!!乔布斯故事重演了?

重磅消息&#xff01; OpenAI刚刚官宣领导层换届&#xff0c;SamAltman辞任CEO并离开董事会&#xff0c;原CTO Mira Murati 任命为临时CEO&#xff0c;并正在进行寻找永久继任CE0。 大模型研究测试传送门 GPT-4传送门&#xff08;免墙&#xff0c;可直接测试&#xff0c;遇浏…