基于ARM的嵌入式系统程序开发要点(五)

发布者:TranquilDreams最新更新时间:2015-04-15 来源: eechina关键字:交互工作  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指令实现状态切换。

1.jpg 


无论ARM还是Thumb,其指令存储在存储器中都是边界对齐的(4字节或2字节对齐)。因此,在执行跳转过程中,PC寄存器中的最低位肯定被舍弃,不起作用。在BX指令的执行过程中,最低位正好被用作状态判断的标识,不会造成存储器访问不对齐的错误。

图 2 中是一段直接进行状态切换的例程:

2.jpg 

下面是一段直接进行状态切换的例程。
;从ARM状态开始
  CODE32 ;汇编关键字
  ADR R0, Into_Thumb+1 ;得到目标地址,末位置1, ;转向Thumb
  BX R0 ;执行 ? ;其它代码
  CODE16 ;汇编关键字
Into_Thumb ;Thumb代码段起始地址
  … ;Thumb代码
  ADR R5, Back_to_ARM ;得到目标地址,末位缺 ;省为0,转向ARM
  BX R5 ;执行
  … ;其它代码
  CODE32 ;汇编关键字
Back_to_ARM ;ARM代码段起始地址

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

3  ARM/Thumb之间的函数调用

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

实现返回也只需要从LR恢复PC即可:
MOV PC, LR

函数的调用过程如图3所示。

3.jpg 

如果子函数和父函数不在同一种状态下执行,因为状态切换,需要对函数调用作更多的考虑。
①  BL不能完成状态切换,需要由BX来切换状态。
②  BX不能自动保存返回地址到LR,需要在BX之前先保存好LR。
③  用“BX LR”来返回,不能使用“MOV PC, LR”,因为这条指令同样不能实现状态切换。返回时要仔细考虑保存在LR中最低位的内容是否正确。

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

4.jpg 

①  两个函数func1()和func2()被编译成不同的指令集(ARM或Thumb)。
注意:func1()和 func2()在这里位于二个不同的源文件中。
②  编译时必须告诉编译器和链接器足够的信息,一方面让编译器能够使用正确的指令码进行编译,另一方面,当在不同的状态之间发生函数调用时,链接器将插入一段链接代码(veneers)来实现状态转换。[page]

上述过程中的一个特点是:func1()还是使用通常的BL指令来进行子程序调用,而 func2()返回时则直接使用“BX LR”,没有对LR进行判断和最低位的设置。这是因为当执行BL指令对LR进行保存时,其最低位会被自动设置,以满足返回时状态切换的需要,可直接使用 “BX LR”。

在上面的例子中,为了让编译器在编译函数func2()时使用BX而不是BL进行返回,必须告诉编译器要按照满足交互工作要求的方式进行编译。在ARM的编译器选项设置中,应选择“-apcs /interwork”。这样,函数的返回指令会被正确设置,并且当链接器进行目标代码的链接时,能够在需要的地方插入正确的链接代码实现状态切换。

当然,插入了链接代码会相应地增加代码长度,通常一段veneer包含3条指令,即12B字节长度。可以用“-info veneers”选项使链接器输出所有veneers的位置和长度信息。

4  交互程序之间的兼容性

因为在指定交互选项后,编译及链接后的输出代码跟在无交互情况下不同,所以当多个源文件如果使用了不同的设置进行编译,相互之间的调用可能产生兼容性问题。图5说明了这些关系。

5.jpg 


在一个使用交互工作的项目工程管理中,对此要加以仔细考虑。

5  V5架构的扩展

ARM在V5版本的架构中,对ARM/Thumb的交互增加了新的支持。针对前面第3节中提到的函数调用和返回问题,V5版本中专门对指令做了扩展。
①  增加了新指令BLX,解决了原来BX和BL指令各自的欠缺。使交互的函数调用可以由一条指令实现,省去了跳转代码的开销。
②  扩展了以PC为目标地址的数据传输指令功能。PC加载值的最低位将被自动送到状态寄存器CPSR的T状态位。也就是说,通过给PC赋值的方法也能实现状态的切换,这样就使习惯的函数返回方法——从堆栈中恢复寄存器,也能实现交互调用函数的正确返回了。

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

6  Thumb-2

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

如图6所示,是Thumb-2指令集跟ARM和Thumb之间的比较。

6.jpg 


引证文献

   1. 杨志强 嵌入式系统设计与发展 [期刊论文] -青海师范大学学报(自然科学版)2005(03)
   2. 刘志勇 基于ARM的无线视频传输硬件系统的初步研究与开发 [学位论文] 硕士2005
   3. 李晶 基于 LINUX的无线局域网芯片驱动程序的设计与开发 [学位论文] 硕士2005
关键字:交互工作  ARM  程序开发 引用地址:基于ARM的嵌入式系统程序开发要点(五)

上一篇:基于ARM的嵌入式系统程序开发要点
下一篇:基于ARM处理器的软件优化设计

推荐阅读最新更新时间:2024-03-16 13:58

