文档视界

最新最全的文档下载
当前位置:文档视界 > ARM处理器工作模式

ARM处理器工作模式

ARM处理器工作模式

除了用户模式以外,其他6种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。其中除了系统模式外的其他5种特权模式又称为异常模式。处理器模式可以通过软件来切

ARM处理器工作模式

ARM处理器工作模式

通用寄存器通常又可以分为下面3类。

n 未备份寄存器:包括R0~R7。

n 备份寄存器:包括R8~R14。

n 程序计数器PC:即R15。

1)未备份寄存器R0~R7

对于每个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器,在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。

2)备份寄存器R8~R14

备份寄存器中的每个寄存器对应于两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记做R8_fiq和R9_fiq,当使用用户模式下的寄存器时,寄存器R8和寄存器R9分别记做R8_usr和R9_usr 等。在这两种情况下使用的是不同的物理寄存器,系统没有将这几个寄存器用于任何的特殊用途。中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程很迅速。

ARM处理器工作模式

ARM处理器工作模式

ARM处理器工作模式

2)Q标志位

在ARM v5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出,同样的,SPSR的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。

3)CPSR中的控制位

CPSR的低8位I、F、T及M[4:0]统称为控制位,当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

① I中断禁止位

当I=1时禁止IRQ中断。

当F=1时禁止FIQ中断。

通常一旦进入中断服务程序可以通过置位I和F来禁止中断,但是在本中断服务程序退出前必须恢复原来I、F位的值。

ARM处理器工作模式

CPSR的其他位用于将来ARM版本的扩展,程序可以先不操作这些位。

1.4.4 ARM体系结构的异常中断

ARM体系结构中的异常中断是ARM处理器的核心,而对于异常中断的处理则是嵌入式操作系统的核心。一般来说ARM体系结构中程序的执行通常由以下3种方式来控制。

n 在正常程序执行时,每执行一条ARM指令,PC的值加4字节,每执行一条

Thumb指令,PC加2字节,整个过程是按顺序执行。

n 通过跳转指令,程序可以跳到特定的地址标号执行,或者跳转到特定的子程

序处执行。常用的跳转指令有B、BL、BX、BLX等。

ARM处理器工作模式

ARM处理器对异常中断的响应过程是首先保存处理器当前状态、中断屏蔽位及C PSR寄存器中的各个条件标志位。这是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中实现的。其次设置当前程序状态寄存器CPSR中相应的位。再次将寄存器LR_mode(R14_mode)设置成返回地址。最后将PC设置成该异常中断的中断向量地址,从而跳转到对应的中断处理程序处执行。

ARM处理器从异常中断程序中返回的过程:首先恢复被中断程序的处理器状态,也就是将SPSR_mode 内容复制到CPSR。然后返回到发生异常中断指令的下一条指令处执行,即将LR_mode(R14_mode)寄存器的内容复制到PC中。

1.4.5 ARM体系结构中的存储系统

ARM处理器工作模式

ARM处理器工作模式

非对齐的存储访问操作:在ARM体系结构中通常希望字单元的地址是字对齐的(地址的低两位是0b00),半字单元的地址是半字对齐的(地址的最低位为0b 0),但在存储单元中地址没有遵守上述的对齐规则,称为非对齐的存储访问操作,在ARM体系结构的伪指令集中有专门的align指令来指定对齐格式。

在ARM体系结构中允许指令预取,在CPU执行当前代码的同时,可以从存储器中预取其后若干条指令,具体预取多少条指令则由不同的ARM处理器内核的实现来决定。

2.ARM体系结构中的MMU

另外一个重要的概念就是MMU(Memory Manager Unit)。ARM存储系统的体系结构适应不同的嵌入式系统应用,它的差别很大。最简单的存储系统使用平板式的地址映射机制,地址空间的分配是固定的,系统中各部分都使用物理地址,这样的处理器不带MMU。而一些复杂的系统可能包含一种或多种下面提到的技术,从而提供功能更为强大的存储系统。

(1)系统中可能包含多种类型的存储器件,一般都有Flash、SRAM、SDRAM等接口。

(2)使用指令/数据cache及Write Buffer技术缩小处理器和存储系统速度差别,从而提高系统的整体性能。

(3)系统中包含有MMU单元。

MMU使用内存映射技术实现虚拟空间到物理空间的映射,这种映射机制对于嵌入式系统尤其重要。通常程序放在ROM/Flash中,这样系统掉电后程序能够保存。但是ROM/Flash比SDRAM速度慢很多,而且在嵌入式系统中,中断向量表存放在RAM中,不过利用内存映射就可以解决这种问题。在系统加电时将ROM/Flash地址映射到0x00000000,在0x00000000地址处存放启动代码,来完成系统设备的初始化,之后再把内核程序加载到SDRAM,然后把地址映射到SDRAM的地址,跳转到SDR AM地址运行就可以了。

针对具有MMU的ARM处理器可以移植Linux for ARM操作系统,针对没有MMU

的处理器,一般都是移植uClinux for ARM。比如说Samsung公司的S3C4510、S 3C2510都是不带MMU的处理器,只能移植uClinux,而针对S3C2410、PXA27x、OMAP591x等带有MMU单元的ARM处理器通常都可以移植Linux操作系统。带有M MU的处理器内部都有用于存储管理的系统控制协处理器CP15,在移植嵌入式操作系统的Boot Loader时,必须要对存储管理单元进行初始化设置。

3.快速上下文切换技术

FCSE(Fast Context Switch Extension)技术通过修改系统中不同进程的虚拟地址,避免在进程间切换时造成的虚拟地址到物理地址的重映射,从而提高系统

的性能。通常FCSE位于CPU和MMU之间,其责任就是将不同进程使用的相同虚拟地址映射为不同的虚拟空间,使得在上下文切换时无须重建TLB等。

相信通过对ARM处理器架构的简单介绍,读者可以对ARM处理器有大体地了解,如果要继续深化研究,可以到ARM公司的网站去下载对于每个体系结构的详细技术说明文档。对于MMU部分更为详细的介绍,推荐参考《ARM体系结构与编程》(杜春雷编著)一书。接下来介绍一下运行在ARM处理器之上的几种常用的嵌入式软件操作系统。

1.5 嵌入式操作系统概述

前几年在笔者参与设计的石油探测仪器中,通常都是使用8位处理器——单片机,包括51机、PIC等处理器,程序有的是用汇编写的,有的是用C写的,程序基本没有底层和应用层之分,也根本不使用操作系统。这样的系统最后在应用发生变更的时候带来的问题就是:硬件和软件扩展都感觉非常不便,驱动程序、文件系统都没办法加载,以至于很多的功能没有办法去完善,一旦程序需要修改,就需要把所有代码重新编译等问题。还好,及时地跟上了技术的发展,很快开始选用32位ARM处理器,也渐渐地引入了操作系统。并且开始搭建基于ARM处理器的开发平台,这样的平台建立之后,给系统的软件、硬件升级带来了很大的便利。而且在一个平台上进行适当地裁剪之后可以在不同的应用上进行快速开发。这使得后来的开发效率有了很大的提高。

目前嵌入式系统应用领域的一个发展倾向是采用实时多任务操作系统RTOS。应该说RTOS的应用是与应用复杂化直接相关的。过去一个单片机应用程序所控制的外设和履行的任务不多,采取一个主循环和几个顺序调用的用户程序模块即可满足要求,而且现在的单片机芯片本身的性能也有很大程度的提高,可以适应复杂化这一要求,问题还在于软件上。随着应用的复杂化,一个嵌入式控制器系统可能要同时控制、监视很多外设,要求有实时响应能力,需要处理很多任务,而且各个任务之间也许会有多种信息需要相互传递,如果仍采用原来的程序设计方法可能会存在以下问题。

(1)中断可能得不到及时响应,处理时间过长,这对于一些控制场合是不允许的,对于网络通信方面则会降低系统整体的信息流量。

(2)系统任务多,要考虑的各种可能也多,各种资源如调度不当就会发生死锁,降低软件可靠性,程序编写任务量成指数级增加。

因此,RTOS的应用成为嵌入式系统的另一个基本要求。ARM芯片获得了许多实时操作系统(Real Time Operating System)供应商的支持,比较知名的有:Win dows CE、QNX、Linux、VxWorks、Nucleus、Palm OS等。

下面对可以在ARM处理器上运行的常用操作系统做一个简单介绍。具体在平台上的操作系统的选择要根据系统的应用及设计成本等因素综合考虑。

1.5.1 VxWorks

VxWorks是Wind River System公司开发的具有工业领导地位的高性能实时操作系统内核,具有先进的网络功能。VxWorks的开放式结构和对工业标准的支持,使得开发人员易于设计高效的嵌入式系统,并可以很小的工作量移植到其他不同的处理器上。其主要特点如下。

n 可裁剪微内核结构。

n 高效的任务管理能力(多任务——具有256个优先级)。

n 具有优先级排队和循环调度能力。

n 支持快速的、确定性的上下文切换。

n 灵活的任务间通信机制,支持3种信号灯(二进制、计数、有优先级继承特

性的互斥信号灯)。

n 具有消息队列。

n 具有套接字(Socket)。

n 具有共享内存技术。

n 支持信号(Signals)。

n 微秒级的中断处理能力。

n 支持POSIX 1003.1b实时扩展标准。

n 支持多种物理介质及标准和完整的TCP/IP网络协议。

n 灵活的引导方式(支持从ROM、U盘、本地盘、软盘、硬盘或网络中引导)。

n 支持多处理器并行处理。

n 快速灵活的I/O系统管理能力。

n 支持MS-DOS和RT-11等多种文件系统、支持本地盘、U盘、CD-ROM的

使用。

n 完全符合ANSI C标准。

VxWorks板级支持包(BSP)包含了开发人员需要在特定的目标机上运行VxWork s所需要的一切支持:支持特定目标机的软件接口驱动程序等,以及从主机通过网络引导VxWorks的Boot Rom。WindRiver提供支持不同厂商的200多种商业体系结构和目标板的BSP。另外WindRiver还提供一个BSP移植包,帮助用户移植VxWorks到客户化硬件板上。VxWorks是一个商用操作系统,用户需要购买lice nse。

1.5.2 QNX

QNX是由QNX软件系统有限公司开发的一套实时操作系统,它是一个实时的、可扩展的操作系统,部分遵循了POSIX相关标准,可以提供一个很小的微内核及一些可选择的配合进程。其内核仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理。其进程在独立的空间中运行,所有其他操作系统服务都实现为协作的用户进程,因此QNX内核非常小巧,大约几千字节,而且运行速度极快。这个灵活的结构可以使用户根据实际的需求,将系统配置为微小的嵌入式系统或者包括几百个处理器的超级虚拟机系统。

POSIX(Portable Operating SystemInterface)表示可移植操作系统接口。不过QNX目前的市场占有量不是很大,而且大家对它的熟悉程度也不够,而且QNX 对于GUI系统的支持不是很好。因而如果选用QNX系统的话,需要一个熟悉过程,而且对于GUI显示的驱动或者移植工作量会比较大。

1.5.3 Palm OS

3Com公司的Palm OS在PDA市场上占有很大的份额,它有开放的操作系统API 接口,开发商可以根据需要自行开发所需要的应用程序。目前大约有3 500个应

用程序可以在Palm上运行,这使得Palm的功能得以不断增多。这些软件包括计算器、各种游戏、电子宠物、GIS(地理信息)等。

1.5.4 Windows CE

Microsoft Windows CE是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统。它的模块化设计允许它对从PDA到专用的工业控制器用户的电子设备进行定制,操作系统的基本内核至少需要200KB。现在Microsoft 又推出了针对移动应用的Windows Mobile操作系统。Windows Mobile是微软进军移动设备领域的重大品牌调整,它包括Pocket PC、Smartphone 及Media Ce nters三大平台体系,面向个人移动电子消费市场。凭借微软在视窗领域内的垄断地位,Windows Mobile从一诞生起就占据了很多优势,众多的Windows开发者可以在熟悉的环境下进行各种应用的开发。Windows Mobile系列专题,将带你从最基本的工具安装、环境配置开始,进入移动应用开发的世界。

1.5.5 uClinux

uClinux开始于Linux 2.0的一个分支,它被设计用来应用于微控制领域。uCli nux最大的特征是没有MMU(内存管理单元模块)。它很适合那些没有MMU的处理器,如ARM7TDMI等。这种没有MMU的处理器在嵌入式领域中应用得相当普遍。同标准的Linux相比,由于uClinux上运行的绝大多数用户程序并不需要多任务。另外,针对uClinux内核的二进制代码和源代码都经过了重新编写,以紧缩和裁剪基本的代码。这就使得uClinux的内核同标准的Linux内核相比非常小,但是它仍能保持Linux操作系统常用的API,小于512KB的内核和相关的工具。操作系统所有的代码加起来小于900KB。

uClinux有完整的TCP/IP协议栈,同时对其他多种网络协议都提供支持,这些网络协议都在uClinux上得到了很好的实现。uClinux可以称为是一个针对嵌入式系统的优秀网络操作系统。uClinux所支持的文件系统很多,其中包括了最常用的NFS(网络文件系统)、ext2(第二扩展文件系统,它是Linux文件系统的标准)、MS-DOS及FAT16/32、Cramfs、jffs2、ramfs等。

1.5.6 Linux

Linux有很多的版本,下面介绍BlueCat Linux 和HardHat Linux。

1.BlueCat Linux

BlueCat Linux是LynuxlN'orks公司开发的专用于嵌入式实时领域的应用开发产品,支持以Linux和Windows作为主机的交叉开发环境。BlueCat的开发环境是一个完整的开发、调试及服务体系,为嵌入式实时应用程序的开发提供了品种繁多的开发工具和性能分析工具,例如,交叉编辑器gcc/g++,内核裁剪工具m kimage,调试工具如源代码级系统调试工具Total/gdb,内核调试工具SKdb,支持多种shell环境bash、ash、sash和多种Linux的编辑器。

BlueCat Linux提供了丰富的、支持许多种嵌入式处理器的板级支持包BSP,大大减少了产品投入市场的时间,其支持的处理器包括以下几种。

n Intel xScale Micro architecture。

n Network Processors and IA-32。

n MIPS。

n ARM 系列。

n PowerPC。

n x86系列。

2.HarHat Linux

HardHat Linux是MontaVista公司针对嵌入式设备量身定制的、实时的、专业的嵌入式设备操作系统。它针对嵌入式设备的处理器、存储器资源有限的特点,在不减少新内核对嵌入设备有利的、特性的基础上,对Linux内核进行高度裁减、配置。

HardHat Linux所配备的Cross Development Kit (CDK)为从事远程嵌入式设备上的系统开发、应用开发提供了良好的环境。CDK提供了一个可以应用于很大范围的主机——目标机(host-target)结构可普遍支持的开发环境。利用CDK,可以在主机上编辑、编译源程序,而把编译完成的程序放到目标机上运行。同时,在主机上进行跟踪和排错。这样,在编译和调试程序的时候就不再受到设备资源的限制,这将是以后开发的常用方法。

MontaVista将其下一代旗舰产品的名称HardHat Linux改为MontaVista Linux。MontaVista Linux 2.1已经可以广泛地支持各类嵌入式处理器体系结构、CPU

板卡及软件组件,包括6种业界领先体系结构的20款处理器:x86/IA-32、Pow erPC、StrongARM、XScale、 ARM、MIPS及SH等。现在TI公司的OMAP系列、达芬奇系列使用的Linux系统都是由MontaVista公司提供的商用版本。

1.5.7 uC/OS-II

源码开放(C代码)的免费嵌入式系统 uC/OS-II简单易学,提供了嵌入式系统的基本功能,其核心代码短小精悍,如果针对硬件进行优化,还可以获得更高的执行效率。当然,uC/OS-II相对于商用嵌入式系统来说还是过于简单,而且存在开发调试困难的问题。uC/OS-II的特点主要包括:公开源代码、可移植性很强(采用ANSI C编写)、可固化、可裁剪、占先式、多任务、系统服务、中断管理、稳定性与可靠性都很强。

uC/OS-II已经被移植到以下许多CPU上:ARM系列处理器、Intel公司的8051、80×86等系列、摩托罗拉公司的PowerPC、68K、68HC11等系列。uC/OS-II的移植相对于其他操作系统的移植要简单一些,uC/OS-II上通用的图形系统是Micr oWindow。

1.5.8 Nuclues

Nucleus操作系统是由Accelerated Technology Inc开发的。Nucleus PLUS 是为实时嵌入式应用而设计的一个抢先式多任务操作系统内核,其95%的代码是用ANSI C写成的,因此,非常便于移植并能够支持大多数类型的处理器。从实现角度来看,Nucleus PLUS是一组C函数库,应用程序代码与核心函数库连接在一起,生成一个目标代码,下载到目标板的RAM中或直接烧录到目标板的ROM

中执行。在典型的目标环境中,Nucleus PLUS 核心代码区一般不超过20KB。Nu cleus PLUS 采用了软件组件的方法,每个组件具有单一而明确的目的,通常由几个C及汇编语言模块构成,提供清晰的外部接口,对组件的引用就是通过这些接口完成的。除了少数一些特殊情况外,不允许从外部对组件内的全局进行访问。由于采用了软件组件的方法,Nucleus PLUS的各个组件都非常易于替换和复用。

Nucleus PLUS 的组件包括任务控制、内存管理、任务间通信、任务的同步与互斥、中断管理、定时器及I/O驱动等。

现在Nuclues也被移植到如x86、ARM系列、MIPS系列、PowerPC系列、ColdFi re、TI DSP、StrongARM、H8/300H、SH1/2/3、V8xx、Tricore、Mcore、Panaso nic MN10200、Tricore等处理器上,Nuclues对于GUI的支持不像Lnux、uC/OS -II那么方便。所以Nucleus大部分应用在不含图形系统的应用中。

除了上述国外知名的嵌入式操作系统外,国内也有不少自主开发的嵌入式操作系统如:Hopen OS、EEOS等。

Hopen OS是由凯思集团自主研制的实时操作系统,由一个很小的内核及一些可以根据需要定制的系统模块组成,核心Hopen Kernel一般为10KB左右,占空间小,具有多任务、多线程的系统特性。

EEOS是由中科院计算所组织开发的、开放源码的实时操作系统,支持p-Java,一方面小型化,一方面也可以重用Linux的驱动和其他模块。目前已经发展成一个较为完善、稳定、可靠的嵌入式操作系统平台了。

本书重点描述uClinux及Linux操作系统。

1.6 本章小结

这一章简单地介绍了嵌入式系统的定义、特点及应用,让读者对嵌入式系统有了一个比较粗略的了解。同时本章也系统地介绍了ARM处理器的体系结构,ARM处理器的特点及应用。还介绍了ARM处理器相关的基础知识,包括ARM处理器的几种工作模式、通用寄存器、专用寄存器、异常中断的处理方法,以及ARM体系结构中的存储单元等。概述了几种流行的嵌入式操作系统。读者通过这一章的介绍,能了解ARM处理器的基本体系结构。本章为用户针对自己的应用选择相应的处理器提供了一些依据。

本章从嵌入式系统、ARM处理器、嵌入式操作系统3方面进行了描述,是ARM系统开发基础知识的回顾。

从事基于ARM处理器的底层驱动开发,同样要求对硬件电路有一定的了解,而且在ARM处理器平台上进行底层开发和在其他平台上的底层开发一样,需要阅读比较多的有关ARM处

理器及外围芯片的数据手册。在ARM处理器平台上的底层驱动开发,通常会有两种方式,一种是脱离操作系统的裸机驱动设计方法,这与以前在8位机和16位机上的常用开发方式类同。还有一种就是基于操作系统的底层驱动设计方法。在基于ARM处理器的底层开发的过程中,如果实际设计的系统只是一个单任务系统,那么完全可以不使用操作系统,这个时候所进行的底层驱动程序设计就可以称为裸机底层驱动设计。其实即使是使用了操作系统,还是一样离不开裸机底层驱动设计,就如前面介绍的启动代码Boot Loader,在Boot Load er里面的设备驱动同样也是一种裸机驱动。

本章把重点放在了基于ARM处理器的底层驱动设计上。当然在介绍底层驱动设计之前先要介绍一下ARM处理器的汇编语言编程。

5.1 有关ARM的汇编语言编程

