ARM架构基础内容

news2024/9/23 13:27:26

文章目录

  • 前言
  • 一、AAPCS
  • 二、中断调用过程
  • 三、FreeRTOS中任务切换的实质
  • 总结


前言

一、AAPCS

AAPCS,全称为ARM Architecture Procedure Call Standard,是ARM架构下的过程调用标准。这个标准定义了在ARM架构中函数调用和返回的约定,以确保不同编译器生成的代码之间的兼容性,以及不同模块之间的互操作性。以下是AAPCS的一些重要概念和约定:

寄存器用途: AAPCS定义了一组通用寄存器,用于传递参数和返回值。在常见的AAPCS规范中,前几个参数(通常是4个或更少)被放置在寄存器 r0-r3 中,其余的参数被放置在栈上。返回值通常存储在 r0 寄存器中,如果返回值为结构体或浮点数,则可能使用多个寄存器来传递。

编写下面这样的一个C函数,然后我们来查看一下他的汇编代码:

int add_val(int a, int b, int c, int d)
{
	return a+b+c+d;
}

int mymain()
{
	volatile int a = 1;
	volatile int b = 2;
	volatile int c = 3;
	volatile int d = 4;
	volatile int sum;
	
	sum = add_val(a, b, c, d);
	
	return 0;
}

汇编代码:

通过下面的汇编代码我们可以知道,最开始的时候会把a,b,c,d这四个数值都保存到栈中,然后通过LDRD汇编指令将这些值依次保存到R0~R3寄存器中。
在这里插入图片描述

通过下面的汇编代码可以知道,r0寄存器会报错a+b+c+d的值,故返回值是保存在r0寄存器当中的。
在这里插入图片描述

栈的使用: AAPCS规定了如何在函数调用期间使用栈。它定义了栈的增长方向(通常是向低地址方向增长),以及函数调用时如何保存和恢复寄存器的状态。这样可以确保在函数调用期间栈的使用是一致的,使得不同模块之间的函数调用能够正确地协同工作。

在这里插入图片描述

对齐规则: AAPCS规定了数据类型的对齐规则,以确保访问数据时的效率和正确性。例如,它规定了不同大小的数据类型应该如何对齐在内存中,以及如何处理结构体和数组的成员对齐。

异常处理: AAPCS也定义了异常处理的约定,包括如何传递异常和中断的参数,以及如何在异常发生时保存和恢复寄存器的状态。

AAPCS是ARM架构生态系统中的重要组成部分,它确保了不同编译器和开发工具生成的代码之间的兼容性,使得不同模块和库可以无缝地集成在一起,构建复杂的嵌入式系统和应用程序。

二、中断调用过程

保存现场:

当中断发生时,处理器会暂停当前执行的任务,并将程序状态和寄存器内容保存到内存中。这通常包括将程序计数器(PC)和程序状态寄存器(PSR)的值保存到栈中,以及可能的其他寄存器内容。

在ARM架构中,R0到R3寄存器通常用于保存参数和临时数据,它们的值通常在函数调用之间需要被保存和恢复。而R4到R11寄存器则被称为“callee-saved registers”(被调用者保存寄存器),在函数调用期间,被调用者负责保存和恢复这些寄存器的值,以确保在函数调用之间的数据不会被破坏。

在中断处理过程中,除了硬件自动保存的PC和PSR寄存器外,通常还需要手动保存其他寄存器的值,以确保被中断的任务可以在恢复现场时继续执行。

处理中断:

一旦中断发生,处理器将控制转移到相应的中断服务程序。这个服务程序可能是预先定义好的,也可能是动态指定的。
在中断服务程序中,处理器可能会执行一些特定的操作,如处理输入/输出设备、响应定时器事件等。这些操作通常与中断的类型和来源有关。

恢复现场:

当中断服务程序完成其任务时,需要将之前保存的现场恢复,以便被中断的任务能够继续执行。
恢复现场的过程涉及将之前保存在栈中的寄存器值重新加载到相应的寄存器中,包括PC和PSR寄存器。
除了硬件自动恢复的PC和PSR寄存器外,还需要手动从栈中取回其他寄存器的值,以确保任务可以从被中断的地方继续执行。

