Armv7-M Interworking机制

1 前言

        由于历史原因(从ARM7TDMI开始), ARM处理器一直支持两种形式上相对独立的指令集, 它们分别是:

         32位的ARM指令集,对应处理器状态:

        ARM状态,在32位存储器上效率较高,能够同时访问32位的数据和地址空间,具有更好的代码效率和执行速度;
         16位的Thumb指令集,对应处理器状态:

        Thumb状态,指令长度短,代码密度高(目标码体积小),在16位存储器(数据总线为16位的存储系统)上效率较高,内存占用小,有利于降低功耗,所以常用于嵌入式系统中对代码体积功耗敏感的场景。        

 2 Interworking

        两种指令集各有有点,可以取长补短,混合编程(Interworking),ARM将之定义为处理器的两种执行状态(Execution states)。当对性能要求较高时,可以采用ARM状态;当对代码密度和功耗要求较高时,则可以采用Thumb状态。

       具体来说,Thumb指令是ARM指令的一个受限子集,在Thumb状态下,不能直接访问所有的处理器寄存器,只有r0~r7(low registers)是可以被任意访问的,在Thumb状态下使用低组寄存器和在ARM状态下使用没有区别。寄存器r8~r12(high registers)只能通过MOV、ADD或CMP指令访问。CMP指令和所有操作r0~r7的数据处理指令都会影响CPSR中的条件标志位。一些Thumb指令还使用到了程序计数器PC(r15)链接地址寄存器LR(r14)堆栈指针寄存器SP(r13)。在Thumb状态下,读取r15寄存器时,bit[0]值为0,bit[31∶1]包含了PC的值。当对r15进行写入时,bit[0]被忽略,bit[31∶1]:0被设置成PC的值。

       为此,ARM处理器支持从ARM状态到Thumb状态相互无缝转换的能力,即可以根据需要动态切换指令集。在ARM状态下,通过执行指令“BX Rm”(Rm为一个寄存器地址),处理器可以跳转到Thumb状态的指令集中;在Thumb状态下,也可以通过执行指令“BX Rm”跳转回ARM状态,像BX这种可以用来切换状态的指令被称为interworking instructions。

        直至Thumb-2指令集的出现,它通过在原Thumb的基础上引入很多32位指令发展而来(Thumb是Thumb-2的子集),同时支持16位和32位的指令,集两种指令集之大成,再也不用考虑在Thumb和ARM两种状态之间来回切换了。

        由于ARMV7只支持Thumb-2指令集,interworking instructions使用时必须严格标识执行状态为Thumb状态(EPSR.T == 1),否则就会错误异常。具体来说,Thumb状态的标志位会存储在interworking address的bit[0]上,而interworking address在以下指令中使用:

        ① BXBLX(BLX and BX interwork on the value in Rm, BX Rm);

        ② POP interworks on the value loaded to the PC,例如:

push {r0-r3, lr}         ;子程序入口

pop {r0-r3, pc}         ;子程序出口

        ③  使用LDRLDM(此两条指令皆为32位指令)加载PC(an LDR or LDM that loads the PC),例如:

LDR PC, [Rn] ;转移地址存储在 Rn 所指向的存储器中;

        当PC被以上指令更新时,bit[0]会被忽略,[31:1]:’0’会被用于写入PC;随后,就会发生分支转移;

        而bit[0]也不是完全没意义,ARMV7下bit[0]必须为1,它会被用来更新EPSR.T,一旦EPSR.T == 0的情况出现,就会导致NVSTATE UsageFault exception(用法错误异常)。

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

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

相关文章

【PDF.js】PDF文件预览

【PDF.js】PDF文件预览 一、PDF.js二、PDF.js 下载1、下载PDF.js2、在项目中引入3、屏蔽跨域错误 三、项目中使用四、说明五、实现效果 使用PDFJS实现pdf文件的预览,支持预览指定页、关键词搜索、缩略图、页面尺寸调整等等。 一、PDF.js 官方地址 文档地址 二、PD…

FPGA开源项目分享——基于 DE1-SOC 的 String Art 实现

导语 今天继续康奈尔大学FPGA课程ECE 5760的典型案例分享——基于DE1-SOC的String Art实现。 (更多其他案例请参考网站: Final Projects ECE 5760) 1. 项目概述 项目网址 ECE 5760 Final Project 项目说明 String Art起源于19世纪的数学…

高精度地图导航论文汇总

文章目录 2022基于高精度地图的智能车辆路径规划与跟踪控制研究[M] 2023一种无人驾驶融合决策方案的设计与实现[M] 2022 基于高精度地图的智能车辆路径规划与跟踪控制研究[M] 摘要: 随着计算机及通信技术的不断进步,汽车行业也得到了飞速的发展。汽车在…

InternVideo2重塑视频理解新标杆,多模态学习引领行业风向

引言:视频理解的新篇章——InternVideo2的介绍 随着视频内容在日常生活中的普及,视频理解技术的重要性日益凸显。视频不仅包含丰富的视觉信息,还蕴含着动态变化和多模态元素,如音频和文本。这些特性使得视频成为一个复杂的数据类型…

LeetCode Meditations:合并 K 排序列表

描述 合并K分类列表 状态: 您有一系列 k 链接-列表 lists ,每个链接-列表按升序排序。 合并所有链接-列表为一个排序的链接-列出并返回。 例如: Input: lists [[1, 4, 5], [1, 3, 4], [2, 6]] Output: [1, 1, 2, 3, 4, 4, 5, 6] Explanatio…

4.5 文字绘制

