微型操作系统内核源码详解系列五(2):cm3下栈的初始化

 系列一:微型操作系统内核源码详解系列一:rtos内核源码概论篇(以freertos为例)-CSDN博客

系列二:微型操作系统内核源码详解系列二:数据结构和对象篇(以freertos为例)-CSDN博客

系列三:微型操作系统内核源码详解系列三(0):空间存储及内存管理篇(前置篇)-CSDN博客

                微型操作系统内核源码详解系列三(1):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(2):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(3):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(4):arm架构篇-CSDN博客

                微型操作系统内核源码详解系列三(5):进程与线程-CSDN博客

系列四:

 ​​​​​微型操作系统内核源码详解系列四(1):操作系统调度算法(linux0.11版本内核)-CSDN博客

微型操作系统内核源码详解系列四(2):操作系统调度算法(rt-thread内核)-CSDN博客

微型操作系统内核源码详解系列四(3):操作系统调度算法(FreeRTOS内核篇上)-CSDN博客

微型操作系统内核源码详解系列四(4):操作系统调度算法(FreeRTOS内核篇下)-CSDN博客

系列五:

微型操作系统内核源码详解系列五(1):arm cortex m3架构-CSDN博客

微型操作系统内核源码详解系列五(2):cm3下栈的初始化-CSDN博客

        这一篇让笔者介绍arm cortex m3架构下任务栈的初始化,以入栈为例,如图是arm cm3下任务栈各个地址的内容:

让我们看看pxPortInitialiseStack函数是如何完成任务栈初始化的:

首先pxTopOfStack--,因为一开始它是指向栈顶的,自减后它指向栈内下一个地址,这个位置将会被保存到xPSR寄存器中,xPSR的24位被置1,表示这是Thumb指令状态,实际上cm3架构只支持Thumb指令状态。

xPSR这些寄存器请参考这篇博客,笔者认为讲得非常好:

[001] [ARM-Cortex-M3/4] 内部寄存器_xpsr寄存器-CSDN博客

现在来到下一个地址,

这一段代码是为了字节对齐:

pxCode是任务函数的地址,在arm架构中,分为arm指令集状态和Thumb指令集状态,你可以使用这两种指令集,区别是,Thumb指令集寄存器最低位是0,cm3下都是Thumb指令集,所以,为了预防未定义问题,必须把任务的地址最低位进行清0。

毫无疑问,这是为了保存LR寄存器,它是用于存储任务调用返回地址的专用寄存器,当一个函数被调用时,返回地址会被保存到 LR 寄存器中,以便在函数执行完毕后能够正确返回到调用该函数的下一条指令。但是,rtos中通常任务是不会返回的,所以这里的prvTaskEixtError其实是一个无限循环函数,用来调试:

这个错误返回函数代码如下:

r12,r3,r2,r1这四个寄存器通常是被用作传递作用,所以直接跳过:

R0用来保存任务形参,在之前的博客笔者貌似介绍过pvParameters,它会贯穿整个任务周期,可以被用来调试或传递作用: 

在前文读者讲过LR寄存器,不过前一个保存到LR寄存器里的内容是一个用于调试的函数,为了发挥LR寄存器真正的作用,我们肯定要保存一个用于自身任务的返回值,所以这个中间的寄存器,保存了一个特殊的寄存器,被用作返回:

往下的八个寄存器,通常也是被用作参数传递等作用,无特殊含义,默认初始化为0,因此跳过即可:

最后返回栈顶指针,在栈顶指针下面就是空闲栈了(如果读者自己定义的栈空间有剩余的话),这些空闲栈浪费了资源,读者可以通过调试一步步缩小任务栈的大小,合理使用内存资源。

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

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

相关文章

windows反弹shell的方法

什么是正向shell和反向shell 首先说,正向shell是控制端主动连接被控制端,通过目标主机开放一个监听端口等待其他主机访问,从而获得对目标主机的shell访问,优点是控制端可以整个控制目标主机,但缺点会受到防火墙的连&a…

手机usb共享网络电脑没反应的方法

适用于win10电脑,安卓手机上可以 开启usb网络共享选择,如果选择后一直跳,让重复选择usb选项的话,就开启 开发者模式,进到 开发者模式 里设置 默认usb 共享网络 选项 ,就不会一直跳让你选。 1.先用数据线 连…

如何通过Appium连接真机调试

1、打开appium,点击启动appium服务器(如图1) 2、appium启动成功后,点击放大镜启动检查会话(如图2) 3、填写真机设备信息和APP的package、activity,点击启动会话(如图3) 4、打开运行A…

数据结构-十大排序算法集合(四万字精讲集合)

前言 1,数据结构排序篇章是一个大的工程,这里是一个总结篇章,配备动图和过程详解,从难到易逐步解析。 2,这里我们详细分析几个具备教学意义和实际使用意义的排序: 冒泡排序,选择排序&#xff0c…

Swift Combine — Subject Publishers(PassthroughSubject CurrentValueSubject)

本文主要介绍一下Subject&#xff0c;Subject 本身也是一个 Publisher&#xff0c;其定义如下&#xff1a; public protocol Subject<Output, Failure> : AnyObject, Publisher {func send(_ value: Self.Output)func send(completion: Subscribers.Completion<Self.…