ARM Linux开机后自动运行特定程序的方法
系统服务的命令保存在开发板根文件系统的/usr/etc/rc.local文件中。有的开发板开机后自动运行图形界面程序,需要按住ctrl+c让开发板进入到linux的SHELL提示符界面。其实可通过注释掉rc.local文件中调用图形界面的命令,增加运行用户应用程序的命令,达到开机自动运行用户应用程序的目的。 下面以我做的实验为例,描述具体的实现步骤。该方法源于网络,我加以验证,稍做修改,此文相当于转载。 1.进入pc机的Linux 操作系统,在/nfs/usr/下通过mkdir lz 命令新建一个名为lz的文件夹,进入lz文件夹,通过mkdir hello新建一个hello文件夹用来存放我们将要编写的hello.c文件和编译生
[单片机]
arm驱动linux内核中断编程
第一部分获取中断(开启硬件中断) 一、中断的申请注销: 1)中断的申请 int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) 2)中断的注销 void free_irq(unsigned int irq, void *dev_id) 3)中断处理函数 static irqreturn_t irq_handle(int irq, void *dev__id); 参数:irq:表示中断号,这个参数还保留由于历史遗留问题,往后可能越来越没用了。由于
[单片机]
ARM存储器结构,映射,重新映射
ARM存储器结构 ARM存储器:片内Flash、片内静态RAM、片外存储器 存储器映射(Memory Map) 映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系。 我们可以把存储器看成一个具有输出和输入口的黑盒子。输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很复杂的半导体电路实现的,具体的实现的方式我们现在不管。存储单位一般是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。 普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每
[单片机]
<font color='red'>ARM</font>存储器结构,映射,重新映射
ARM硬件设计:EBI总线
1.地址线引脚 AT91X40X系列地址总线有24根地址线并且因此能够访问16M的存储器空间。地址线A0-A23不能和任何PIO线或内部设备复用。地址线A20-A23复用为PIO线和四个附加的4个片选线。在访问设备时如果这4个高4位地址线不使用,他们能够作为片选线或PIO线。当使用基于闪存的AT91X40X系列微控制器时,注意地址线A20复位后不得作为片选线(CS7)或PIO线。A20是内部闪存的MSB(最高位)。 2.数据总线引脚 AT91X40X系列数据总线能够使用8-位或16-位模式,这依赖于片选线0(NCSO)的BMS引脚状态和其他所有片选线的EBI芯片选择寄存器的配置。需要注意的是,AT91X40X系列微控制器的
[单片机]
ARM笔记:kermit的使用
1 开发环境 宿主机:Windows + VMware + Ubuntu16.04 开发板:Mini2440 串口工具:kermit(安装于Ubuntu16.04,详见《 Ubuntu16.04中安装Kermit 》) 2 U-Boot命令 按照《 U-Boot命令 》的方法查看U-Boot支持的命令,其中loadb、loads和loady的说明如下: view plain copy loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line l
[单片机]
<font color='red'>ARM</font>笔记:kermit的使用
ARM将主导500美元以下嵌入式设备市场
摩根士丹利分析师弗朗科斯·穆尼尔(Francois Meunier)在一份研究报告中将ARM的股票评级从“持股观望”上调至“增持”。他认为,ARM在移动处理器市场领先Intel 2年时间,因此业绩还将继续提升。 ARM股票已被列入摩根士丹利的“最佳创意”股票名单中。穆尼尔在报告中表示:“ ARM给出的长期出货量预期最初往往让人觉得过于乐观,但最终却被证明是保守的。 半导体产品的价格弹性、智能手机和平板机等新型产品的出现,以及新兴市场对科技产品需求的上升成为过去5年中行业最主要的增长动力。如果未来5年这一创新趋势仍能够继续,那么到2016年ARM的每股收益将达到0.37英镑(约合0.58美元)。” 穆尼尔预计,ARM今年和明年的
[手机便携]
一文教你如何区别ARM Cortex系列处理器
众所周知,英国的ARM公司是嵌入式微处理器世界当中的佼佼者。ARM一直以来都是自己研发微处理器内核架构,然后将这些架构的知识产权授权给各个芯片厂商,精简的CPU架构,高效的处理能力以及成功的商业模式让ARM公司获得了巨大的成功,使它迅速占据了32位嵌入式微处理器的大部分市场份额。 目前,随着对嵌入式系统的要求越来越高,作为其核心的嵌入式微处理器的综合性能也受到日益严峻的考验,现在一个高端智能手机的处理能力几乎可以和几年前的笔记本电脑相当。为了迎合市场的需求,ARM公司也在加紧研发他们最新的 ARM架构,Cortex系列就是这样的产品。那么我们今天就不妨好好了解一下ARM Cortex系列处理器知识点汇总。 ARM Cort
[单片机]
一文教你如何区别<font color='red'>ARM</font> Cortex系列处理器
基于ARM控制器LPC2214的税控收款机系统的设计
引言   税控收款机是指具有特定税控功能的电子收款机,它是集软硬件为一体的嵌入式系统,硬件设计考虑高性价比和高可靠性,软件设计考虑系统的稳定性和可靠性。根据这一原则,本文介绍了一种基于ARM控制器LPC2214的税控收款机的设计方案。 税控收款机硬件系统的设计与实现   税控收款机的硬件组成框图如图1所示,其硬件系统由中央处理模块、显示模块、打印模块、电源模块、时钟模块、IC卡接口、外部通讯接口(包括RS232串行接口、网络接口、USB接口等)、蜂鸣器,以及输入键盘、电子锁、条码扫描仪和手写板等几部分组成。 图1 税控收款机硬件框图 中央处理模块   中央处理模块采用飞利浦公司基于32位ARM7TDMI-S内核的低功耗ARM
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved