近年来,ARM嵌入式系列产品,如智能手机、车载MP4、车载导航仪和平板电脑等,已经成为大众广泛使用的产品。新型的嵌入式产品不断问世,各个IT公司纷纷投入巨资加紧研发流程,嵌入式技术人才需求猛增。
随着网络通信技术、计算机技术和微电子技术的迅速发展,嵌入式系统已经成为当前IT行业的焦点。同时在数字信息技术和网络技术高速发展的后PC时代,嵌入式系统因其体积小、可靠性高、功能强和灵活方便等许多优势,逐步渗透到工业、军事、医疗、汽车及日常生活的各个领域,在嵌入式相关行业技术改造、产品更新换代、加速自动化进程,以及提高产品效率等方面起到了极其重要的推动作用。
在汽车行业,各个零部件由纯机械产品向机电一体化、汽车电子智能化逐步转变。这些车载电子技术的应用改革,都离不开对ARM嵌入式系统的依赖,如汽车电子油门、电控发动机、车载IMMO系统、车载GPS导航、全景倒车雷达等。为了使车载ARM控制器具有资源管理、快速中断、实时响应等能力,提供多任务处理,以及更好地分配系统资源的功能,用户甚至还需要针对特定的ARM嵌入式硬件平台和实际的工程应用进行操作系统的移植。
ARM的英文全称是Advanced RISC Machine,用户既可以认为ARM是一个IT 行业公司的名称,也可以认为是一种“嵌入式微处理器核”技术的名称,甚至还可以认为是具有某种“嵌入式微处理器核”技术的一类芯片,以及嵌入式系统的总称。对于从事系统开发的嵌入式工程师而言,ARM通常是指带有ARM处理器的嵌入式系统。在本书所介绍的内容中,ARM是指搭载ARM处理器的嵌入式系统。
ARM公司是微处理器行业的一家知名企业,1990年11月成立于英国,是苹果电脑、Acorn电脑集团和VLSI Technology的合资企业。1991年,ARM公司推出了ARM6处理器家族,VLSI公司则是第一个将其成功应用在内部研发产品上的生产厂家。后来,陆续有其他IT巨头,包括TI公司、NEC公司、SHARP公司,以及ST公司等,都陆续获得了ARM公司的正式授权,将ARM处理器大面积地进行推广,使得ARM处理器在汽车电子、新能源汽车、车载网络、智能手机,以及其他消费电子中都得到广泛应用。一般情况下,目前有大约80%的电子消费终端都采用了ARM处理器,具体如图1.1所示。
当前ARM嵌入式芯片的出货量每年都较上一年增长20亿片以上。与其他半导体(微处理器)公司不同的是,ARM公司从来不制造或销售某一个具体型号的ARM嵌入式处理器芯片,而是将ARM嵌入式处理器的具体设计授权给相关的商务合作伙伴,如Intel公司、Philips公司、TI公司等。
各个授权合作公司根据自身对嵌入式芯片的设计能力、产品领域特点等因素对嵌入式芯片进行功能、资源性的裁剪,以满足嵌入式市场的需求。基于ARM嵌入式系统的低成本和高性能的解决方案,各个授权合作公司设计出多种多样的处理器芯片、微控制器,以及嵌入式片上系统(SOC),即所谓的“ARM知识产权授权”结构,如图1.2所示。
图1.1 ARM嵌入式在电子行业中的应用
图1.2 “ARM知识产权授权”结构图
一般而言,ARM嵌入式系统由3部分组成,即嵌入式系统硬件平台、嵌入式操作系统(代码)和嵌入式系统应用,如图1.3所示。
图1.3 嵌入式系统的组成
1)嵌入式系统硬件平台
嵌入式系统硬件平台主要是指各种嵌入式处理器和外围设备等,如基于ARM核的STM32XX处理器、51系列单片机等。
2)嵌入式操作系统(代码)
嵌入式操作系统是指在嵌入式硬件平台上运行的代码和操作系统。目前主流的嵌入式操作系统是基于C语言(或汇编语言,较少)的嵌入式Linux、μCLinux和μC/OS-II等。
一般而言,Linux操作系统具有比较完善的网络接口支持;μClinux操作系统常被用在一些不需要“内存管理单元”(MMU,Memory Management Unit)的嵌入式平台中;而μC/OS-II系统是典型的实时操作系统,可以满足对实时性要求比较高的场合,如汽车电子油门、车载高速CAN网络等,具有非常快的响应时间。
除了上述介绍的几种嵌入式操作系统外,在当前主流的消费电子产品中,还广泛使用Android、Meego等系统。这些嵌入式系统主要用在智能手机及平板电脑上。在实际的工程应用中,用户具体使用何种嵌入式操作系统应视具体的工程需求而定。
3)嵌入式系统应用
嵌入式系统应用是以嵌入式系统硬件平台的搭建、嵌入式操作系统的成功移植和运行为前提的。这一部分内容运行在嵌入式操作系统的上层,完成特定的功能目标。
通常情况下,不同的系统需要根据具体的项目需求设计不同的嵌入式应用程序。但是值得注意的是,在嵌入式系统中,系统应用并不是必需的。只有在一些复杂的工程设计中才会需要嵌入式系统应用,如对汽车整车通信协议的定义和控制等。
在一些要求不高或者相对简单的工程应用场合,嵌入式系统应用经常被合并到操作系统及其代码的实现过程中,即操作系统与应用代码由于相对简单而被糅合在一起。
截止2010年,内嵌ARM核的嵌入式系统产品累计已经超过200亿个。在日常生活中用户所接触到的智能手机、汽车电子、平板电脑等众多的消费电子产品中无不存在ARM嵌入式处理器的身影。从诞生到现今短短的时间内,ARM嵌入式系统之所以能取得如此巨大的成就,跟它自身优越的性能是密不可分的。
1.极低的系统功耗
ARM嵌入式系统相比其他处理器而言具有极低的系统功耗,这就使得它能广泛地被应用于手持式电子设备的设计场合。目前,ARM微处理器和内嵌ARM核的SOC芯片已经在手持终端,如智能手机、车载MP4、电动汽车的电池管理系统等设备中得到广泛应用。图1.4为具有自主研发产权的新能源电动汽车动力锂电池管理系统。
图1.4 新能源电动汽车动力锂电池管理系统
2.较短的开发周期
ARM嵌入式系统的开发周期完全是由ARM的商业模式决定的。ARM公司将成熟的ARM技术直接授权给其他合作芯片设计厂商,在很大程度上缩短了ARM嵌入式产品的开发周期。而这对于芯片设计厂商而言也是一个巨大的优势。
3.支持双指令集
绝大部分ARM处理器都可以支持ARM和Thumb两种不同的工作模式,分别用以支持32位的ARM指令集和16位的Thumb指令集。对于普通用户而言,这两种指令集都各有所长。
32位的ARM指令集在命令功能上相对更为丰富,性能也更好。在运行代码的过程中,实现同样的功能所需要的指令数(代码量)更少;而16位的Thumb指令集是ARM指令集的一个子集,因此,在实现相同的功能操作时需要较多的指令数(相比ARM指令集),但是使用Thumb指令集实现的程序代码所占据的程序空间相对较少,具有较高的代码执行效率。除此之外,由于16位的Thumb指令代码在译码的过程中相对比较简单,因此Thumb指令具有更低的系统功耗。
4.高效的系统总线
在ARM嵌入式系统中,处理器没有采用DSP(数字信号处理器)架构中的多级流水线机制,而是采用了一组专门针对ARM内核的片上系统SOC开发的总线规范,即AMBA总线(Advanced Microcontroller Bus Architecture)。
该总线规范由ARM公司设计,独立于ARM微处理器的制造工艺技术。在该总线规范中,定义了以下3种可供用户组合使用的不同类型的总线。
1)AHB(Advanced High-Performance Bus)
该类型的总线支持多种数据传输方式,以及多个总线主设备之间的数据传输。适用于高性能和高时钟频率的系统模块,如CPU处理器、片上存储器、DMA设备、DSP,以及其他协同处理器等。
2)ASB(Advanced System Bus)
该类型的总线同样也适用于高性能的系统模块。在不需要使用AHB的场合,用户也可以选择ASB作为系统总线。
3)APB(Advanced Peripheral Bus)
该类型的总线的主要特点是结构简单,低速,极低的功耗。该总线主要适用于低功耗,对实时性要求不高的外部设备,如对汽车门窗锁的控制等。
与传统的单片机相比,ARM嵌入式系统的整体系统性能和数据处理能力有了大幅提升。与之相应的,ARM嵌入式系统设计的复杂度和难度也有所提升,与传统的单片机设计方法也有着很大不同。
总体而言,ARM嵌入式系统的开发可以分为“基于ARM内核的芯片设计”和“基于ARMSOC的开发应用”。本书主要与读者讨论有关“ARM芯片的开发应用”,不涉及ARM芯片的设计。
对于用户而言,在实现对ARM嵌入式系统进行开发之前,首先应该对ARM嵌入式系统的概念和基本结构做一些了解,然后还需要熟悉ARM嵌入式指令集。虽然现在绝大部分嵌入式系统都使用C语言开发程序,但是绝大部分芯片的初始化启动程序仍然是使用汇编语言写的,以得到较高的代码执行效率和开机速度。因此,用户在熟练掌握C语言的基础上,了解一定的汇编语言知识也是必要的。除此之外,用户还需要结合所使用的ARM处理器芯片,掌握某一个集成开发环境的使用方法,务必做到熟练使用。
1.明确ARM嵌入式系统开发的过程
不同于通用计算机平台上应用软件的开发,在ARM嵌入式系统程序的开发过程中具有很多特点和不确定性,其中最重要的一点就是嵌入式软件代码和系统硬件的独立性。
由于嵌入式系统的层次结构和自身的灵活性、多样性,各个层次之间缺乏统一的接口标准,甚至每个嵌入式系统都各不一样。这样就给上层的嵌入式软件设计人员在嵌入式软件代码设计的过程中带来比较大的困难。软件设计人员必须建立在对底层硬件设计充分了解的基础上,才能设计出符合ARM嵌入式系统要求的应用层代码。
为了简化开发流程,提高开发效率,用户可以在应用与驱动(API)接口上设计一些相对统一的接口函数,就可以在一定程度上规范应用层嵌入式软件设计的标准,同时方便应用程序在跨平台之间的复用和移植。
2.熟悉开发工具环境里的库函数
对于ARM开发工具环境里所提供的库函数,用户需要对其功能、参数、结构、调用函数等有比较清楚的了解,其中最重要的3方面如下。
(1)考虑硬件对库函数的支持。
(2)符合目标系统上的存储器资源分布。
(3)应用程序运行环境的初始化。
举例来说,在嵌入式代码设计过程中,有一类动态内存管理函数,如malloc()等,其本身是独立于目标系统而运行的,但是它所使用的存储器空间需要根据具体的目标来确定,所以malloc()函数本身并不需要移植或裁剪,这也是一个特例。但那些设置动态内存区(地址和空间)的函数则是和目标系统的存储器分布直接相关的,需要进行移植。
需要补充说明的是,在ARM嵌入式系统开发过程中,库函数的使用并不是必需的。用户同样可以自行组织编写程序代码,用于实现与库函数一样的功能。相比自行编写代码而言,系统提供的库函数具有更好的稳定性和可移植性。
在本书后续章节中所编写的工程代码中,几乎都采用了STM32XX系列ARM处理器开发平台(Keil for ARM)所提供的库函数文件。
3.熟悉ARM嵌入式系统的调试操作
嵌入式系统不可避免地会涉及对输入/输出设备的操作,例如,文件操作函数需要访问磁盘IO,打印机函数需要访问字符输出设备等。在嵌入式调试环境下,所有的标准C库函数都是有效且有其默认行为的。一般情况下,部分目标系统硬件所不能支持的操作用户可以通过相应的调试工具来完成。
但是最终嵌入式系统的运行是需要完全脱离调试工具独立运行的,所以在程序移植的过程中,用户需要对这些库函数的运行机制有比较清楚的了解。特别是在系统出现故障甚至逻辑错误的时候,需要用户能够以最短的时间来排查、解决问题。
STM32F103XX系列处理器是一个低功耗的ARM嵌入式芯片,具有逻辑门数少,终端延迟程度小,方便调试等特点。该ARM芯片主要是为需求较低,功耗和价格敏感的应用领域而专门设计的,具有较高的系统性能和数据处理能力,应用范围涉及从低端微控制器到复杂的片上操作系统,被广泛使用在汽车电子、智能手机、娱乐网络消费终端等领域。
STM32F103XX系列处理器使用了ARM V7-M体系结构,是一个可综合的、高度可配置的ARM嵌入式芯片。它内部采用了高效的哈佛存储结构,并且可提供1.25DMIPS/MHz的处理能力。尽管STM32F103XX系列处理器的处理能力相比其他处理器而言具有较大的提升,但其自身却具有极低的系统功耗,在一个具有32个物理中断的标准处理器上达到了突出的0.06mW/MHz的能效比。
为了降低器件的成本,STM32F103XX系列处理器采用了与系统部件紧耦合的实现方法,以缩小芯片的物理面积,特别是其内核面积比原有的ARM处理器芯片缩小了30%。除此之外,STM32F103XX系列处理器还实现了Thumb-2指令集架构,具有很高的代码密度,可降低系统对存储器的要求,并能达到几乎接近32位ARM指令集的性能。
针对嵌入式系统的开发,STM32F103XX系列处理器相比其他芯片具有以下优势:
● 较小的处理器内核、系统和存储器,大幅降低了处理器芯片的成本;
● 提供高效的电源管理机制,具有极低的系统功耗;
● 较强的处理器性能,基本满足所有工业级产品的应用需求;
● 极低的中断处理时间,完全满足高速、临界控制的应用场合;
● 可供选择的存储器保护单元(MPU)为嵌入式系统提供平台级的安全性;
● 对汇编代码基本不作任何要求,简化系统开发进程;
● 宽广的工程应用范围,适用于从超低成本的微控制器到高性能的片上系统。
由于系统具有极低的功耗,并且集成了丰富的片上系统资源,以及稳定的工作性能,绝大部分汽车生产厂商在生产汽车电子设备的过程中都选择了STM32F103XX系列处理器,如图1.5所示,小到汽车零部件信号的检测,如汽车电子仪表盘、轮胎压力检测仪等,大到整车控制系统,如汽车车载低速CAN网络、新能源汽车电池管理系统等,都采用了具有丰富系统片上资源的STM32F103XX系列处理器。
图1.5 STM32F103XX系列处理器在汽车电子中的应用