免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 865 | 回复: 0
打印 上一主题 下一主题

基于 ARM 的嵌入式系统程序开发要点(五) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-10 17:38 |只看该作者 |倒序浏览


—— ARM/Thumb 的交互工作


在前面的文章中提到过,很多情况下应用程序需要在 ARM 跟 Thumb 状态之 间相互切换,这部分就讨论交互工作的实现方法和一些注意问题。


嵌入式程序开发
嵌入式系统 arm指令
1. 需要交互的原因


前面提到过 Thumb 指令在某些特殊情况下具有比 ARM 指令更为出色的表 现,主要是在代码长度和窄带宽存储器系统性能两方面。正因为 Thumb 指令在 特定环境下面的优势,它在很多方面得到了广泛的应用。但是因为下面一些原因, Thumb  又不可能独立地组成一个应用系统,所以不可避免地会产生 ARM  与 Thumb 之间交互的问题。

z Thumb 指令集在功能上只是 ARM 指令集的一个子集,某些功能只能在
ARM 状态下执行,如 CPSR 和协处理器的访问。
z 进行异常响应时,处理器会自动进入 ARM 状态。
z 从系统优化考虑,在宽带存储器上不应该放置 Thumb 代码,很多窄带 系统具有宽带的内部存储器。
z 即使是一个单纯的 Thumb 应用系统,也必须加一个汇编的交互头程序, 因为系统总是自动从 ARM 开始启动。

2. 状态切换的实现


处理器在
ARM/Thumb
之间的状态切换是通过一条专用的跳转交换指令 BX 来实现的。BX 指令以通用寄存器(R0-R15)为操作数,通过拷贝 Rn 到 PC 来 实现 4GB 空间范围内的一个绝对跳转。BX 利用 Rn 寄存器中存储的目标地址值 的最后一位来判断跳转后的状态。
无论 ARM 还是 Thumb,其指令存储在存储器中都是边界对齐的(4-Byte 或
2-Byte 对齐),所以在执行跳转过程中,PC 寄存器中的最低位肯定被舍弃,不起 作用。在 BX 指令的执行过程中,最低位正好被用作状态判断的标识,不会造成 存储器访问不对齐的错误。

我们知道 ARM 的状态寄存器 CPSR 中,bit-5 是状态控制位 T-bit,决定当前 处理器的运行状态。如果直接修改 CPSR 的状态位,也能够达到改变处理器运行 状态的目的,但是会带来一个问题。因为 ARM 采用了多级流水线的结构,所以 在程序执行过程中指令流水线上会存在几条预取指令(具体数目视流水线级数而 不同)。当修改 CPSR 的 T-bit 以后,状态的转变会造成流水线上预取指令执行的 错误。而如果用 BX 指令,则执行后会进行流水线刷新动作,清除流水线上的残余指令,在新的状态下重新开始指令预取,从而保证状态转变时候指令流的正确 衔接。

3ARM/Thumb 之间的函数调用

在无交互的子程序调用中,其过程比较简单。实现调用通常只需要一条指
令:

如果子函数和父函数不是在同一种状态下执行的,因为状态切换,需要对 函数调用作更多的考虑。

(a) BL 不能完成状态切换,需要由 BX 来切换状态。
(b) BX 不能自动保存返回地址到 LR,需要在 BX 之前先保存好 LR。
(c)  用“BX          LR”来返回,不能使用“MOV                       PC,  LR”,因为这条指令同 样不能实现状态切换。返回时要仔细考虑保存的 LR 中最低位内容是否 正确。


假如用户直接使用汇编进行状态交互跳转,上述的几个问题都需要用手工 编码加以处理。如果用户使用高级语言进行开发,不需要为 ARM/Thumb 之间的 相互调用增加额外的编码,但是最好要对其调用过程加以了解。下面以 ARM ADS 中的编译工具为例进行说明(图 4)。


(a)  两个函数 func()和 func()被编译成了不同的指令集(ARM 或 Thumb)。 注意 func1()和 func2()在这里位于二个不同的源文件。
(b)  编译时必须告诉编译器和连接器足够的信息,一方面让编译器能够使用正确的指令码进行编译,另一方面这样当在不同的状态之间发生函数调 用时,连接器将插入一段连接代码(veneers)来实现状态转换。
4. 交互程序之间的兼容性 正因为在指定交互选项后编译及连接后的输出代码跟在无交互情况下不同,
所以当多个源文件如果使用了不同的设置进行编译,相互之间的调用可能产生兼 容性问题。
5V5 架构的扩展


ARM
在 V5 版本的架构中,对 ARM/Thumb 的交互增加了新的支持。针对前 面第 3 节中提到的函数调用和返回问题,V5 版本中专门对指令做了扩展。


(a)  增加了新指令 BLX,解决了原来 BX 和 BL 指令各自的欠缺。使交互的函数调用可以由一条指令实现,省略了跳转代码的开销。
(b)  扩展了以 PC 为目标地址的数据传输指令功能。PC 加载值的最低位将被
自动送到状态寄存器 CPSR 的 T 状态位。也就是说通过给 PC 赋值的方法也能实 现状态的切换了,这样就使习惯的函数返回方法——从堆栈中恢复寄存器的方 法,也能实现交互调用函数的正确返回了。


所以,V5  架构以后的代码,不再需要额外的连接代码(veneers)了,帮助 缩小代码长度,提高状态切换时候的执行效率。当然,在 V5 及以后架构中,继 续保持对以前代码的良好兼容性。

6Thumb-2
ARM 和 Thumb 因为各自的优势都得到了极为广泛的应用,在一个应用程序 中,用户要根据系统的具体情况灵活分配,使用不同的编译器,把不同的代码编 译成 ARM 或 Thumb,以希望得到最优的代码长度和性能平衡。这样做能够达到 系统优化的目的,但是也给设计人员带来了额外的交互处理工作。最近 ARM 公 司公布了一项新的发明——Thumb-2 指令集,该指令集同时包含 32 位和 16 位指 令,在代码长度和性能之间作了最佳的平衡;这样,以后用户就可以用一个统一 的 Thumb-2 编译器来解决现在面临的很多问题了。

新的指令集将在最新的 ARM 授权中发布,更多信息请访问
www.embedm.com

技术支持:0755-21199019手机13148818895余焕丽


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/81862/showart_1285827.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP