自己学驱动17——ARM工作模式和ARM9寄存器

2023-11-18

1.ARM体系CPU的7种工作模式
    (1)用户模式(usr):ARM处理器正常的程序执行状态。
    (2)快速中断模式(fiq):用于高速数据传输或通道处理。
    (3)中断模式(irq):用于通用的中断处理。
    (4)管理模式(svc):操作系统使用的保护模式。
    (5)数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
    (6)系统模式(sys):运行具有特权的操作系统任务。
    (7)未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
    可以通过软件进行模式的切换,或者发生各类中断、异常时CPU自动进入相应的模式。除用户模式以外的6种工作模式都属于特权模式,大多数程序运行于用户模式,进入特权模式是为了处理中断、异常,或者访问被保护的系统资源。

2.ARM920T的寄存器
    ARM920T有31个通用的32位寄存器和6个程序状态寄存器,这37个寄存器分为7组,进入某个工作模式时就使用它的那组寄存器。有些寄存器,不同的工作模式下有自己的副本,当切换到另一个工作模式时,那个工作模式的寄存器副本将被使用:这些寄存器被称为备份寄存器。从下图中可以看出fiq模式的备份寄存器最多,这是为了提高fiq的响应速度,减少保存寄存器值所花费的时间。
    CPSR在七种模式下都是同一个寄存器,所以可以修改里面的值来转换到不同的工作模式下。R0~R15可以直接访问,除R15外均为通用寄存器,既可以用于保存数据也可以用于保存地址。R13~R15稍有特殊:R13又被称为栈指针寄存器sp,通常用于保存栈指针;R14又被称为程序连接寄存器,当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份,而当发生中断或异常时,对应的R14_svc、R14_irq、R14_fiq、R14_abt或R14_und保存R15的返回值;R15又被称为程序计数器PC。

3.CPSR寄存器
    CPSR中主要包括以下几种状态位:
    (1)T位:置位时,CPU处于Thumb状态;否则处于ARM状态。
    (2)中断禁止位:I位和F位属于中断禁止位。它们被置位时,IRQ中断、FIQ中断分别被禁止。
    (3)工作模式位:表明CPU当前处于什么工作模式,可以更改这些位,使CPU进入指定的工作模式。

