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寄存器时,bit0值为0,bit31∶1包含了PC的值。当对r15进行写入时,bit0被忽略,bit31∶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的bit0上,而interworking address在以下指令中使用:

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

POP interworks on the valueloaded 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被以上指令更新时,bit0会被忽略,31:1:'0'会被用于写入PC;随后,就会发生分支转移;

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

相关推荐
LDyun_18 小时前
2026暑期云手机选型指南:从稳定性、成本到风控六大核心评判维度
arm开发·ios·智能手机·安卓·玩游戏
zlinear数据采集卡18 小时前
2mV纹波的代价:硬核拆解ZLinear模拟前端放大器与正负可调电源设计
arm开发·单片机·嵌入式硬件·fpga开发·架构·开源
2601_9547064920 小时前
云虚拟化终端架构解析:ARM 云端集群部署与自动化运维实践
运维·arm开发·架构
米尔的可达鸭21 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
zlinear数据采集卡1 天前
硅片里的“自动纠错“:硬核拆解LHAMP188自动归零技术原理与三种封装的PCB布局实战
arm开发·单片机·嵌入式硬件·fpga开发·开源
是摆烂第一名呀1 天前
RK3576+GMSL摄像头底层适配与调试
linux·arm开发·驱动开发·嵌入式硬件·数码相机
zlinear数据采集卡1 天前
从气动比例阀到任意波形:硬核拆解ZLinear采集卡的DAC输出架构与工业闭环控制实战
arm开发·架构
是摆烂第一名呀3 天前
【rk3506】U-Boot串口时钟未配置,导致串口彻底失效
linux·arm开发·驱动开发·嵌入式硬件
2601_949816353 天前
C++内存对齐与结构体填充深度精讲:底层规则、内存裁剪、适配优化与工程避坑
开发语言·arm开发·c++
是摆烂第一名呀3 天前
【RK3506】RGB屏幕与背光调试记录
linux·arm开发·驱动开发·嵌入式硬件