在ARM架构中,由于寄存器R0到R3通常用于参数传递和临时数据,在中断处理期间,这些寄存器的值需要被保存和恢复,以确保被中断的任务可以正确地继续执行。而寄存器R4到R11通常在函数调用之间由被调用者保存和恢复,因此在中断处理中它们的值通常不会被破坏。

三、FreeRTOS中任务切换的实质

在 FreeRTOS 中,任务切换是通过保存和恢复任务的执行环境来实现的,其中栈扮演了关键的角色。下面是任务切换的基本过程:

保存现场: 当 FreeRTOS 决定切换到另一个任务时,它会首先保存当前任务的执行环境,以便稍后能够正确地恢复。这个执行环境包括任务的寄存器状态、栈指针以及其他相关的上下文信息。

切换任务: 一旦当前任务的执行环境被保存,FreeRTOS 就会选择下一个要执行的任务,并将控制权转移到该任务上。这个过程通常涉及任务调度器,它会根据任务的优先级、时间片轮转等策略来选择下一个要执行的任务。

恢复现场: 在切换到新的任务之后,FreeRTOS 会从该任务的执行环境中恢复相关的上下文信息,包括寄存器状态和栈指针。这样,新的任务就可以继续执行,好像它从未被中断过一样。

在这个过程中,栈的作用非常重要。每个任务都有自己的栈空间,用于保存局部变量、函数调用信息以及其他与任务执行相关的数据。当任务切换时,FreeRTOS 会通过调整栈指针来切换到不同任务的栈空间,从而实现任务的切换和上下文的保存与恢复。

FreeRTOS 中的任务切换的实质就是通过保存和恢复任务的执行环境来实现的,其中栈扮演了关键的角色。这种机制保证了多个任务之间的并发执行,并且能够有效地管理任务的上下文切换。

总结

本篇文章主要介绍了ARM架构一些相关的知识和内容,大家可以再熟悉熟悉。

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

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

相关文章

文件底层的深入理解(1)