4.SPSR寄存器
    SPSR寄存器,即程序状态保存寄存器,就是在除系统和用户模式外的5种模式下来保存CPSR寄存器的备份寄存器。当一个异常发生时,将切换进入相应的工作模式,这时ARM920T的CPU将自动完成如下事情。
    (1)在异常工作模式的连接寄存器R14中保存前一个工作模式的下一条,即将执行的指令的地址。对于ARM状态,这个值是当前的PC值加4或者加8。
    (2)将CPSR的值复制到异常模式的SPSR。
    (3)将CPSR的工作模式位设为这个异常对应的工作模式。
    (4)将PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常向量表中的相应指令。
    相反地,从异常工作模式退出回到之前的工作模式时,需要通过软件完成如下事情。
    (1)前面进入异常工作模式时,连接寄存器中保存了前一个工作模式的一个指令地址,将它减去一个适当的值后赋给PC寄存器。
    (2)将SPSR的值复制回CPSR。
    从表中可以看出,进入和退出异常时PC的计算方法会根据不同的模式进行不同的计算,主要分为3类(在表格中的(1)(2)(3)表示该模式属于的分类):
    (1)PC值是这些指令的地址:SWI、未定义的指令、在预取时就失败的指令。本条指令已经被执行,下一条指令的地址就是PC+4。
    (2)PC值是这些指令的地址:进入快速中断、中断模式前,被打断而未执行的指令。本条指令就已经被打断,所以下一条指令就是PC当前指向的指令。
    (3)PC值是这些指令的地址:导致数据访问终止的加载/存储指令(LDR、STR、LDM和STM)。这几个特殊指令,流水线技术会导致后面几条的指令都是这个指令的副本,所以该条指令相当于并未执行成功,下一条指令也就是PC当前指向的指令。
    注:流水线技术导致PC的值是当前被执行指令的地址+8,然而已经被取指令的指令会继续执行,中断等打断的也只是取指令,前面已经在流水线中的指令会继续执行完毕。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自己学驱动17——ARM工作模式和ARM9寄存器 的相关文章

  • 如何创建静态链接共享库

    在我的硕士论文中 我尝试为 ARM Cortex M3 嵌入式系统采用共享库方法 由于我们的目标板没有 MMU 我认为使用 普通 动态共享库是没有意义的 因为 text 是直接从闪存执行的 而 data 在启动时被复制到 RAM 所以我无法
  • 在 ARMv7 的上下文中,当 mmu 必须进行页表转换时,Linux 内核一对一映射内存的优势是什么

    Linux内核虚拟地址是一对一映射 所以通过减去一个PAGE OFFSET到虚拟地址我们将得到物理地址 就是那样virt to phys http lxr free electrons com source arch arm include
  • Android是否阉割了ARM的Jazelle技术?

    我认为 Android 中的 Java 字节码 混蛋 的理由是性能 我怀疑还有另一个原因 但是 通过更改字节码 他们难道没有让 Jazelle 等硬件加速技术变得毫无意义 从而实际上降低了 Mobile Java 平台的可用性能吗 目标平台
  • arm gcc工具链为arm-elf或arm-none-eabi,有什么区别?

    当您构建 gcc 工具链时 可以将其构建为arm elf 或arm none eabi 但是有什么区别呢 我今天使用 eabi 但这只是因为其他人似乎都这样做 但由于这是一个非常糟糕的论点 因此理解其中的差异真的很高兴 注意 此工具链将为基
  • 将 ZeroMQ 交叉编译为 ARM,以便在 MonoTouch iPhone 应用程序配置设置中使用

    我正在尝试在使用 MonoTouch 用 C 开发的 iPhone 应用程序中使用 ZeroMQ 库 我几乎解决了所有的问题 却在最后一道坎倒下了 我正在使用 ZeroMQ 2 1 10 和 C CLR 绑定 包装器 并在 Mac OS X
  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • 使用 ARM NEON 内在函数添加 alpha 和排列

    我正在开发一个 iOS 应用程序 需要相当快地将图像从 RGB gt BGRA 转换 如果可能的话 我想使用 NEON 内在函数 有没有比简单分配组件更快的方法 void neonPermuteRGBtoBGRA unsigned char
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T