【漏洞复现】泛微OA E-Cology ln.FileDownload 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

JAVA开发 选择本地的文件,控制台输出选择的文件名

打开文件选择器对话框&#xff0c;控制台输出选择的文件 1、展示效果2、实现代码3、JFileChooser类 1、展示效果 2、实现代码 import javax.swing.*; import java.io.*; import java.text.SimpleDateFormat; import java.util.Date;public class GenerateCompress {public sta…

强大的api管理系统Storm Core API_V1.1免授权源码

强大的api管理系统Storm Core API_V1.1免授权源码&#xff0c;带用户key和ip白名单功能 可设置付费操作等 更新日志 此次更新功能比较多 1.完善个人中心页面 2.完善注册登录页面 3.完善key功能 4.增加ip白名单功能 5.以及一些其他小小的美化 6.模板dxx的图片可单个自定…

AWS——01篇(AWS入门 以及 AWS之EC2实例及简单实用)AWS

AWS——01篇&#xff08;AWS入门 以及 AWS之EC2实例及简单实用&#xff09; 1. 前言 2. 创建AWS账户 3. EC2 3.1 启动 EC2 新实例 3.1.1 入口 3.1.2 设置名称 选择服务 3.1.3 创建密钥对 3.1.4 网络设置——安全组 3.1.4.1 初始设置 3.1.4.2 添加安全组规则&#xff08;开放新…

【Linux】MySQL下载与安装

1. 下载压缩包 官网下载 2. 解压 上传并解压好放在指定位置 创建soft文件夹 mkdir /soft上传文件&#xff0c;在该目录下再创建一个mysql文件夹&#xff0c;将安装包解压到新文件夹中 mkdir /soft/mysql-8.3.0 tar -xvf mysql-8.3.0-1.el9.x86_64.rpm-bundle.tar -C mysq…

C语言 | Leetcode C语言题解之第162题寻找峰值

题目&#xff1a; 题解&#xff1a; int findPeakElement(int* nums, int numsSize) {int ls_max0;for(int i1;i<numsSize;i){if(nums[ls_max]>nums[i]);else{ls_maxi;}}return ls_max; }

2024上海初中生古诗文大会倒计时4个月:单选题真题和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是来自于历届真题&#xff0c;去重、合并后&#xff0c;每道题都有参考答案和解析。 为帮助孩子自测和练习&…

演示:WPF开发的Diagram自动化流程图应用

一、目的&#xff1a;演示Diaram应用功能 二、预览 三、功能列表 功能模块 通用测试 流程图 仪器仪表 机器人 网络通信测试 PLC测试 轮毂生产线流程测试 图像处理 目标检测 绘图 思维导图 图表 流程图功能 模板管理 工程管理 模块许可管理 工具栏 开始 停止 删除 清除 …

RabbitMQ实践——对不可路由的消息的处理方法

大纲 无备用&#xff08;Alternate&#xff09;交换器构建交换器、队列和绑定关系测试代码抛弃不可路由消息返还不可路由消息 有备用&#xff08;Alternate&#xff09;交换器创建带备用&#xff08;Alternate&#xff09;交换器的交换器mandatory非mandatory 总结 在实际工作中…

【DevOps】Elasticsearch 数据跨集群同步方案

目录 1、Elasticsearch Cross-Cluster Replication (CCR) 1.1、优点 1.2、缺点 1.3、步骤 1.4、示例 2. Logstash 或其他 ETL 工具 2.1、优点 2.2、缺点 2.3、步骤 3. Apache Kafka 或 RabbitMQ 3.1、优点 3.2、缺点 3.3、步骤 4、使用 Reindex API 进行跨集群同…

【LeetCode最详尽解答】42-接雨水 Trapping-Rain-Water

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 链接: 42-接雨水 直觉 通过可视化图形来解决这个问题会更容易理解和解决。 给定输入: height [0,1,…

mediasoup源码分析--channel创建及信令交互

mediasoup源码分析--channel创建及信令交互 概述跨职能图业务流程图代码剖析 概述 在golang实现mediasoup的tcp服务及channel通道一文中&#xff0c;已经介绍过信令服务中tcp和channel的创建&#xff0c;本文主要讲解c中mediasoup的channel创建&#xff0c;以及信令服务和medi…

基于CentOS的全新Linux机器安装Jenkins并生成Allure报告

目录 一、安装Docker 二、安装Docker Compose 三、准备测试用例 四、配置docker-compose.yml 五、启动Jenkins 六、配置Jenkins和Allure插件 七、创建含pytest的Jenkins任务 一、安装Docker 在CentOS上&#xff0c;首先更新包管理工具并安装所需的包。 sudo yum update…

12.3 Go 测试覆盖率

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

基于Elementui组件,在vue中实现多种省市区前端静态JSON数据展示并支持与后端交互功能,提供后端名称label和id

基于Elementui组件&#xff0c;在vue中实现多种省市区前端静态数据&#xff08;本地JSON数据&#xff09;展示并支持与后端交互功能&#xff0c;提供后端名称label和id 话不多说&#xff0c;先上图 1.支持传递给后端选中省市区的id和名称&#xff0c;示例非常完整&#xff0c…