一、文件学习的简单铺垫 我们都知道,文件等于文件内容加上文件属性。访问文件之前都得先通过进程才能打开相应的文件,一个进程可以打开多个文件。修改文件,都是通过执行代码的方式完成修改。要对文件进行修改(或其他操作&#xff…

Java 数组(详细)

目录 一、数组的概述 1. 数组的理解: 2. 数组相关的概念: 3. 数组的特点: 4. 数组的分类: 5.数据结构: 二、一维数组 1. 一维数组的声明与初始化 2. 一维数组元素的引用: 3. 数组的属性&#xff1…

微信小程序,h5端自适应登陆方式

微信小程序端只显示登陆(获取opid),h5端显示通过账户密码登陆 例如: 通过下面的变量控制: const isWeixin ref(false); // #ifdef MP-WEIXIN isWeixin.value true; // #endif

力扣hot100题解(python版44-47题)

44、二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出:…

FHE 的应用场景

参考文献: [MSM22] Marcolla C, Sucasas V, Manzano M, et al. Survey on fully homomorphic encryption, theory, and applications[J]. Proceedings of the IEEE, 2022, 110(10): 1572-1609. 文章目录 FHEFirst GenerationSecond GenerationThird GenerationFour…

编码规则转换

思考: 如何将一个机内码转换为区内码? 只要将机内码减去 A0A0 就可以啦 如果只让我们用加法器来解决呢? 注意我们的数据占用了 32 位,如果想用补码进行减法运算的话,符号位怎么办??&#xf…

2199. 骑士共存问题(最小割,最大权独立集,二分图)

活动 - AcWing 在一个 n∗n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。 棋盘上某些方格设置了障碍,骑士不得进入。 对于给定的 n∗n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个…

2024年腾讯云优惠券_代金券_云服务器折扣券免费领取链接

腾讯云优惠代金券领取入口共三个渠道,腾讯云新用户和老用户均可领取8888元代金券,可用于云服务器等产品购买、续费和升级使用,阿腾云atengyun.com整理腾讯云优惠券(代金券)领取入口、代金券查询、优惠券兑换码使用方法…

UE5中实现后处理深度描边

后处理深度描边可以通过取得边缘深度变化大的区域进行描边,一方面可以用来做角色的等距内描边,避免了菲尼尔边缘光不整齐的问题,另一方面可以结合场景扫描等特效使用,达到更丰富的效果: 后来解决了开启TAA十字线和锯齿…

【go从入门到精通】go包,内置类型和初始化顺序

大家好,这是我给大家准备的新的一期专栏,专门讲golang,从入门到精通各种框架和中间件,工具类库,希望对go有兴趣的同学可以订阅此专栏。 go基础 。 Go文件名: 所有的go源码都是以 ".go" 结尾&…

latex宏包pythontex使用简明手册

文章目录 1.背景2. 基本示例2.1 hello world2.1.1 代码与输出结果2.1.2 说明2.1.3 如何编译使用了pythontex宏包的Latex文档2.1.4 如何既输出python代码又输出代码执行结果 2.2 在Latex中嵌入python变量的值2.2.1 示例代码与文档输出2.2.2 说明 2.3 在latex文档中输出控制台会话…

2.29号的复盘开始商城项目的规格如何设施的方式

第五次设计方式 我本来想的是,按照对于的组方式解拆分,通过分组处理的内存不同查询对应的手机上 出现问就是这里 对于的组相应规格相应里面有对于的价格,价格也就相同,无法进行区分 查询出来的对应的结果 还是没有办法具体拆分…

现货大宗商品发售平台搭建须知

在搭建现货大宗商品发售平台时,需要考虑以下关键因素: 目标市场分析:首先要明确你的平台将服务于哪些大宗商品市场,如农产品、金属、能源等。了解这些市场的特点、参与者、交易规则等,有助于你设计出更符合市场需求的…

解析/区分MOS管的三个引脚G、S、D(NMOS管和PMOS管)

MOS管的三个引脚分别是Gate(栅极)、Source(源极)和Drain(漏极)。以下是详细介绍: Gate(栅极)。这是控制MOS管开关的关键引脚,用于控制电流的流通。Source&…

pikachu验证XXE漏洞

先随便输入一个内容查看 接下来用bp抓包看下参数 有个xml参数&#xff0c;而且Content-Type: application/x-www-form-urlencoded&#xff0c;我们传入url编码后的xml内容试一下 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE foo [<!EN…

社区店选址人流量标准:如何确保充足的顾客流量

在选择社区店的位置时&#xff0c;确保充足的顾客流量是至关重要的。 作为一名开鲜奶吧5年的创业者&#xff0c;我将分享一些关于社区店选址人流量标准的关键要点&#xff0c;帮助你找到最适合的店铺位置。 1、研究人口统计学数据 了解潜在顾客的人口特征是选址的基础。通过研…

Unity3D学习之Lua热更新解决方案(二)XLua

文章目录 1 XLua概述2 xLua导入和AB包相关准备3 C#调用Lua3.1 Lua解析器3.2 文件加载重定向3.3 Lua解析器管理器3.3.1 重定向AB包内的Lua3.3.2 获得_G大表 3.4 全局变量的获取3.5 全局函数的获取3.5.1 无参无返回3.5.2 有参有返回3.5.3 多返回值3.5.4 变长参数 3.6 List和Dicti…

C 嵌入式系统设计模式 18:临界区模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之四…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业(2024)

对于OpenAI推出的Sora模型&#xff0c;我们可以进一步探讨其可能的技术细节、潜在应用以及对AI视频行业的影响。 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有云产品优惠权益&#xff1a; 经过笔者亲测&#xff0c;强烈推荐腾讯云轻量应用服务器作…

前端打包部署(黑马学习笔记)

我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 1.前端工程打包 2.通过nginx服务器发布前端工程 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的build按钮来完…