随机推荐

  • 英语学习对程序员得重要性!

    程序世界的主导语言是英文 编写程序时使用的开发文档和开发工具的帮助文件离不开英文 了解业界的最新动向 阅读技术文章离不开英文 同世界各地编程高手往往也离不开英文 提高英文水平 能大大促进一个程序员的发展 让你有更多的资源 在此 个人总结了几
  • css文本内容呈现两行呈现,超出部分用省略号代替

    标题仅显示两行 溢出内容省略号代替 overflow hidden text overflow ellipsis display webkit box webkit line clamp 2 webkit box orient vertic
  • CPU时钟周期、主频、CPI、MIPS

    主频 理解 主频是机器内部主时钟的频率 主频越高 完成指令的一个执行步骤所用的时间就越短 速度越快 比如跳绳 跳的越快 即频率越高 那么完成一次所用的时间就越短 单位 Hz 常见的有1 8GHz 2 4GHz CPU时钟周期 理解 跟上面的
  • 【华为OD机试真题 python】 字符统计及重排【2022 Q4

    前言 华为OD笔试真题 python 专栏含华为OD机试真题 华为面试题 牛客网华为专栏真题 如果您正在准备华为的面试 或者华为od的机会 有任何想了解的可以私信我进行交流 我会尽可能的给一些建议 和帮您解答 题目描述 字符统计及重排 给出
  • html网页如何将文字排版,【html】文字排版

    Web开发过程中文字排版 默认的情况下 行末的长单词会撑开容器 我们想要的是 像word一样 能够自动换行 既不撑大容器 也不强制拆开行末单词 并且不会隐藏行末单词的多余字母 不能撑开容器 完整的单词不能被强制拆开 如果行末是长单词的话 整
  • IDEA类文件后边有注释插件:Show Comment

    具体功能是在侧边文件树中 显示Java类的注释信息 IDEA文件树增强插件 Show Comment 使用方法 1 类上面加入javadoc注释 回车就可以了 2 在插件市场里面搜索Show Comment 3 重新idea即可 代码填写和
  • 电信客户流失预测----科大讯飞xDataWhale

    记录第一次参加正式的数据挖掘竞赛 由科大讯飞xDatawhale举办的 电信客户流失预测挑战赛 报名链接 2022 iFLYTEK A I 开发者大赛 讯飞开放平台 一 赛题概要 赛题背景 随着市场饱和度的上升 电信运营商的竞争也越来越激烈
  • Day 12: Twin Transformer by 美团

    这是美团和澳大利亚阿德莱德大学联合发表的新文章 也是和 Transformer 相关的 以下是一些要点 Swin Transformer 的 Shifted Windows 虽然有效 但是由于尺寸不同 因此在用现有的深度学习模型来实现的时候
  • CentOS常用zip压缩和解压缩命令

    1 压缩文件夹为zip文件 root cgls zip r mydata zip mydata 2 把mydata zip解压到mydatabak目录里面 root cgls unzip mydata zip d mydatabak 3 m
  • 电脑开机后,显示屏无信号怎么处理?

    转自 微点阅读 https www weidianyuedu com 随着使用电脑的用户越来越多 而使用的用户遇到的问题就越多了 而经常用电脑的同学大部分都遇到过电脑显示器无信号的情况吧 其实相比显示器没有任何显示而言 电脑显示器无信号的故
  • SQLServer如何统计每两小时的值

    把当前时间的 时分转为数字 select CONVERT FLOAT replace CONVERT VARCHAR 6 GETDATE 108 思路 select sum 数字 年月日 小时 2取整 from 表 group by 年月日
  • kafka学习笔记(一)简介

    这是对我找到的学习资料的整理 非手打 参考 https kafka apachecn org intro html https blog csdn net weixin 39468305 article details 106346280
  • Cannot forward after response has been committed问题解决及分析

    通过TOMCAT把系统启动 可以正常登陆门户 登陆进去选择子系统的时候点击登陆的时候 可是去又回到了登陆界面 如此反复就是不能够进入子系统 查看后台报的错误 Cannot forward after response has been co
  • 数据库密码忘记了怎么办

    修改数据库密码 方法1 用SET PASSWORD命令 首先登录MySQL 格式 mysql gt set password for 用户名 localhost password 新密码 例子 mysql gt set password f
  • 应急响应-账户排查

    用户信息排查 在服务器被入侵之后 攻击者可能会建立相关账户 方便进行远程控制 主要采用一下几种 直接建立一个新用户 有时候为了混淆视听 账户名称和系统常用名相似 激活一个系统中的默认用户 但是这个用户不经常使用 建立一个隐藏用 在windo
  • java-通过ip获取地址

    添加maven依赖
  • 关于ArcMap中打开ArcToolbox导致闪退的解决办法

    最近好久不用ArcGis的小编要用到ArcMap去发送一个GP服务 发现按照套路打开ArcMap点击ArcToolbox时 发生了ArcMap的闪退现象 几经周折终于解决了问题 希望也遇到这类问题的同学能够参考解决 而不是无脑的去重装软件
  • C# 实现ESC退出窗口的几种方法

    实现ESC退出窗口的几种方法 引言 方法一 同步按钮法 方法二 监听按键法 方法三 隐藏按钮法 最后 引言 我们通常用通过点击取消按键或者右上角的 X 盒子退出的方法来实现关闭当前Form窗体 但要使用按键ESC退出关闭窗口就显得更加高级了
  • 解决SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]的方案!!!!!

    目录 前提 一 安装maven helper插件 1 安装 2 安装成功 3 使用 二 去掉冲突的依赖包 1 前面已找到目标依赖 去pom文件内操作 2 去除 3 最后就可以了 前提 今天单元测试遇到了jar包冲突 SLF4J Class
  • 自己学驱动17——ARM工作模式和ARM9寄存器

    1 ARM体系CPU的7种工作模式 1 用户模式 usr ARM处理器正常的程序执行状态 2 快速中断模式 fiq 用于高速数据传输或通道处理 3 中断模式 irq 用于通用的中断处理 4 管理模式 svc 操作系统使用的保护模式 5 数据