这里需要提到的是ARM处理器的汇编语言编程的一些内容,在嵌入式ARM系统的程序设计中往往离不开ARM汇编语言编程。正如大家所熟知的处理器初始化部分的代码通常都是用汇编来编写的,还有一些操作协处理器的代码,以及部分中断处理程序一样也是用汇编语言写成的。在开始介绍ARM处理器汇编语言编程之前建议读者先阅读一些有关ARM指令集的资料,主要是指ARM指令集、Thumb指令集及ARM宏汇编部分。有关ARM指令集和Thumb指令集这里就不做具体介绍,只从ARM汇编伪指令、模块化汇编语言程序设计、混合语言编程等几个方面对ARM 处理器汇编语言做一些简单介绍。

5.1.1 ARM汇编伪指令介绍

在ARM处理器汇编语言程序设计里,有一些特殊的指令助记符。这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作。

伪指令在源程序中的作用是为完成汇编程序做各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了。在ARM处理器的汇编程序中,大体有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令及其他伪指令。

伪操作符可以分为以下几类。

1)数据定义伪操作符

数据定义伪操作符主要包括LTORG、MAP、DCB、FIELD、SPACE、DCQ、DCW等,主要用于数据表定义、文字池定义、数据空间分配等。常用的有DCB/DCQ/DCW分配一段字节/双字/字内存单元,并且将它们初始化。

2)符号定义伪操作符

符号定义伪操作符包括GBLA、GBLL、GBLS、LCLA、CN、CP、DN、FN、RLIST、SE TA等,用于定义ARM汇编程序的变量,对变量进行赋值,以及定义寄存器名称等。其中用于全局变量声明的GBLA、GBLL、GBLS和局部变量声明的LCAL、LCLL、LCLS伪指令较为常用。

3)报告伪操作符

报告伪操作符包括ASSERT、INFO、OPT等,主要用于汇编报告等。其中比较常用的有ASSERT,表示断言错误。

4)条件汇编伪操作符

条件汇编伪操作符包括IF、ELSE、ENDIF、WHIL、WEND、MACRO、MEND等,主要用于条件汇编、宏定义、重复汇编控制等操作。

5)杂项伪操作符

杂项伪操作符包括AREA、ALIGN、ENTRY、EQU、EXPORT、GLOBAL、IMPORT、CODE 16、CODE32等。这些伪指令在汇编程序设计中较为常用,如段定义、入口点设置等伪指令。常用的伪指令主要有以下几条。

n AREA:用来定义段;

n ALIGN:用来设定边界对齐;

n CODE16/CODE32:用来指定指令集;

n ENTRY:指定程序入口;

n END:汇编结束。

有关这些伪指令的详细用法,可以参考ARM指令集参考手册。

5.1.2 模块化程序设计

尽管是汇编程序设计,也同样要求程序设计的模块化。先按模块独立汇编,然后再与应用的其他模块(有可能是汇编程序模块,也有可能是C程序模块)链接形成一个可执行的程序。在模块化程序设计中有几点是需要引起注意的,比如说全局符号的定义与引用、各个模块间符号的互相调用方法等。

1.全局符号

在基于ARM处理器的汇编程序中,模块中定义的、要被其他模块使用的符号(包括变量名和函数名)都必须被声明为全局符号。大体有两种。

(1)在本模块中定义,其他模块中被应用的,具体定义方法如下:

.global symbol

(2)在本模块中要使用其他模块中的全局符号,可以声明,具体方式如下:.extern symbol

在这种方式下也可以不用声明,在汇编时会自动被认为它是其他模块中的全局符号。

全局符号的定义就是为了方便在各个模块之间互相调用,全局符号增加了编程的灵活性,当然,要灵活地使用这些全局符号,在ARM嵌入式程序设计中自然也有一套规则来确保这些全局符号灵活调用。

2.模块间的符号互用

在ARM嵌入式程序设计中,这些符号不仅可以在汇编程序模块中调用,也可以在C程序模块中调用,模块间的符号互相调用主要有以下几种情况。

(1)汇编模块与汇编模块间的调用:只要是全局符号在汇编模块间就可以直接使用。

(2)汇编模块调用C语言模块中的函数:汇编模块调用C语言模块时,要注意不同芯片传递参数的方式有差别。

(3)汇编模块使用C语言模块中的变量:首先保证该变量在C语言中是全局变量,然后在汇编中直接使用变量名。要注意:C语言中的变量名在汇编中不用加下划线。另外该变量名不能用static修饰,否则该变量只局限于对所在的模块有效。