基于ARM的嵌入式系统程序开发要点(五)——ARM/Thumb的交互工作
基于ARM的嵌入式系统程序开发要点(五)
——ARM,Thumb的交互工作
产业技术与信息
基于ARM的嵌人式系统程序开发要点(五)
ARM/Thumb的交互工作
?ARM中国费浙平
在前面的文章中提到过,很多情况下应用程序需要
在ARM跟Thumb状态之间相互切换,这部分就讨论交
互工作的实现方法和一些注意问题.
1需要交互的原因
前面提到过,Thumb指令在某些特殊情况下具有比
ARM指令更为出色的表现,主要是在代码长度和窄带
宽存储器系统性能两方面.正是因为ThUmb指令在特
定环境下的优势,它在很多方面得到了广泛应用.但是
因为下面一些原因,ThUmb又不可能独立地组成一个
应用系统.
?Thumb指令集在功能上只是ARM指令集的一个子
集,某些功能只能在ARM状态下执行,如CPSR和
协处理器的访问.
?进行异常响应时,处理器会自动进入ARM状态.
?从系统优化考虑,在宽带存储器上不应该放置
Thumb代码,很多窄带系统具有宽带的内部存储器.
?即使是一个单纯的Thumb应用系统,也必须加一
个汇编的交互头程序,因为系统总是自动从ARM
开始启动.
所以,不可避免地会产生ARM与Thumb之间交互
的问题.
2状态切换的实现
处理器在ARM/Thumb之间的状态切
换是通过一条专用的跳转交换指令Bx来
实现的.BX指令以通用寄存器(R0,R15)
为操作数,通过拷贝Rn到PC来实现4GB
空间范围内的一个绝对跳转.Bx利用Rn
寄存器中存储的目标地址值的最后一位来
判断跳转后的状态.如图1所示,是用BX
指令实现状态切换.
无论ARM还是Thumb,其指令存储在
存储器中都是边界对齐的(4字节或2字节
对齐).因此,在执行跳转过程中,PC寄
Rn
PC
存器中的最低位肯定被舍弃,不起作用.在Bx指令的
执行过程中,最低位正好被用作状态判断的
,不会
造成存储器访问不对齐的错误.
下面是一段直接进行状态切换的例程.
:从ARM状态开始
C0DE32
ADRR0,Into—
Thumb+1
BXR0
C0DE16
Into——
Thumb
ADRR5,Back—
to—
ARM
BXR5
C0DE32
;汇编关键字
;得到目标地址,末位置1
;转向Thumb
;执行
;其它代码
;汇编关键字
;Thumb代码段起始地址
;Thumb代码
;得到目标地址,末位缺
;省为0,转向ARM
;执行
;其它代码
;汇编关键字
Back—
to..
ARM;ARM代码段起始地址
我们知道,在ARM的状态寄存器CPSR中,bit-5是
状态控制位T-bit,决定当前处理器的运行状态.如果直
接修改CPSR的状态位,也能够达到改变处理器运行状
态的目的.但是这样会带来一个问题,因为ARM采用
多级流水线的结构,所以在程序执行过程中,指令流水
当前状态是Thumb时
[三]当前状态是ARM时[
图1Bx指令实现状态切换
ARM/Thumb选择位:
0一ARM
1一Thumb
82丰?;?u入象惋应两冒皿暖一
线上会存在几条预取指令(具体数目视流水线级数而不
同).当修改CPSR的T.bit后,状态的转变会造成流水
线上预取指令的执行错误.而如果用BX指令,则执行
后会进行流水线的刷新动作,清除流水线
上的残余指令,在新的状态下重新开始指
令预取,从而保证状态转变时指令流的正
确衔接.
3ARM/Thumb之间的
调用
在无交互的子程序调用中,其过程比
较简单.实现调用通常只需要一条指令:
BLfunction
实现返回也只需要从LR恢复PC即可:
MOVPC,LR
函数的调用过程如图2所示.
voidfunc1(void)
{
func20;
方面让编译器能够使用正确的指令码进行编译,另一方
面,当在不同的状态之间发生函数调用时,链接器将插
入一段链接代码(veneers)来实现状态转换.
File1.cFile2.c
voidfunc1(void)voidfunc2(void)
{{
rune20;
}
}
funcl
链接器生成
c2
链接代码——
图3不同状态间函数调用的示例
上述过程中的一个特点是:
的BL指令来进行子程序调用,
图2普通函数调用
如果子函数和父函数不在同一种状态下执行,因为
状态切换,需要对函数调用作更多的考虑.
?BL不能完成状态切换,需要由BX来切换状态.
?BX不能自动保存返回地址到LR,需要在BX之
前先保存好LR.
?用”BXLR”来返回,不能使用”MOVPC,LR”,
因为这条指令同样不能实现状态切换.返回时要仔细考
虑保存在LR中最低位的
是否正确.
假如用户直接使用汇编语言进行状态交互跳转,上
述的几个问题都需要用手工编码加以处理.如果用户使
用高级语言进行开发,不需要为ARM/Thumb之间的相
互调用增加额外编码,但是最好要对其调用过程加以了
解.下面以ARMADS中的编译工具为例进行说明,如
图3所示.
?两个函数func1()和func2()被编译成不同的
指令集(ARM或Thumb).
注意:func1()和func2()在这里位于二个不同
的源文件中.
?编译时必须告诉编译器和链接器足够的信息,一
func1()还是使用通常
而func2()返回时则直
接使用”BXLR”,没有对LR进行判断和最低
位的设置.这是因为当执行BL指令对LR进行
保存时,其最低位会被自动设置,以满足返回
时状态切换的需要,可直接使用”BXLR”.
在上面的例子中,为了让编译器在编译函
数func2()时使用BX而不是BL进行返回,必
须告诉编译器要按照满足交互工作要求的方式
进行编译.在ARM的编译器选项设置中,应
选择”.apcs/interwork”.这样,函数的返回指
令会被正确设置,并且当链接器进行目标代
码的链接时,能够在需要的地方插入正确的链接代码实
现状态切换.
当然,插入了链接代码会相应地增加代码长度,通
常一段veneer包含3条指令,即12B字节长度.可以用
“
一
infoveneers”选项使链接器输出所有veneers的位置和
长度信息.
4交互程序之间的兼容性
因为在指定交互选项后,编译及链接后的输出代码
跟在无交互情况下不同,所以当多个源文件如果使用了
不同的设置进行编译,相互之间的调用可能产生兼容性
问题.图4说明了这些关系.
在一个使用交互工作的项目
管理中,对此要加
以仔细考虑.
5V5架构的扩展
ARM在V5版本的架构中,对ARM/Thumb的交互增
加了新的支持.针对前面第3节中提到的函数调用和返
回问题,V5版本中专门对指令做了扩展.
?增加了新指令BLX,解决了原来BX和BL指令各
|圈田—_Mi.Il&Eb.ddcdsym83
产业技术与信息
允许Thumb-T
图4不同编译方式下函数调用的兼容性
自的欠缺.使
交互的函数调
用可以由一条
指令实现,省100
去了跳转代码80
的开销.60
?扩展了40
以PC为目标20
地址的数据传0
输指令功能.
PC加载值的
最低位将被自
C0deSize
6Thumb—.2
ARM和Thumb因为其各自的优
势,都得到了极为广泛的应用.在一
一
个应用程序中,用户要根据系统的具
体情况灵活分配,使用不同的编译器,
把不同的代码编译成ARM或Thumb,
以希望得到最优的代码长度和性能平
衡.这样做能够达到系统优化的目的,
但是也给
人员带来了额外的交互
处理工作.最近,ARM公司公布了一
Performance
„l】图5ARM,Thumb和Thumb一2的比较
动送到状态寄存器CPSR的T状态位.也就是说,通过
给PC赋值的方法也能实现状态的切换,这样就使习惯
的函数返回方法——从堆栈中恢复寄存器,也能实现
交互调用函数的正确返回了.
所以,V5架构以后的代码,不再需要额外的链接代
码,缩小了代码长度,提高了状态切换时的执行效率.
当然,在V5及以后的架构中,继续保持了对以前代码
的良好兼容性.
越
项新的发明一Thumb-2指令集,该指令集同时包含32
位和l6位指令,在代码长度和性能之间作了最佳的平
衡.这样,以后用户就可以用一个统一的Thumb-2编译
器来解决现在面临的很多问题了.
如图5所示,是Thumb-2指令集跟ARM和Thumb之
间的比较.
新的指令集将在最新的ARM授权中发布,更多信
息请访问www.arm.com.
(本连载最后一部分将发于2004年第l期)
无线发射/接收电路设计
黄智伟编着
北京航空航天大学出版社出版预计出版日期:2004年1月
本书主要介绍无线接收机和无线发射机的体系结构,射频小信号放大器电路,射频功率放大器(RFPA)电路,上变频
器/下变频器电路,调制器/解调器电路,锁相环路(PLL)电路,DDS(直接数字式频率合成器)电路,无线通信系统解
决方案的基本原理,内部结构,技术特性和应用电路设计.本书注重新技术与_T-程性的结合,注重理论性与实用性的结合,
_
T-程性好,实用性强.
本书可作为从事无线通信,移动通信,无线寻呼,无绳电话,无线数据采集与传输系统,无线遥控和遥测系统,无线网
络,无线安全防范系统等应用研究的_T-程技术人员,在进行无线通信电路设计时的参考书和_T-具书,也可以作为高等院校通
信,电子等相关专业本科生和研究生的专业教材和教学参考书.
84丰”蠢入式每?{.应固罾皿瞳咽