PutText 函数在图像中呈现指定的文本字符串。不能使用指定字体呈现的符号将由问号替换。 void cv::putText ( cv::Mat & img,//待绘制的图像 const String & text,//待绘制的文字 Point org,//文本框的左下角 int fontFace,//字体类型 double fontScale,//尺寸因…

虹科Pico汽车示波器 | 免拆诊断案例 | 2011款东风悦达起亚K5车发动机偶尔起动困难

一、故障现象 一辆2011款东风悦达起亚K5车,搭载G4KD发动机,累计行驶里程约为24.5万km。车主反映,第1次起动发动机时偶尔无法起动着机,第2次能够正常起动着机,但发动机故障灯异常点亮。为此在其他维修厂维修过&#xf…

网站HTTP升级成为HTTPS的方法

将网站从HTTP免费升级为HTTPS,您可以按照以下步骤操作: 1. 选择证书颁发机构(CA): - 为了免费升级,您可以选择使用JoySSL这样的公益项目。JoySSL提供免费、自动化的SSL/TLS证书颁发服务,适用于各…

【Spring高级】SpringMVC处理流程总结

请求处理流程中,DispatcherServlet作为核心组件,负责控制整个流程,协调各个组件之间的交互。同时,SpringMVC提供了丰富的配置选项和扩展点,使得开发者可以根据具体需求定制和扩展功能。 当浏览器发送一个请求 http://…

【linux】yum 和 vim

yum 和 vim 1. Linux 软件包管理器 yum1.1 什么是软件包1.2 查看软件包1.3 如何安装软件1.4 如何卸载软件1.5 关于 rzsz 2. Linux编辑器-vim使用2.1 vim的基本概念2.2 vim的基本操作2.3 vim命令模式命令集2.4 vim底行模式命令集2.5 vim操作总结补充:vim下批量化注释…

MySQL 8.0 克隆(clone)插件快速搭建主从复制

MySQL 8.0 clone插件提供从一个实例克隆数据的功能,克隆功能提供了更有效的方式来快速创建MySQL实例,搭建主从复制和组复制。本文介绍使用 MySQL 8.0 clone 插件快速搭建主从复制的方法 环境: mysql 8.0.29 主库:192.168.56.201…

FFmpeg: 简易ijkplayer播放器实现--01项目简介

文章目录 项目介绍流程图播放器实现过程界面展示 项目介绍 此项目基于FFmeg中 ffplay.c进行二次开发,实现基本的功能,开发软件为Qt 项目优势: 参考ijkplayer播放器,实现UI界面和播放器核心进行解耦,容易添加其他功能…

【Kaggle比赛】DFL 德甲足球事件检测大赛(CV·目标检测-视频分类)

赛题解析 比赛目标 进球了!在这场比赛中,你会发现足球(足球)传球ーー包括掷界外球和传中球ーー以及德甲比赛中的挑战。您将开发一个计算机视觉模型,可以在长视频记录中自动分类这些事件。 您的工作将有助于规模的数据收集过程。自动事件注释可以使事件数据从目前未探索的…

解锁视觉密码:计算机视觉理论与应用

一、引言 A. 计算机视觉的定义与重要性 计算机视觉是一门研究如何使计算机能够“看”和理解图像或视频的科学。它结合了图像处理、模式识别、机器学习等多个领域的技术,旨在赋予计算机对视觉信息的感知、分析和理解能力。计算机视觉的重要性在于其能够模拟人眼的视…

ELK企业日志分析系统介绍

前言 随着企业级应用系统日益复杂,随之产生的海量日志数据。传统的日志管理和分析手段,难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下,ELK日志分析系统应运而生。本文将从ELK 日志分析系统的原理、架构及其在实践中的应用做相…

使用Django开发爬虫系统

在本文中,我们将介绍如何使用Django开发一个简单但功能强大的爬虫系统。我们将使用Python编写爬虫,并将爬取到的数据存储到Django模型中,然后通过Django的管理页面管理这些数据。 1. 介绍 爬虫系统用于从互联网上收集信息,常用于…

Gin环境搭建详解

Gin环境搭建详解: 要安装Gin软件包,需要先安装Go并设置Go工作区。Gin环境搭建步骤如下: 【Gin框架】Gin环境搭建 Gin程序的热加载 Gin路由 GET POST PUT DELETE 1. 下载并安装 gin : $ go get -u github.com/gin-gonic/gin 2. …

Centos7下docker的jenkins下载并配置jdk与maven【图文教程】

个人记录 进入目录 cd /usr/local/JDK下载与配置 OpenJDK官网 下载安装 wget https://download.java.net/openjdk/jdk18/ri/openjdk-1836_linux-x64_bin.tar.gz解压 tar -zxvf openjdk-1836_linux-x64_bin.tar.gz ls ls jdk-18/编辑配置文件 vim /etc/profile配置环境变…

elementui树形组件自定义高亮颜色

1、需求描述&#xff1a;点击按钮切换树形的章节&#xff0c;同时高亮 2、代码实现 1&#xff09;style样式添加 <style> .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {background-color: #81d3f8 !important; //高亮颜色colo…

【C++题解】1005 - 已知一个圆的半径,求解该圆的面积和周长

问题&#xff1a;1005 - 已知一个圆的半径&#xff0c;求解该圆的面积和周长 类型&#xff1a;基础问题、小数运算 题目描述&#xff1a; 已知一个圆的半径&#xff0c;求解该圆的面积和周长。 输入&#xff1a; 输入只有一行&#xff0c;只有 1 个整数。 输出&#xff1a…