任务和内存的栈

任务是什么?

任务是可以运行着的函数,本身并不是函数,因为任务是可以创建、删除、切换等操作的。

void add_val(int *pa, int *pb)
{volatile int tmp;tmp = *pa;*pa = tmp + *pb;
}void TaskFunction(void *param)
{int a = 1;int b = 2;add_val(&a, &b);
}

看一个函数中执行A+B 的全过程:
在这里插入图片描述
运行过程:
① CPU从内存把变量a的值读入CPU的R0寄存器;

② CPU从内存把变量b的值读入CPU的R1寄存器;

③ CPU计算a和b这两个变量的值的和,然后放入CPU的R0寄存器;

④ CPU将R0寄存器的值写到内存上变量a的位置;

在这个过程中,CPU是怎么知道要做① ② ③ ④这几件事情的?那肯定是程序员编写的程序来控制的。程序员将编写好的程序保存到Flash中,CPU从Flash中的取出指令,根据指令忠诚的执行它。

指令是什么?

load  ; 加载
store ; 存储
add   ; 相加

指令的三要素:源;目的;长度。
长度:变量的长度,比如int a;这个变量的长度是4bytes(32bits的处理器);

在这里插入图片描述

如果上诉程序在执行的过程之中被打断,那么就需要保存现场与恢复现场。
保存的是什么?是CPU将打断前的程序运行到的地址(下一条志汇编指令的地址)、寄存器的值保存到栈中,当执行完打断后,又从栈中读取出来恢复现场继续执行。

另外,如果有外界又打断了运行的函数,那么栈的内容需要保存吗?
解答:不需要,栈的内容无法按保存,只需要栈的位置。下一次回来的时候,CPU继续找到的之前保存的寄存器和局部变量。
在这里插入图片描述
主要LR保存的函数执行完的下一个指令的地址。
为了反之寄存器地址的覆盖,在调用函数的内部已经尽心了寄存器返回地址的保存,以防覆盖。

函数调用与内存中栈的实现

在这里插入图片描述
一个函数执行完,会去栈中取出LR的值,去执行返回地址处的程序。
在这里插入图片描述

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

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

相关文章

day27 回溯(03)

day27 代码随想录 2023.12.25 1. 39组合总和 这道题还是组合问题,一样的代码套路,不过就是递归参数不同,数组元素可以重复,所以是i而不是i1;其次就是终止条件,当temp的sum大于target则终止,当等…

gitlab请求合并分支

直接去看原文: 原文链接:Gitlab合并请求相关流程_source branch target branch-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 入口: 仓库控制台的这两个地方都…

Android集成OpenSSL实现加解密-编译

