嵌入式软件开发是一个交叉开发过程,我们可以在特定的 EDA 工具环境下面进行开发, 使用开发板进行二次开发,这样缩短了开发周期,提高了产品的可靠性,降低了开发难度。
我们把脱离于硬件的嵌入式软件开发阶段称之为“PC 软件”的开发。在“PC 软件”开发阶段,可以用软件仿真,即指令集模拟的方法 来对用户程序进行验证。在 ARM 公司的开发工具中,ADS内嵌的 ARMulator和 RealView 开发工具中的ISS都提供了这项功能。在模拟环境下,用户可以设置 ARM 处理器的型号、时钟频率等,同时还可以配置存储器访问接口的时序参数。程序在模拟环境下运行,不但能够进行程序的运行流程和逻辑测试,还能够统计系统运行的时钟周期数、存储器访问周期数、处理器运行时的流水线状态(有效周期、等待周期、连续和非连续访问周期)等信息。这些宝贵的信息是在硬件调试阶段无法取得的,对于程序的性能评估非常有价值。为了更加完整和真实地模拟一个目标系统,ARMulator和ISS还提供了一个开放的 API编程环境。用户可以用标准C 来描述各种各样的硬件模块,连同工具提供的内核模块一起,组成一个完整的“软”硬件环境。在这个环境下面开发的软件,可以更大程度地接近最终的目标。利用这种先进的 EDA工具环境,极大地方便了程序开发人员进行嵌入式开发的工作。完成一个“PC 软件”的开发 之后,只要进行正确的移植,一个真正的嵌入式软件就开发成功了。随着嵌入式相关技术的迅速发展,嵌入式系统的功能越来越强大,应用接口更加丰富;根据实际应用的需要设计出特定的嵌入式最小系统和应用系统,是嵌入式系统设计的关键。
一、嵌入式最小系统的硬件模块
1.最小硬件模块
嵌入式最小系统即是在尽可能减少上层应用的情况下能够使系统运行的最小化模块配 置。对于一个典型的嵌入式最小系统都是以处理器为核心的电路,以 S3C2410芯片为例,其 构成模块及其各部分功能如图所示,其中,ARM 微处理器、Flash和 SDRAM 模块是嵌 入式最小系统的核心部分。
电源模块:为系统正常工作提供电源。
时钟模块:通常经 ARM 内部锁相环进行相应的倍频,以提供系统各模块运行所需的时钟频率输入。
复位模块:实现对系统的复位。
JTAG 模块:实现对程序代码的下载和调试。
Flash存储模块:存放启动代码、操作系统和用户应用程序代码。
SDRAM 模块:为系统运行提供动态存储空间,是系统代码运行的主要区域。
UART 模块:实现对调试信息的终端显示。
2.存储器接口
ARM 处理器与存储器(Flash和 SDRAM)的接口技术是嵌入式最小系统硬件设计的关键。嵌入式系统中常用的存储器有 NorFlash、NandFlash和SDRAM。
(1) ARM 处理器与 NorFlash接口技术
NorFlash带有SRAM 接口,有足够的地址引脚,可以很容易地对存储器内部的存储单元 进行直接寻址。
双 Flash独立片选:该方式是把两个 NorFlash芯片各自作为一个独立的单元进行处理。 根据不同的应用需要,可以在一块 Flash中存放启动代码,而在另一块 Flash中建立文件系 统,存放应用代码。该方式操作方便,易于管理。
双 Flash统一片选:该方式是把两个 NorFlash芯片合为一个单元进行处理,ARM 处理 器将它们作为一个并行的处理单元来访问,如将两个8bit的 NorFlash芯片ST39VF1601用 作一个16bit单元来进行处理。对于 N(N>2)块 Flash的连接方式可以此作为参考。
(2) ARM 处理器与 NandFlash接口
NandFlash接口信号比较少,地址、数据和命令总线复用。NandFlash的接口本质上是 一个I/O 接口,系统对 NandFlash进行数据访问的时候,需要先向 NandFlash发出相关命令 和参数,然后再进行相应的数据操作。ARM 处理器与 NandFlash的连接主要有3种方式:
a.运用 GPIO 引脚方式去控制 NandFlash的各个信号,在速度要求相对较低的时候,能够 较充分地发挥 Nand设备的性能
b.运用逻辑运算方式进行连接:在该方式下,处理器的读和写使能信号通过与片选信号 逻 辑 运 算 后 去 驱 动 Nand 设 备 对 应 的 读 和 写 信 号。
c.直接芯片使能:有些 ARM 处理器(如 S3C2410)内部提供对 Nand设备的相应控制寄存 器,通过控制寄存器可以实现 ARM 处理器对 Nand设备相应信号的驱动。
嵌入式最小系统的动态存储器模块一般采用SDRAM。现在的大多数 ARM 处理器内部 都集成有SDRAM 控制器,通过它可以很容易地访问SDRAM 内部的每一个字节。在实际开 发中可以根据需要选用一片或多片SDRAM。
二、嵌入式系统的启动架构
启动架构是嵌入式系统的关键技术,掌握启动架构对于了解嵌入式系统的运行原理有着重要的意义。嵌入式系统在启动时,引导代码、操作系统的运行和应用程序的加载主要有两种架构,一种是直接从 NorFlash启动的架构,另一种是从 NandFlash启动的架构。
1.从 NorFlash启动
NorFlash具有芯片内执行(XIP,eXecuteInPlace)的特点,在嵌入式系统中常作为存放 启动代码的首选。从 NorFlash启动的架构又可细分为只使用 NorFlash的启动架构、Nor Flash与 NandFlash配合使用的启动架构。下图给出了这两种启动架构的原理框图。
单独使用 NorFlash:在该架构中,引导代码、操作系统和应用代码共存于同一块 Nor Flash中。系统上电后,引导代码首先在 NorFlash中执行,然后把操作系统和应用代码加载到速度更高的SDRAM 中运行。另一种可行的架构是在 NorFlash中执行引导代码和操作系 统,而只将应用代码加载到SDRAM 中执行。该架构充分利用了 NorFlash芯片内执行的特点,可有效提升系统性能;不足在于随着操作系统和应用代码容量的增加,需要更大容量昂贵的 NorFlash来支撑。
NorFlash和 NandFlash配合使用:在该架构中附加了一块 NandFlash,NorFlash中存放启动代码和操作系统(操作系统可以根据代码量的大小选择存放于 NorFlash或 NandFlash),而 NandFlash中存放应用代码,根据存放的应用代码量的大小可以对 NandFlash容量做出相应的改变。系统上电后,引导代码直接在 NorFlash中执行,把 NandFlash中的操作系统和应用代码加载到速度更高的SDRAM 中执行。也可以在 NorFlash中执行引导代码和操作系统,而只将 Nand Flash中的应用代码加载到SDRAM 中执行。该架构是当前嵌入式系统中运用最广泛的启动架构之一。
2.从 NandFlash启动
有些处理器(如SAMSUNG 公司的 ARM920T 系列处理器S3C2410)支持从 NandFlash 启动的模式,它的工作原理是将 NandFlash中存储的前4KB 代码装入一个称为 Stepping stone(BootSRAM)的地址中,然后开始执行该段引导代码,从而完成对操作系统和应用程序 的加载。该方式需要处理器内部有 Nand控制器,同时还要提供一定大小额外的 SRAM 空 间,有一定的使用局限性,在实际开发中较少使用。