1910_野火FreeRTOS教程阅读笔记_prvStartFirstTask函数

1910_野火FreeRTOS教程阅读笔记_prvStartFirstTask函数

全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记

这是教程中的一个函数,通过汇编来实现的。注释部分以及结合后面的讲解部分,可能还是有一点点细节的地方让初学者疑惑。我结合我自己的理解,再度补充一些信息。

SCB_VTOR地址是如何得出来的?

首先,可以从手册中找到基地址0xE000ED00。

再从细分章节中找到,偏移量是0x08,两个信息组合就可以得出上面对应的地址。

至于这个地址为什么可以读取到MSP的数值,需要结合下面的信息理解。

这里描述的事向量表的内容,向量表的0地址偏移处刚好是SP的初始值。现在还在内核状态,还没有进入到task运行的线程模式。因此,这里读取出来的数值是MSP的信息。

野火的教程中说有点多于,我觉得可能这个原自于这一段描述。读取的数值是来自于地址

0x00000000的。

直接通过代码打印可以看得出来这个推测是准确的。

而上面的这个接口在执行的时候会触发SVC。

超级调用(SVC)是由SVC指令触发的异常。在操作系统环境中,应用程序可以使用SVC指令访问操作系统内核函数和设备驱动程序。

之后会触发这个SVC Handler,这个接口是在启动代码文件中定义的,这里通过了宏定义进行了转换。

因此,实际的效果是SVC_Handler。如果不增加这个宏定义,直接定义SVC_Handler也是一样的。

这是汇编代码中的信息。

再回去看上面vPortSVCHandler代码中的信息,代码到124行,其实是获取了当前任务TCB中的栈顶信息。继续往下的8个寄存器,实现了局部变量的加载。

之前查看文档的时候看到过这个24bit一直是1,其实这个代表的事Thumb状态位。

M3的处理器只能够再Thumb状态下执行指令,但是如下操作可以清除掉这个指令:

  • 指令BLX, BX和POP{PC}
  • 从异常上的堆叠xPSR值恢复
  • 异常项上的向量值的位[0]或复位

以上,是为什么要进入到这个状态的原因,但是这个描述应该是适用于线程等分支调用。至于为什么要写入0xD,其实有其他的原因,因为这里的这段代码是一个异常的Handler。

之所以出现最后两个指令操作,主要原因还是因为这里需要完成一次异常的返回。EXC_RETURN是在异常entry上加载到LR中的值。异常机制依赖此值来检测处理器何时完成异常处理程序。该值的最低四位提供有关返回堆栈和处理器模式的信息。表17显示了EXC_RETURN[3:0]值以及异常返回行为的描述。

这是上面提到的表17。因此,这里实现的功能是返回到线程模式、从PSP获取状态、返回之后利用PSP执行。这样,SP就从MSP切换到了PSP。而BX指令是上面提到的三种返回exception的方式之一。

而返回之后,由于之前的SVC等已经设置了PSP的信息,因此接下来的软件会按照PSP中的设定去执行。任务调度也就会启动。为什么能够启动,结合之前梳理的任务创建的分析是可以理解的。因为任务创建的时候,把执行入口绑定到了TCB的栈中,在这次的退出时会返回执行。

这里的这个示意图还是比较有参考意义的,至于上面为什么没有R13,这是因为R13座位了SP寄存器在使用中。

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

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

相关文章

SAP金江、阎韶华、雷凡将出席“第四届ISIG-RPA、低代码、流程挖掘三大峰会

3月16日,第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导,企智未来科技(RPA中国、AIGC开放社区、LowCode低码时代)主办。大会旨在聚合每一位产业成员的力量,深入探索R…

vue router 解决路由带参数跳转时出现404问题

我的页面是从一个vue页面router跳转到另一个vue页面,并且利用windows.open() 浏览器重新创建一个页签。但是不知道为什么有时候可以有时候又不行,经过反复测试与分析,最终发现是因为有一个参数的值里包含了小数点., 小数点是浏览器合法字符,不能通过encode编码转义,于是乎…

【JavaEE初阶】 关于JVM垃圾回收

文章目录 🍃前言🎋死亡对象的判断算法🚩引用计数算法🚩可达性分析算法 🌳垃圾回收算法🚩标记-清除算法🚩复制算法🚩标记-整理算法🚩分代算法🎈哪些对象会进入…

【Neo4j系列】Neo4j之CQL语句和函数介绍

本文将对Neo4j中的CQL语句和CQL函数进行详细介绍。 作者:后端小肥肠 目录 1. 前言 2. CQL语句 2.1. CQL简介 2.2. CREATE命令 2.3. MATCH命令 2.4. RETURN命令 2.5. MATCH和RETURN 2.6. CREATEMATCHRETURN命令 2.7. 关系基础 2.8. CREATE创建标签 2.9. WH…

C/C++的内存管理与初阶模板

引言 我们在学习C的时候,会经常在堆上申请空间,所以这个时候就体现了内存管理遍历。 图下是我们常见的计算机的内存划分: 我也在图下对部分变量存在的位置,及时标注。(如果有任何问题可以联系博主修改,感谢大家。) 那…

VSCode搭建ARM开发环境

为了构建Cortex M系列单片机免费开源的开发环境,网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式,下面记录环境搭建的流程。 我这边的PC环境为 WIN7专业版64bit。 需要用到的工具 Visual Studio CodeSTM32CubemxARM GCC 交叉编译工具链&#x…

容器安全是什么?

容器安全定义 容器安全是指保护容器的完整性。这包括从其保管的应用到其所依赖的基础架构等全部内容。容器安全需要完整且持续。通常而言,企业拥有持续的容器安全涵盖两方面: 保护容器流水线和应用保护容器部署环境和基础架构 如何将安全内置于容器流…

C/C++游戏逆向

初级 %p、size_t、%zd、%llu、sizeof %p用于输出地址,HWND类型的也可以使用%p输出size_t:C语言源代码:typedef unsigned __int64 size_t;sizeof 返回值是 size_t类型,打印的时候不能使用%d,应该使用%zu 修改窗口标题…

API可视化编排,提高API可复用率

在数字化时代,API(应用程序编程接口)已成为不同软件应用之间沟通的桥梁。然而,如何高效管理、编排和复用这些API,成为了企业和开发者面临的重要挑战。随着技术的不断进步,RestCloud API可视化编排应运而生&…

【YOLO v5 v7 v8 v9小目标改进】AFPN 渐进式特征金字塔网络:解决多尺度特征融合中,信息在传递过程丢失

AFPN 渐进式特征金字塔网络:解决多尺度特征融合中,信息在传递过程丢失 提出背景AFPN 多尺度特征金字塔 非邻近层次的直接特征融合 自适应空间融合操作 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 提出背景 论文:https:…

吴恩达deeplearning.ai:数据增强数据合成迁移学习

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 让我们看看为你的程序添加数据的技巧。在构建神经网络的时候,我们总是想要更多的数据,但是获取更多的数据往往是十分昂贵又缓慢的。相反地,添加数据的另一…

现在做抖店还能行吗?给2024年想入局抖店的新手,一些建议

我是王路飞。 说起来抖店好像也不算是个新项目了,毕竟抖音小店正式上线时间是在2019年,到现在也有5年多时间了。 我这边是从20年开始入局抖店的,比较庆幸的是赶上了当初的流量风口,且一直坚持到了现在。 由刚开始的单人单店&am…