下载 OpenSSL 源码: 前往 OpenSSL 官方网站(https://www.openssl.org/source/)下载最新的源码压缩包并解压,示例在WSL环境编译 下载NDK 前往https://developer.android.google.cn/ndk/downloads?hlzh-cn下载NDK版本并解压 配置…

26、商城系统(八):nexus配置,拆分springcloud为多个springboot,并且实现多个springboot通过feign调用接口

目录 一、如果你是技术部经理 二、nexus:maven仓库的创建以及上传拉取jar包 1.docker安装nexus

OCP NVME SSD规范解读-3.NVMe管理命令-part1

4.4 NVMe Admin Command Set章节详细介绍了设备应支持的NVMe管理命令集,包括必需的和可选的命令。以下是一些关键要求和描述: NVMe-AD-2:识别命令除了支持所有必需的CNS值和相关的必需字段外,还应支持以下可选字段: 格…

电子设计从零开始(2)-----走进电子技术之电阻器

同学们大家好,今天我们继续学习杨欣的《电子设计从零开始》,这本书从基本原理出发,知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例,可以说是全面系统地介绍了电子设计所需的知识…

JavaScript----循环语句

1. 循环语句的介绍 循环语句就是让一部分代码重复执行&#xff0c;javascript中常用的循环语句有: forwhiledo-while 2. for循环 var array [1, 4, 5];for(var index 0; index < array.length; index){result array[index];alert(result); }3. while循环 var array …

软件测试/测试开发丨接口测试学习笔记分享

一、Mock 测试 1、Mock 测试的场景 前后端数据交互第三方系统数据交互硬件设备解耦 2、Mock 测试的价值与意义 不依赖第三方数据节省工作量节省联调 3、Mock 核心要素 匹配规则&#xff1a;mock的接口&#xff0c;改哪些接口&#xff0c;接口哪里的数据模拟响应 4、mock实…

OpenAI 2024年展望:Sam Altman愿望清单的深度解析

引言 Sam Altman 2023年11月22日 重回OpenAI 任CEO。 Sam Altman 2023年12月24日 发布新年需求统计。 OpenAI是一个美国人工智能研究实验室&#xff0c;由非营利组织OpenAI Inc&#xff0c;和其营利组织子公司OpenAI LP所组成。OpenAI 进行 AI 研究的目的是促进和发展友好的人…

听GPT 讲Rust源代码--src/tools(30)

File: rust/src/tools/clippy/clippy_lints/src/casts/cast_slice_from_raw_parts.rs 在Rust源代码中&#xff0c;cast_slice_from_raw_parts.rs文件位于rust/src/tools/clippy/clippy_lints/src/casts/目录下&#xff0c;它是Clippy工具中的一个lint&#xff0c;用于检查通过f…

centos7安装nginx并安装部署前端

目录&#xff1a; 一、安装nginx第一种方式&#xff08;外网&#xff09;第二种方式&#xff08;内网&#xff09; 二、配置前端项目三、Nginx相关命令 好久不用再次使用生疏&#xff0c;这次记录一下 一、安装nginx 第一种方式&#xff08;外网&#xff09; 1、下载nginx ng…

《深入理解Java虚拟机(第三版)》读书笔记:Java内存区域与内存溢出异常、垃圾收集器与内存分配策略

下文是阅读《深入理解Java虚拟机&#xff08;第3版&#xff09;》这本书的读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 第2章 Java内存区域与内存溢出异常2.2 运行时数据区域2.3 HotSpot虚拟机对象探秘 第3章 垃圾收集器与内存分配策略3.2 对象已死&…

1.2.3 TCP/IP参考模型

一、OSI参考模型与TCP/IP参考模型 1、应用层&#xff1a;将表示层和会话层都纳入其中&#xff0c;形成一个比较大的层次&#xff0c;包含所有的高层协议 2、传输层&#xff1a;实现端到端的&#xff0c;进程与进程之间的通信。 3、网际层&#xff1a;TCP/IOP模型中最关键的部…

【Unity动画系统】Unity动画系统Animation详解,参数细节你是否弄清?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

STM32 学习(一)新建工程

本课程使用的stm32型号 引脚定义&#xff0c;有FT能接5v&#xff0c;没有FT能接3.3v 启动配置 第二种启动模式中&#xff0c;系统存储器中存放了一部分Bootloader程序&#xff0c;该程序可以接收串口的数据&#xff0c;然后刷新到主闪存中&#xff0c;这样就可以使用串口下载程…

Unity简单的敌人巡逻方法(NavMeshAgent)

简单的敌人巡逻方法 基于NavMeshAgent的敌人巡逻方法。 private NavMeshAgent eagent;//定义一个寻路private Animator animator;//声明一个动画public Vector3 [] point;//巡逻范围和位置数量private int index;//数组位置private float timer 0 ;void Start(){animator Ge…

c语言-位操作符练习题

文章目录 前言一、n&(n-1)的运用场景(n为整数)二、&1 和 >>的应用场景总结 前言 本篇文章介绍利用c语言的位操作符解决一些练习题&#xff0c;目的是掌握各个位操作符的使用和应用场景。 表1.1为c语言中的位操作符 操作符含义&按位与|按位或^按位异或~按位…

k8s的二进制部署和网络类型

k8s的二进制部署 master01&#xff1a;192.168.233.10 kube-apiserver kube-controller-manager kube-scheduler etcd master02&#xff1a;192.168.233.20 kube-apiserver kube-controller-manager kube-scheduler node01&#xff1a;192.168.233.30 kubelet kube-proxy etc…

在idea中使用git(Gitee)

目录 前言 一、常用远程仓库托管服务 二、gitee使用 1 创建远程仓库 2 配置SSH公钥 ​编辑 ​编辑 3 把本地代码推送到远端 4 其他操作远程仓库 1&#xff09;克隆 2&#xff09;抓取和拉取 3&#xff09;解决合并冲突 三、在idea中使用git 四、场景分析 总结 前言 昨天详细学…

【惠友小课堂】“拇外翻”:大脚趾凸出也是病!得治!

大脚趾凸出的痛谁懂&#xff1f; 有一种尴尬叫不敢脱鞋&#xff0c; 鞋一脱&#xff0c;外翻的脚趾就“原形毕露”…… 这都是“拇外翻”惹的祸。 拇外翻&#xff0c;俗称大脚骨&#xff0c;多发于女性&#xff0c;是大脚趾向外明显倾斜&#xff0c;超过正常生理范围的一种足…