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寄存器在使用中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

龙格-库塔法

概要 微分方程:含参数、未知函数、未知函数的导数(或者微分)的方程数值求解:用若干离散点计算 近似值 来代替准确值分类:单步法、多步法;隐式法、显示法欧拉法 (欧拉折线法),也是一阶龙格-库塔…

【数据结构】图解二叉搜索树的新增、搜索、删除

一、概念 二叉搜索树(Binary Search Tree,简称BST)也称为二叉查找树或二叉排序树,是一种具有特殊性质的二叉树数据结构。 定义和性质: 二叉搜索树中的每个节点包含一个键值,习惯上我们说左子树上所有节点…

乔琼:高性能会议传声器的产品优化设计| 演讲嘉宾公布

一、智能家居与会议系统 智能家居与会议系统分论坛将于3月28日同期举办! 智能会议系统它通过先进的技术手段,提高了会议效率,降低了沟通成本,提升了参会者的会议体验。对于现代企业、政府机构和学术界是不可或缺的。在这里&#x…

部署运维 防火墙,进程 常用命令

防火墙: 1. 查看是否安装了firewalld sudo systemctl status firewalld 查看防火墙状态或者sudo systemctl is-active firewalld 查看防火墙是否是开启状态 2. 开放6379port sudo firewall-cmd --add-port6379/tcp --permanent 刷新防火墙 sudo firewall-cmd --reload 3…

MinIO Client(mc)基本使用

一、Linux安装 1、下载最近的mc 命令,并保存到当前用户的bin目录下,这样可以直接执行,不用修改path curl -sL https://dl.minio.org.cn/client/mc/release/linux-amd64/mc -o /usr/bin/mc chmod x /usr/bin/mc二、配置使用 1、查看mc已经…

【洛谷 P8748】[蓝桥杯 2021 省 B] 时间显示 题解(数学+模运算+输入输出)

[蓝桥杯 2021 省 B] 时间显示 题目描述 小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。 现在,小蓝要在客户端显示…

MATLAB KL变换

1. 原理 KL变换步骤: 1.求样本X的协方差矩阵R 2.求 R的特征值λ。选取前d个较大的特征值。 3.计算d个特征值对应的特征向量,归一化后构成变换矩阵U。 4.对{X}中每一个X进行K-L变换,得到变换后向量YU’ * X,d维向量Y就是…

阿里云Linux系统MySQL8忘记密码修改密码

相关版本 操作系统:Alibaba Cloud Linux 3.2104 LTS 64位MySQL:mysql Ver 8.0.34 for Linux on x86_64 (Source distribution) MySQL版本可通过下方命令查询 mysql --version一、修改my.cnf文件 文件位置:etc/my.cnf进入远程连接后可以打…

解决vue项目本地开发完成后部署到服务器后报404的问题

一、如何部署 前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vue项目在构建后,是生成一系列的静态文件 常规布署我们只需要将这个目录上传至目标服务器即可 /…

163邮箱SMTP设置需要怎么配置?如何开启?

163邮箱SMTP设置教程?163邮箱开通SMTP发信功能方法? 当我们需要使用第三方工具或软件来发送邮件时,SMTP设置就显得尤为重要。特别是对于使用163邮箱的用户来说,掌握163邮箱SMTP设置的方法是非常必要的。下面,AokSend就…

javaweb学习(day06-servlet)

一、基本介绍 1 官方文档 地址: https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.htmlServlet 和 Tomcat 的关系: 一句话, Tomcat 支持 Servlet【假如单独使用Servlet就失去了意义】 2 为什么会出现 Servlet 提出需求: 请用你现有的html css javascript&#…

JavaSE(上)-Day3

JavaSE(上)-Day3 IDEA(目前业内最好用的开发软件)初始使用IEDA的基础设置 本篇主要介绍内容如下: IDEA的基本使用IDEA的基础设置 IDEA(目前业内最好用的开发软件) IDEA是用于Java语言开发的集…

springboot之mybaitsPlus

mybaitsPlus是国内开发的,并不是springboot的项目,只是学习的时候直接就是适配的springboot。 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不…

微服务获取登录用户Id与单体服务下获取用户Id对比(黑马头条Day03)

前置声明 当前前后端分离开发项目中,后端某个请求向具体某个数据库中的多个表插入数据时,经常需要使用到当前登录用户的Id(唯一标识)。在当前用户线程下以实现变量共享,同时为了避免不同用户线程之间操作变量的影响&am…

设计模式之模版方法实践

模版方法实践案例 实践之前还是先了解一下模版方法的定义 定义 模板方法模式是一种行为设计模式,它定义了一个骨架,并允许子类在不改变结构的情况下重写的特定步骤。模板方法模式通过在父类中定义一个模板方法,其中包含了主要步骤&#xf…

【Python】成功解决TypeError: ‘float‘ object is not iterable

【Python】成功解决TypeError: ‘float’ object is not iterable 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得…

Mysql按照月份分组统计数据,当月无数据则填充0

目录 起因实现结论 起因 最近有个需求需要在sql中实现获取近半年的统计数据,本来以为挺简单的,不过这个项目数据基本没有,在此情况下还要实现获取近半年的数据就没办法简单group by了 实现 #如果每个月都有数据的话是比较简单的 SELECT DA…

【XR806开发板试用】串口驱动JQ8900播放音乐

一、硬件连接 1.JQ8900引脚定义 通过阅读JQ8900的数据手册,可以了解到驱动JQ8900有许多种方式,IO驱动,一线串口驱动(VPP),两线串口驱动(RX,TX),这里我使用两…

C#多线程(4)——任务并行库TPL

文章目录 1 什么是TPL2 创建与启动任务3 等待任务4 任务中的异常处理5 取消任务 1 什么是TPL T P L \textcolor{red}{TPL} TPL(Task Parallel Library)任务并行库,是从.NetFramwork4.0后引入的基于异步操作的一组API。TPL的底层是基于多线程实…

C语言第三十六弹---文件操作(中)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…