嵌入式系统启动分析论文

2024-06-12

嵌入式系统启动分析论文(共7篇)

嵌入式系统启动分析论文 篇1

嵌入式系统与传统的微机系统比较, 嵌入式系统在启动时没有自举程序, 需要由BOOTLOAER程序进行初始化和引导操作系统, 因为系统外部硬件的不同, 软件配置也要发生相应的变化, 所以启动的软件需要自行编写。

1 启动方式的选择及其启动流程

ARM芯片的启动过程由BMS来决定它的方式, 即内部启动或是外部启动, 如果BMS=1时为内部启动, 如果BMS=0时为外部器件 (与NCS0相连的器件) 来启动, 启动结束后BMS就成了I/O接口。

1.1 内部引导

首先来看内部引导, 当BMS=1时芯片内部ROM中的BOOT-LOAER程序就开始执行, 开始初始化硬件和操作系统镜像的引导, 并把该镜像下载到SRAM中执, 初始化完毕后RAM地址与ROM地址被设置成系统默认值, 此时PC指针从零开始, 而系统的控制则由操作系统的镜像来实施。

1.2 外部引导

如果系统上电后BMS=0, 则系统江外部的存储设备影射到内部, 当作内部存储设备来使用, 当然这时还是需要BOOTLOADER来引导, 其具体分为如下几个过程。

1.2.1 建立中断矢量表

在系统BOOTLOADER引导后, 系统的中断向量被重新映射, 地址为0x1000000, 在中断矢量表中存储的往往是实际处理程序的地址, 这样就没有容量大小的限制具体的中断矢量表如下:

BInitreset;复位

Undefvec

Bundefvec;未定义

1.2.2 初级初始化

在矢量表中经常使用的地址0的复位向量, 在此用指令使其转向引导程序, 同样在使能中断时也要进行初始化。

1.2.3 地址重映射 (remap)

中断矢量在RAM中被重新映射, 它的映射有效地址如何确定是要解决的首要问题, 我们可以在它里面建立一个向量表, 通过查表来确定, 并采用相对寻址的方式, 例程如下:

在系统引导完毕后, RAM地址为0X00300000, 当重映射时地址就会被改变, 目的是为中断提供地址, 但是问题是PC指针如何进行修改, 使程序能正确的运行, 这就需要软件来实现程序的跳转, 以下是实现重映射过程的PC指令修改实例:

此段程序执行过程如下首先将重映射地址保存在r12中, 接下来保存其他寄存器, 与此同时保存在r12的地址标号要重新给pc指针, 当执行到第四行后, 程序重新从新地址开始执行, 在程序存储器中继续运行, 防止了程序中断下来, 重映射后的地址分配如图1

2 结束语

本文介绍了在嵌入式系统中ARM芯片的上电启动过程, 希望对嵌入式系统的启动代码编写人员能有所帮助。

摘要:ARM的启动过程既可以从内部自带的程序启动, 也可以通过片外芯片启动来实现处理器的初始化, 本文详细的分析了ARM处理器的嵌入式系统的上电启动。

关键词:初始化,BOOTLOADER,嵌入式系统

参考文献

[1]周立功等.ARM处理器基础与实战[M].北京:北京航空航天大学出版社, 2003.

[2]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社, 2003.

[3]张建义.ARM9启动机制分析[J].浙江理工大学学报, 2007.

嵌入式系统启动分析论文 篇2

摘要:基于嵌入式系统的概念,阐述嵌入式系统的关键技术、嵌入式开发以及广泛的应用。首先,分析嵌入式系统的技术特点,分别从嵌入式处理器和嵌入式操作系统两方面介绍,着重说明它不同于其它操作系统的一些处理方法和过程;在此基础上阐述嵌入式软件的开发过程,并结合作者嵌入式软件开发的实践,着重阐述嵌入式软件的一些开发技巧。接着,介绍目前嵌入式系统一些流行的应用,以及南京东大移动互联技术有限公司自行研制的基于蓝牙技术的嵌入式产品。最后,给出作者的体会,展望嵌入式系统的前景。

关键词:嵌入式系统 嵌入式处理器 微内核 内存管理单元 蓝牙系统

引 言

在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术以及人们的日常生活等方方面面中。随着国内外各种嵌入式产品的进一步开发和推广,嵌入式技术越来越和人们的生活紧密结合。

1970年左右出现了嵌入式系统的概念,此时的嵌入式系统很多都不采用操作系统,它们只是为了实现某个控制功能,使用一个简单的循环控制对外界的控制请求进行处理。当应用系统越来越复杂、利用的范围越来越广泛的时候,每添加一项新的功能,都可能需要从头开始设计。没有操作系统已成为一个最大的缺点了。

C语言的出现使操作系统开发变得简单。从上世纪80年代开始,出现了各种各样的商用嵌入式操作系统百家争鸣的局面,比较著名的有VxWorks、pSOS和Windows CE等等,这些操作系统大部分是为专有系统而开发的。另外,源代码开放的嵌入式Linux,由于其强大的网络功能和低成本,近来也得到了越来越多的应用。

1 嵌入式系统的技术特点

嵌入式系统通常包括构成软件的基本运行环境的硬件和操作系统两部分。嵌入式系统的运行环境和应用场合决定了嵌入式系统具有区别于其它操作系统的一些特点。

(1)嵌入式处理器

嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP(Digital Signal Processor)。嵌入式微处理器就是和通用计算机的微处理器对应的CPU。在应用中,一般是将微处理器装配在专门设计的电路板上,在母板上只保留和嵌入式相关的功能即可,这样可以满足嵌入式系统体积小和功耗低的要求。目前的嵌入式处理器主要包括:PowerPC、Motorola 68000、ARM系列等等。

嵌入式微控制器又称为单片机,它将CPU、存储器(少量的RAM、ROM或两者都有)和其它外设封装在同一片集成电路里。常见的有8051。

嵌入式DSP专门用来对离散时间信号进行极快的处理计算,提高编译效率和执行速度。在数字滤波、FFT、谱分析、图像处理的分析等领域,DSP正在大量进入嵌入式市场。

(2)微内核结构

大多数操作系统至少被划分为内核层和应用层两个层次。内核只提供基本的功能,如建立和管理进程、提供文件系统、管理设备等,这些功能以系统调用方式提供给用户。一些桌面操作系统,如Windows、Linux等,将许多功能引入内核,操作系统的内核变得越来越大。内核变大使得占用的资源增多,剪裁起来很麻烦。

大多数嵌入式操作系统采用了微内核结构,内核只提供基本的功能,比如:任务的调度、任务之间的通信与同步、内存管理、时钟管理等。其它的应用组件,比如网络功能、文件系统、GUI系统等均工作在用户态,以系统进程或函数调用的方式工作。因而系统都是可裁减的,用户可以根据自己的需要选用相应的组件。

(3)任务调度

在嵌入式系统中,任务即线程。大多数的嵌入式操作系统支持多任务。多任务运行的实现实际是靠CPU在多个任务之间切换、调度。每个任务都有其优先级,不同的任务优先级可能相同也可能不同。任务的调度有三种方式:可抢占式调度、不可抢占式调度和时间片轮转调度。不可抢占式调度是指,一个任务一旦获得CPU就独占CPU运行,除非由于某种原因,它决定放弃CPU的使用权;可抢占式调度是基于任务优先级的,当前正在运行的任务可以随时让位给优先级更高的处于就绪态的其它任务;当两个或两个以上任务有同样的优先级,不同任务轮转地使用CPU,直到系统分配的CPU时间片用完,这就是时间片轮转调度。

目前,大多数嵌入式操作系统对不同优先级的任务采用基于优先级的抢占式调度法,对相同优先级的任务则采用时间片轮转调度法。

(4)硬实时和软实时

有些嵌入式系统对时间的要求较高,称之为实时系统。有两种类型的实时系统:硬实时系统和软实时系统。软实时系统并不要求限定某一任务必须在一定的时间内完成,只要求各任务运行得越快越好;硬实时系统对系统响应时间有严格要求,一旦系统响应时间不能满足,就可能会引起系统崩溃或致命的错误,一般在工业控制中应用较多。

(5)内存管理

针对有内存管理单元(MMU)的处理器设计的一些桌面操作系统,如Windows、Linux,使用了虚拟存储器的概念。虚拟内存地址被送到MMU。在这里,虚拟地址被映射为物理地址,实际存储器被分割为相同大小的页面,采用分页的方式载入进程。一个程序在运行之前,没有必要全部装入内存,而是仅将那些当前要运行的部分页面装入内存运行。

大多数嵌入式系统针对没有MMU的处理器设计,不能使用处理器的虚拟内存管理技术,采用的是实存储器管理策略。因而对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址;而且,大多数嵌入式操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载入主存储器的连续空间。

由此可见,嵌入式系统的开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存;在开发应用程序时,必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外,由

于采用实存储器管理策略,用户程序同内核以及其它用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运行异常;因而,嵌入式系统的开发人员对软件中的一些内存操作要格外小心。

(6)内核加载方式

嵌入式操作系统内核可以在Flash上直接运行,也可以加载到内存中运行。Flash的运行方式,是把内核的可执行映像烧写到Flash上,系统启动时从Flash的某个地址开始执行。这种方法实际上是很多嵌入式系统所采用的方法。内核加载方式是把内核的压缩文件存放在Flash上,系统启动时读取压缩文件在内存里解压,然后开始执行。这种方式相对复杂一些,但是运行速度可能更快,因为RAM的存取速率要比Flash高。

由于嵌入式系统的内存管理机制,嵌入式操作系统对用户程序采用静态链接的形式。在嵌入式系统中,应用程序和操作系统内核代码编译、链接生成一个二进制影像文件来运行。

2 嵌入式系统开发相关技术

相对于在Windows环境下的开发应用程序,嵌入式系统开发有着很多的不同。不同的硬件平台和操作系统带来了许多附加的开发复杂性。

2.1 嵌入式开发过程

在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接、定址过程的计算机;目标机指运行嵌入式软件的硬件平台。首先须把应用程序转换成可以在目标机上运行的二进制代码。这一过程包含三个步骤:编译、链接、定址。编译过程由交叉编译器实现。所谓交叉编译器就是运行在一个计算机平台上并为另一个平台产生代码的编译器。常用的交叉编译器有GNU C/C++(gcc)。编译过程产生的所有目标文件被链接成一个目标文件,称为链接过程。定址过程会把物理存储器地址指定给目标文件的每个相对偏移处。该过程生成的文件就是可以在嵌入式平台上执行的二进制文件。

嵌入式开发过程中另一个重要的步骤是调试目标机上的应用程序。嵌入式调试采用交叉调试器,一般采用宿主机-目标机的调试方式,它们之间由串行口线或以太网或BDM线相连。交叉调试有任务级、源码级和汇编级的调试,调试时需将宿主机上的应用程序和操作系统内核下载到目标机的RAM中或直接烧录到目标机的ROM中。目标监控器是调试器对目标机上运行的应用程序进行控制的代理(Debugger Agent),事先被固化在目标机的Flash、ROM中,在目标机上电后自动启动,并等待宿主机方调试器发来的命令,配合调试器完成应用程序的下载、运行和基本的调试功能,将调试信息返回给宿主机。

2.2 向嵌入式平台移植软件

大部分嵌入式开发人员选用的软件开发模式是先在PC机上编写软件,再进行软件的移植工作。在PC机上编写软件时,要注意软件的可移植性,选用具有较高移植性的编程语言(如C语言),尽量少调用操作系统函数,注意屏蔽不同硬件平台带来的字节顺序、字节对齐等问题。以下是我们在移植协议栈过程中的一些体会。

2.2.1 字节顺序

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。

2.2.2 字节对齐

有的嵌入式处理器的寻址方式决定了在内存中占2字节的.int16、uint16等类型数据只能存放在偶数内存地址处,占4字节的int32 、uint32 等类型数据只能存放在4的整数倍的内存地址处;占8字节的类型数据只能存放在8的整数倍的内存地址处;而在内存中只占1字节的类型数据可以存放在任意地址处。由于这些限制,在这些平台上编程时有很大的不同。首先,结构体成员之间会有空洞,比如这样一个结构:

typedef struct test{

char a;

uint16 b;

}TEST

结构TEST在单字节对齐的平台上占内存三个字节,而在以上所述的嵌入式平台上有可能占三个或四个字节,视成员a的存储地址而定。当a存储地址为偶数时,该结构占四个字节,在a与b之间存在一个字节的空洞。对于通信双方都是对结构成员操作的,这种情况不会出错,但如果有一方是逐字节读取内容的(通信协议大都如此),就会错误地读到其它字节的内容。其次,若对内存中数据以强制类型转换的方式读取,字节对齐的不同会引起数据读取的错误。因为假如指针指在基数内存地址处,我们想取得占内存两个字节的数据存放在uint16型的变量中,强制类型转换的结果是取得了该指针所指地址与前一地址处的数据,并没有按照我们的愿望取该指针所指地址与后一地址处的数据,这样就导致了数据读取的错误。

解决字节对齐有许多方法,比如可以在GCC的项目管理文件MakeFile中增加编译选项--pack-struct;但这种方法只能去除结构中的空洞,并不能解决强制类型转换引起的错误。为了增强软件的可移植性以及和同类其它平台产品的互通性,我们在收数据包处增加了拆包的函数,发数据包处增加了组包的函数。这两个函数解决了字节序的问题,也解决了字节对齐的问题。即组包时根据参数中的格式字符串将内存中的不同数据类型的某段数据放在指定地址处,组成包发给下层;拆包时,根据参数中的格式字符串将收到的内存中的数据存放在不同类型的变量或结构成员中。在函数中针对不同的数据类型作不同的处理。

2.2.3 位 段

由于位段的空间分配方向因硬件平台的不同而不同,对X86平台,位段是从右向左分配的;而一些嵌入式平台,位段是从左向右分配的。分配顺序的不同导致了数据存取的错误。解决这一问题的一种方法是采用条件编译的方式,针对

不同的平台定义顺序不同的位段;也可以在前面所述的两个函数中加上对位段的处理。

2.2.4 代码优化

嵌入式系统对应用软件的质量要求更高,因而在嵌入式开发中尤其须注意对代码进行优化,尽可能地提高代码的效率,减少代码的大小。虽然现代C和C++编译器都提供了一定程度的代码优化,但大部分由编译器执行的优化技术仅涉及执行速度和代码大小的平衡,不可能使程序既快又小,因而必须在编写嵌入式软件时采取必要的措施。

(1)提高代码的效率

①switch-case 语句。在程序中经常会使用switch-case语句,每一个由机器语言实现的测试和跳转仅仅是为了决定下一步要做什么,就浪费了处理器时间。为了提高速度,可以把具体的情况按照它们发生的相对频率排序。即把最可能发生的情况放在第一,最不可能发生的情况放在最后,这样会减少平均的代码执行时间。

② 全局变量。使用全局变量比向函数传递参数更加有效率,这样做去除了函数调用前参数入栈和函数完成后参数出栈的需要。当然,使用全局变量会对程序有一些负作用。

(2)减小代码的大小

嵌入式系统编程应避免使用标准库例程,因为很多大的库例程设法处理所有可能的情况,所以占用了庞大的内存空间,因而应尽可能地减少使用标准库例程。

(3)避免内存泄漏

用户内存空间(堆)为RAM中全局数据和任务堆栈空间都分配后的剩余空间,为了使程序能有足够的内存运行,必须在申请的内存不用后及时地将其释放,以确保再次申请时能有空间。如果程序中存在内存泄漏(即申请内存后没有及时释放)的情况,程序最终会因为没有足够的内存空间而无法运行。

3 嵌入式系统的广泛应用

嵌入式系统的应用前景是非常广泛的,人们将会无时无处不接触到嵌入式产品,从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等等。特别是以蓝牙为代表的小范围无线接入协议的出现,使嵌入式无线电的概念悄然兴起。当嵌入式的无线电芯片的价格可被接受时,它的应用可能会无所不在。在家中、办公室、公共场所,人们可能会使用数十片甚至更多这样的嵌入式无线电芯片,将一些电子信息设备甚至电气设备构成无线网络;在车上、旅途中,人们利用这样的嵌入式无线电芯片可以实现远程办公、远程遥控,真正实现把网络随身携带。下面介绍几种具体的应用。

(1)嵌入式移动数据库

所谓的移动数据库是支持移动计算的数据库,有两层含义:① 用户在移动的过程中可以联机访问数据库资源。② 用户可以带着数据库移动。典型的应用场合有在开着的救护车上查询最近的医院。该系统由前台移动终端、后台同步服务器组成,移动终端上有嵌入式实时操作系统和嵌入式数据库。中国人民大学正在开发该系统,他们和Hopen公司合作,开发了前台移动终端“小精灵”。

(2)嵌入式系统在智能家居网络中的应用

智能家居网络(E-Home)指在一个家居中建立一个通信网络,为家庭信息提供必要的通路;在家庭网络操作系统的控制下,通过相应的硬件和执行机构,实现对所有家庭网络上家电和设备的控制和监测。其网络结构的组成必然有家庭网关。家庭网关主要实现控制网络和信息网络的信号综合并与外界接口,以便作远程控制和信息交换。不论是网关还是各家电上的控制模块,都需有嵌入式操作系统。这些操作系统必须具有内嵌式、实时性好、多用户的特点。南京东大移动互联技术有限公司研制的智能多媒体家庭网关,就是以嵌入式Linux作为该嵌入式设备的操作系统,设备之间的相互通信遵从蓝牙通信协议,可以支持多个设备同时接入到固定电话网、国际互联网等其它外部网络。

(3)嵌入式语音芯片

嵌入式语音芯片基于嵌入式操作系统,采用语音识别和语音合成、语音学层次结构体系和文本处理模型等技术;可以应用在手持设备、智能家电等多个领域,赋予这些设备人性化的交互方式和便利的使用方法;也可应用于玩具中,实现声控玩具、仿真宠物、与人对话的玩具;也能应用于车载通信设备实现人机交流。该芯片应用在移动通信设备中,比如,手机上短消息来时,我们不必费力地去看,而是可以听到声音。

(4)基于小范围无线通信协议的嵌入式产品

以蓝牙为代表的小范围无线接入协议与嵌入式系统的结合,必将推动嵌入式系统的广泛应用。近来,基于这些协议的嵌入式产品层出不穷,包括各种电话系统、无线公文包、各类数字电子设备以及在电子商务中的应用。这些产品以其微型化和低成本的特点为它们在家庭和办公室自动化、电子商务、工业控制、智能化建筑物和各种特殊场合的应用开辟了广阔的前景。

东南大学移动通信国家重点实验室以及依托实验室建立的南京东大移动互联技术有限公司,从开始跟踪蓝牙技术,在香港特区政府创新科技基金、江苏省“十五”重大科技攻关以及国家“十五”科技攻关的资助下,先后设计和研制了多种基于蓝牙技术的嵌入式产品。其中包括符合Bluetooth V1.1标准的嵌入式PSTN网关和语音终端。它们基于蓝牙“三合一电话”应用模型,选用了中国科学院凯思昊鹏软件技术工程有限公司提供的Hopen OS作为嵌入式开发的软件平台,选用华邦的W90221作为硬件平台。语音终端能通过PSTN网关以无线的方式接入到PSTN网络中,实现和PSTN网用户的互通。还有符合Bluetooth V1.1标准的嵌入式局域网接入点,它基于蓝牙“局域网接入”应用模型,选用嵌入式Linux操作系统作为软件平台,选用Motorola公司的CodeFire 5272作为硬件平台。通过该接入点,终端用户可以自由地接入到Internet,可以同时支持多个终端用户连接到Internet。其它一些嵌入式产品包括智能多媒体家庭网关、远程抄表系统、信息家电等等。

结 语

以上重点介绍了嵌入式系统的特点、嵌入式产品的开发和应用。我们在开发过程中体会到:嵌入式系统开发和以前从事的开发工作实质上并无区别,唯一改变的是每个硬件平台都是独特的,这一个不同点导致了许多附加的开发复杂性,因而,在嵌入式开发过程中要格外注意软件创建过程;而且,在开发嵌入式产品之前要对选用的嵌入式硬件平台有较多的了解,具备相应的硬件知识,和硬件工程师密切配合;在选用嵌入式操作系统和硬件平台时要根据所要开发的应用的需要以及成

本等方面的考虑选择合适的系统和平台。

在科技快速发展的今天,嵌入式产品将会越来越多地被广泛应用。我们相信,只要遵循嵌入式产品的开发规律,适应市场的需求,就一定能开发出越来越多的嵌入式产品。

嵌入式系统SD卡接口技术分析 篇3

关健词:Windows CE.NET;SD卡技术;存储技术

中图分类号:TP310.89文献标识码:A文章编号:1006-8937(2009)10-0018-02

1SD存储卡技术及SD主控制寄存器概述

存储卡的最大应用领域一直是数码相机领域,而随着消费电子市场对存储容量的需要日益迫切,尤其是智能手机和掌上电脑等产品的销量不断增长,消费电子市场将成为存储卡最主要的市场。目前在手机和掌上电脑等消费电子产品上应用的存储卡有:SD卡,MMC,mini-SD,RS-MMC,MMC Plus,记忆棒,CF 存储卡等,SD和 MMC由于占有绝对的市场份额而成为事实的标准。

S3C2410A微处理上,SD主控制器接口的32bit功能寄存器物理地址从0X5A000000开始下面简单介绍SD 主控制器接口的重要寄存器。

①SDICON(SDI Control Register,SD接口控制寄存器),该寄存器中的功能位用来设置SD主控制器的时钟类型,SD主控制器的FIFO复位,读写等待条件,是否响应SD主控制器的SDIO中断和SD主控制器读写数据时候的字节顺序。

②SDIPRE(SDI Baud Rate Pre-scaler Register,SD 波特率因子寄存器),设置该寄存器中的bit 0~7,可以对系统的PCLK进行分频,然后提供给SD主控制器使用,分频公式为:Baud Rate=PCLK/2/(SDIPRE+1)。

③SDICCON(SDI Command Control Register,SD命令控制寄存器),该寄存器存放发送给SD主控制器的命令,主控制器是否等待响应,命令是否带有数据等。

④SDICSTA(SDI Command Status Register,SD命令状态寄存器),该寄存器包含命令是否正在传输,命令是否超时,响应CRC校验失败等标志位。

⑤SDISP(SDI Response Register,SD响应寄存器),共有4个,只读属性。当响应是短响应时,只用SDISP0,否则就需要使用四个响应寄存器。

⑥SDIBSIZE(SDI Block Size Register,SD数据块大小寄存器),该寄存器只使用了bit 0~11,所以数据块最大为4095字节,当使用流模式传输时,该寄存器忽略。

⑦SDIDCON(SDI Data Control Register,SD数据控制寄存器),bit 0~11为传送数据块的数目;剩下的状态位标识数据传输模式,DMA通道使能,数据总线宽度(1bit 或4bit模式),传输停止方式,传输响应,SDIO中断周期等。

⑧SDIDSTA(SDI Data Status Register,SD数据状态寄存器),包含数据收发状态,传输完成,是否超时,CRC 校验,FIFO失效,SDIO中断等状态位。

⑨SDIDAT(SDI Data Register,SD数据寄存器),该寄存器用来保存SD控制器用来传送或接受的数据。

⑩SDIDAT(SDI Data Register,SD数据寄存器),该寄存器用来保存SD控制器用来传送或接受的数据。

当需要对SD主控制器接口进行控制时,我们必须先要将SD主控制器的寄存器初始化,然后对相应的SD接口寄存器进行读写来完成工作。

2接口硬件设计

N30系统是一款针对中低端用户设计的掌上电脑,基于成本和功能的考虑,我们选择Samsung的S3C2410A 16/32bit的RISC处理器芯片,内部扩展USB、SD接口,支持红外线和蓝牙数据传输接口,努力维持一个较低成本的同时,使得整个系统有一个较高的整体性能。在此基础上使用GPIO引脚扩展的方法,对标准SD接口进行扩展,设计并实现N30掌上电脑的SD卡接口。

N30中选用的是Samsung的S3C2410A嵌入式ARM微处理器,采用ARM920T核心,内部还有液晶显示屏控制器,IIC总线和IIS总线控制单元,3通道的UART,4通道DMA控制器,电源控制单元,时钟发生电路,USB主机控制器、USB设备接口和SD主控制器等,工作频率可达到266MHz。适用于低成本的嵌入式应用,满足我们的设计需要。ARM9系列采用五级流水线和哈佛结构,提供1.1MIPS/MHz的性能,是高性能和低功耗的硬宏单元。ARM920T和ARM922T具有全性能MMU、指令和数据Cache以及高速AMBA总线接口,适用于高性能、低功耗的应用。

N30系统由于采用Samsung的S3C2410A芯片,内部支持内存控制、NAND Flash和SD卡接口等。Flash存储器采用的是一Samsung的K9F5608U0C,32MB的NANDFlash;RAM采用的是两片Samsung的K4S561633C,构成 16M*16bit*2的64MB内存空间;SD卡接口采用APLS公司的SCDA1A0100 SD卡连接插槽,通过GPIO扩展其 SD卡检测引脚信号和电源使能信号等。

N30掌上电脑的硬件系统的主要模块有:嵌入式处理器,电源模块,LCD和触摸屏,音频模块,时钟,USB 接口等,另外还有用于调试的JTAG和串行接口。

嵌入式处理器是整个系统的核心,它主要负责整个系统的运行,控制各个部件的工作和协议转换。

电源模块负责整个系统的供电,主要向嵌入式系统提供2.5V,3.3V和5V的直流电压,向LCD模块提供3.3V、5V、12V的直流电压。同时采用TI的MSP430F1111A微控制器,负责电池的温度、电量监测和电池充电,以及控制LED灯的状态。

音频模块采用 Philips的UDA1380音频编解码芯片,连接外部话筒和耳机,同时经过音频放大之后连接到内部扬声器,音频模块和CPU之间采用IIS总线连接。I2S(Inter IC Sound)总线是飞利浦半导体公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专责于音频设备之间的数据传输,广泛应用于各种多媒体系统中。I2S数据通过DMA或者PIO方式与系统内存交互。

摸屏和LCD显示屏是主要的人机交互接口,负责响应用户的触摸笔输入和显示输出,显示屏是3.5寸 65536色的TFT 液晶显示屏,分辨率为240*320,内部集成触摸屏电路和背景灯电路。

时钟模块由32.768KHz、13MHz的晶振和时钟发生电路组成。32.768KHz的时钟提供给RTC实时时钟,用于低精度的系统计时。13MHz的晶体振荡器经过时钟发生电路升频以后,输出FCLK,PCLK和HCLK三路。其中 FCLK专用于ARM920T核心;HCLK用于AHB高性能总线,提供给内存控制单元、中断控制单元、USB主机控制器单元等;PCLK用于APB高性能外部总线,提供给 SD/MMC、SPI接口等。

USB接口分为两个模块:USB主机控制器和USB设备端口。主机控制器可以连接USB鼠标、键盘等USB设备,扩展PDA的功能;USB 设备端口可以用于PDA和 PC端的USB连接,将PDA的存储设备和PC连接起来,使得PDA成为PC机的移动存储设备。

3驱动设计与实现

S3C2410A芯片内部支持SD主控制器的基本接口,通过GPIO的扩展完成了SD接口的硬件设计,本章主要针对SD卡扩展的存储接口进行分析、设计和实现。我们为 N30掌上电脑上运行的 Windows CE系统开发了SD 主机控制器的驱动程序。Windows CE下,驱动程序是用户态的动态链接库(Dynamic Link Library,DLL),这些 DLL向内核提供一些接口函数,这样设备管理模块就可以通过这些函数与具体的硬件设备进行通信。

其中,驱动软件架构分析如下。Windows CE的驱动程序模型主要有2种类型:流式接口驱动(Stream Interface Driver)和本地设备驱动(Native Device Driver)。流式设备驱动向上层提供统一的流式设备接口,而本地设备驱动可以根据具体设备要求提供相应接口。N30掌上电脑系统中,SD Host的驱动程序采用流式接口驱动模型。驱动程序要实现相应的XXX_Open( ),XXX_Close( )等响应的流式设备接口函数,其中XXX为设备驱动的前缀,应用程序可以通过文件操作来控制设备。为了减少了 SD Host驱动程序设计的复杂性,使其具有较好的可移植性,采用BSQUARE提供的SD Host DDK,它在 BSQUARE SD协议栈的基础上,提供了平台独立的总线和客户端驱动和一组标准化的API供使用。在该体系结构下,SD主控制器驱动负责检查SD卡的插拔状态,检测插入的卡的类型,设置SD主控制器时钟等SD接口的硬件操作;SD总线驱动则负责上层卡驱动的装载和移除,维护每一个插槽的总线请求队列等。该结构的设计很大程度上减少了SD Host驱动程序设计的复杂性,使SD Host控制器驱动程序设计可以专注于硬件相关的部分。总线驱动是SD卡客户端驱动程序和SD Host 驱动程序之间的一个抽象层,它为SD卡客户端驱动提供平台独立的服务接口。SD Host驱动程序需要完成处理器和硬件平台相关的处理,向上层驱动提供统一的服务接口。

参考文献:

嵌入式系统启动分析论文 篇4

达芬奇 (Da VinciM) 技术是一种专门针对数字视频应用、基于信号处理的解决方案, 能为视频设备制造商提供集成处理器、软件、工具和支持, 以简化设计进程, 加速产品创新。达芬奇处理器系列包括经优化的、高度可扩展可编程的信号处理、加速器和外设装置, 能够充分满足各种视频终端设备的性价比与特性需求。TMS320DM6446处理器适用于视频电话、车载信息娱乐以及IP机顶盒 (STB) 等应用和终端设备。

达芬奇芯片上提供如下资源:两个内核 (ARM926和C64+DSP) ;视频处理子系统 (VPSS) ;一系列的接口 (USB2.0、I2C、SPI、UART*3) ;看门狗电路;多种数据程序存储支持 (NOR FLASHNAND、FLASH、DDR2、MMC/SD、ATA) ;多个引脚独立或复用的外设。

2 ARM-DSP的集成结构

对于双核芯片, 重要的是如何处理双核之间的关系, 管理好双核之间的资源, 协调好双核的通信和高效地实现资源共享, 图1是ARM-DSP的集成结构。

(1) 外围设备的共享。ARM和DSP共享EDMA (enhanced direct memory access) 和ASP (audio serial port)

(2) 存储器的共享。ARM能访问DSP内部的存储器 (L1P, L1D, L2) , 这个特性意味着ARM和EDMA能够加载DSP存储器的程序和数据;DSP能访问ARM的内部存储器。ARM和DSP都能访问DDR2存储器和AEMIF (asynchronous external memory interface) 。但是DSP不能访问EMIF的控制寄存器, 因此控制寄存器的配置需要ARM来处理。

(3) ARM-DSP中断的共享。ARM能中断DSP (通过4个通用的中断和1个NMI) ;DSP能中断ARM (通过2个通用的中断) 。这些中断一般被用于ARM和DSP的协调。典型的应用是ARM写命令到共享存储器中, ARM中断DSP, DSP相应中断并读取命令, DSP执行一个任务, DSP完成任务后中断ARM。

ARM可以控制DSP的电源、时钟、复位和启动。

3 Davinci的复位

DM6446上电复位后, 芯片的绝大部分模块都处于不工作状态。锁相环PLL处于旁路 (Bypass) 模式;DSP子系统的状态取决于DSP_BT引脚;UART1和UART2也处于不工作状态, UART0的状态取决于BTSEL引脚 (如果BTSEL=11, UART0工作) ;EMIFA处于工作状态, 其数据总线宽度由EM_WIDTH决定, 地址总线宽度由AEAW决定;芯片的大部分引脚都被配置为GPIO引脚。引脚复用通过寄存器PINMUX0和PINMUX1控制。

4 Da Vinci系统的启动

TMS320DM6446 DMSo C ARM能从EMIF/NOR Flash或者ARM ROM启动, 它的启动方式是由BOOTCFG寄存器的第6和第7位 (BTSEL) 的状态决定的。

当ROM boot被选择 (BTSEL[1:0]=00, 10or11) , 跳到内部ROM (0000:4000h) 去执行第一条指令。内部的RBL (ROM boot loader) 去读BOOTCFG寄存器的信息来决定启动方式。当AEMIF boot被选择 (BTSEL[1:0]=01) , 则跳到AEMIF (0200:0000h) 去执行第一条指令, ARM则从外部的ROM中连续地执行。

4.1 启动方式

DMSo C ARM的几种启动方式见表1所示。

BTSEL[1:0]=01是异步的EMIF启动, 这个模式是由硬件控制, 不需要通过内部的ROM。BTSEL[1:0]不等于01时, 将通过RBL (rom boot loader) 引导, 图2是启动模式原理框图。

4.2 NAND和NOR Flash

NOR Flash要受到达芬奇存储映射CSX存储最大32MB的限制, 而NAND Flash自身接口是多路复用的I/O, 所以可以存储大容量的数据, EM_CS2是DM6446默认的启动片选引脚。

NOR Flash和NAND Flash都是通过AEMIF接口与DM644X连接, 但是NOR Flash能作为一个CPU直接访问的存储地址, 而NAND Flash不可以。这意味着DM6446的ARM核能直接从CSX存储空间的NOR Flash中执行代码。在NOR启动模式中, RBL实质上探测到启动模式后直接跳转到CS2存储区域 (地址从0X02000000开始) 去执行代码。如果这段空间的数据是空的, 将出现异常, 执行将返回到RBL。

4.3 DMSo C初始化顺序

(1) DMSo C复位。

(2) ROM boot loader。NAND或者UART0的初始化。

(3) U-boot引导加载 (Boot-loading) 。关中断和MMU;设置引脚复用控制器;使能电源域:DDR2和DSP;设置时钟频率 (设置PLL1, DSP频率是594MHz, ARM是297MHz, 设置PLL2, VPSS是54MHz, DDR是162MHz) ;配置AEMIF引脚为NOR Flash接口;配置系统的内存;通过TFTP加载等加载方式, 加载内核到指定的存储地址;初始化传递到内核的引导参数 (EMAC地址, 串口, 控制台, 视频格式等) ;获得ARM Linux机类型值;设置kernel tagged list;用初始值设置ARM的寄存器;调用内核;ARM引导启动操作系统。

(4) Linux操作系统启动。

4.4 关于U-BOOT的简要说明

通常情况下, ARM Linux要求boot loader中有少许的初始化。目前TI的DVEVM使用的是U-boot-1.1.3。U-boot代码中首先运行的是u-boot/cpu/arm926ejs/start.S, 芯片和一些DVEVM板的硬件配置主要在u-boot/board/davinci/platform.S和davinci.c中完成。其中u-boot/board/davinci/platform.S设置最基本的系统硬件环境, 包括系统PLL及DDR2的初始化、PSC的配置及使能UART0、AEMIF等硬件模块。同时还需要修改你所用到的Flash的参数u-boot/board/davinci/flash.c。

参考文献

[1]崔晶.达芬奇数字媒体片上系统的架构和Linux启动过程[J].今日电子, 2007 (2) .

[2]Booting and Flashing via the DaVinci TMS320DM644x Serial Interface Application Report www.ti.com2007 (1) .

[3]TMS320DM644x DMSoC ARM Subsystem Reference Guide www.ti.com, 2007 (3) .

嵌入式系统启动分析论文 篇5

【关键词】电子病历; 嵌入式; XML; 设计; 开发

【中图分类号】F416.63【文献标识码】A【文章编号】1672-5158(2013)07-0076-01

1 XML技术简介

扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。XML与Access,Oracle和SQL Server等数据库不同。数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:它极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows、Mac OS, Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。

XML的前身是SGML(The Standard Generalized Markup Language),是自IBM从60年代就开始发展的GML(Generalized Markup Language)。同HTML一样,XML (可扩展标识语言)是通用标识语言标准(SGML)的一个子集,它是描述网络上的数据内容和结构的标准。尽管如此,XML不象HTML,HTML仅仅提供了在页面上显示信息的通用方法(没有上下文相关和动态功能),XML则对数据赋予上下文相关功能,它继承了SGML的大部分功能,却使用了不太复杂的技术。

XML技术的优点主要表现在三个方面,分别为可扩充性、内容和表现形式的分离以及数据处理方便,具体情况见表1所示:

2 基于XML的嵌入式电子病历书写系统设计

2.1 系统结构

本系统结构设计为三层架构,见图1所示:

三层架构的结构设计具有一定的优点,主要表现为在三层架构之下的各个逻辑层既相互独立,彼此之间又存在着较为密切的联系,这样一来,就对系统的扩充造成有利的影响,这也更加适应了医疗业务不断变化的趋势。就嵌入式电子病历系统与一般电子病历系统来看,两者之间存在着一定的差异,前者运行于双重环境之下,而后者往往只在单一环境下进行运行。

三层架构分别为前端客户表现层、中间应用服务层以及后端数据资源层:

①前端客户表现层:这一层主要是为嵌入式电子病历系统提供方便有效的操作方式,客户并不需要对知道其中具体的细节。一般用户通过客户表现层可以对病历进行一定程度上的查询;而对于高级用户而言,他们则享有更多的权限,例如新建病历、查询病历以及修改病历等;系统管理员可以对用户进行管理,对嵌入式系统存储空间进行管理。

②中间应用服务层:这一层的主要任务是对病历处理任务进行有效的执行,它所设计的内容较为广泛,主要包含有执行用户管理模块、执行病历数据存取的数据操作模块、病历数据库的维护和更新模块、基于节阳 web Service的信息交换模块、XML文档解析、XML文档与应用数据库的相互转换模块、电子病历安全考虑模块以及嵌入式系统存储空间管理模块等。

③后端数据资源层:对于后端数据资源层而言,它主要是由两个部分组成的,分别是XML文档库以及HIS系统数据库,后端数据资源层的主要作用是为电子病历操作提供相应的后台数据支持,一般情况下,对数据库的读写通过ADO.NET接口进行访问,对XML文档使用节几 Web Service技术保存和读取。

2.2 系统模块

用户管理模块:包含两个方面的工作,其一,管理员对用户进行一定程度的管理;其二,系统用户管理登录ID与密码,以及对用户的基本信息进行修改。

病历录入模块:对录入的病历信息进行接收,系统为病历信息的接收提供一个良好的界面;

病历信息表示与存储模块:使用XML记录的病历是文本格式,可直接对其进行阅读,并不会局限于计算机平台、软件以及数据库形式;

病历信息共享模块:病历信息与医院内部HIS子系统的信息集成以及医院之间信息的交换。

3 结束语

本文就针对基于XML的嵌入式电子病历书写系统设计与开发进行研究与分析。首先对SML技术及其优点进行了一定程度的介绍,然后在此基础之上从从系统结构与系统模块两个方面分析了基于XML的嵌入式电子病历书写系统设计。希望我们的研究能够给读者提供参考并带来帮助。

参考文献

[1] 胡业发,陈娟,陶飞,杨朝阳.基于XML的电子病历数据模式研究[J].计算机工程与设计.2007(04)

[2] 昇高昭,孙文东.电子病历-医院信息系统的发展方向[J].医学信息.2007(01)

[3] 孟健,曹立明,王小平,姚亮.基于XML电子病历多重签名方案的设计与实现[J].计算机工程.2006(19)

[4] 齐卫东.强化行业规范 促进医院信息化建设[J].解放军医院管理杂志.2006(03)

嵌入式系统代码的优化分析 篇6

嵌入式技术的快速发展使之成为当前微电子技术与计算机技术的一个重要分支。广义地说,一个嵌入式系统就是一个具有特定功能或用途的计算机软硬件集合体。由于嵌入式系统是为特定目的而设计的,在系统的设计中,硬件资源通常是有限的,一般只提供刚好足够的存储器和完成工作的处理能力,故软件系统的编程空间也是有限的。如何在这有限的资源上实现最多最好的功能,对系统的软件代码进行优化是一种有效的方式。

1 嵌入式系统编程语言

嵌入式系统的特点使得其软件受时间和空间的严格限制,加上运行环境复杂,使得嵌入式系统软件的开发变得异常困难。为了设计一个满足功能、性能和时间要求的安全可靠的高性能嵌入式系统,编程语言的选择十分重要。汇编语言和具体的微处理器的硬件结构密切相关,移植性较差,既不宜在复杂系统中使用,又不便于实现软件重用;高级语言通用性强、容易编程和阅读、可移植性好、可维护性好、直接支持中断管理、支持软件重用、有丰富的软件支持。随着嵌入式系统应用范围的不断扩大和嵌入式实时操作系统的广泛使用,高级语言编程已是嵌入式系统设计的必然趋势。从20世纪80年代中期C语言涉足嵌入式系统后,受到了普遍欢迎。C语言既有低级语言的直接控制硬件的能力,又有高级语言的灵活性,是目前在嵌入式系统中应用最广泛的编程语言。本文讨论的优化方法就是针对用C语言编写的代码而言的。

2 代码优化

优化是一种等价的、有效的程序变换。等价是指不改变程序的运行结果,即对变换前后的程序给以相同的输入,应有相同的输出,这表明变换是安全的,是所有的程序变换都必须保证的。有效是指变换后的程序与变换前的程序相比,运行速度更快,所占空间更省,即所谓时空效益要高。同时在优化过程中还要考虑合算的原则,即要用尽可能低的代价取得较好的优化效果。

2.1 执行时间的优化

嵌入式系统最大的特点是程序执行的实时性要求很高,因此对代码执行时间的分析和优化是十分必要的。任何程序都是由顺序、选择、循环三种结构构成。顺序结构通常用来完成一些简单的操作,如程序的初始化等,一般仅执行一次,执行时间有限。而选择和循环结构是用来实现系统功能的主要部分,其所占的执行时间直接影响系统的性能,因此代码执行时间优化的重要目标是对代码中选择和循环部分的改进。

2.1.1 选择结构的优化

(1)调整多分支条件

在多分支的if语句或switch语句中,对于分支条件的安排,可根据系统的具体情况,事先分析它们发生的相对频率,尽可能将发生频率高的条件放在前面,这样可以提高代码执行的速度。

例如,对学生成绩进行统计分析时发现,成绩为“中”的学生占总数的一半多,成绩为“差”的学生只有极少数,则在以学生成绩作为分支条件的if语句或switch语句中,就应将“成绩为中”的分支条件放在第一个分支处,而将“成绩为差”的分支条件放在最后,这样可以减少执行过程中条件判断所花费的时间。

(2)构造优化的逻辑表达式

“||”和“&&”运算当可以通过左边的操作数确定其返回值时,就不会对右边的操作数进行求值。因此,条件判断中的逻辑表达式,如果是“||”连接的关系式,应考虑将容易满足的条件放在“||”前面;如果是“&&”连接的关系式,则将不容易满足的条件放在前面。这样有可能减少判断的次数,这一点特别是当判断发生在循环里时就变得更重要。

2.1.2 循环结构的优化

循环结构是影响运行时间效率的主要因素,不当的循环往往导致代码运行效率低下。

(1)循环不变量外提

优化循环时,将循环不变量外提,减少循环中操作数的数量,以避免不必要的常量计算。同时,尽量将一些操作放到循环外面去,减少操作的次数。例如,一些赋值和初始化操作,可以提到循环外面去做。

(2)强度削弱、归纳变量

强度削弱是用代价低的算法来取代代价高的算法,如将“*”用“+”代替,循环变量用自加或自减来完成计数功能,以达到减少运行时间的目的。归纳变量实际上是一个变量,其值由循环迭代变量的值计算而得。在循环嵌套程序中采用归纳变量可以有效地减弱循环迭代的开销。如下面三段代码:

在第一段代码中,数组元素是通过计算i*m+j来寻址的,而在第二段代码中通过引入归纳变量c=i*m+j实现循环的优化,其中ap与bp分别是指向a数组和b数组首地址的指针。又由于数组在内存中是顺序存放和遍历的,故第二段代码可以进一步改写为第三段代码。在第三段代码中,通过引入归纳变量消除了乘法运算,从而减弱了循环迭代的开销。

(3)循环合并

如果两个循环计数差不多、循环执行互不相同的操作,可以把它们合并在一起组成一个循环。当两个循环的负荷都不满时,这是非常有用的。

(4)循环展开

循环展开就是把循环计数小的循环展开,成为非循环形式的串行程序,或者把循环计数大的循环部分展开,减少循环迭代次数,以节省用于循环设置、初始化、增加和校对循环计数器的时间。

2.1.3 其他的优化

除了对程序中主要的选择和循环结构进行优化外,还可以通过使用宏定义、减少函数调用、使用较快的寻址方式、将一些常用的程序和数据放在片内RAM中运行等方式来提高程序执行的效率。

2.2 占用空间的优化

受到成本和体积的限制,嵌入式系统的存储空间通常是有限的,因此在编写程序时除了要考虑系统执行效率外,也应尽量合理的安排存储空间的分配。

2.2.1 变量定义

变量定义虽然很简单,但也有很多值得注意的地方。如在程序中分别用以下两种顺序定义了4个变量:

这里定义的4个变量形式都一样,只是次序不同,却导致了在最终的映像中不同的数据布局,如图一所示。显然,第二种方式节约了更多的存储器空间。由此可见在变量声明的时候,需要考虑怎样最佳地控制存储器布局。当然,编译器在一定程度上能够优化这类问题,但是最好的方法还是在编程的时候,把所有相同类型的变量放在一起定义。

2.2.2 数值复用

通过减少程序中使用到的数据量也可以降低存储空间的消耗。一个使数据量最小化的简单技术是数值复用。在程序中,如果所用到的几个常数恰好有相同的数值,那么就可以把它们映射到同一个存储位置,并且在程序的几个不同地方,数据缓冲区也可以被复用。但使用数值复用技术时必须谨慎,否则会带来负面效果。另一个简单的技术是在程序运行时产生数据而不存储数据。当然,产生数据所需要的程序代码会占用程序的存储空间。但当涉及到复杂的数据结构时,使用程序来产生数据是可以节省实际的存储空间的。

3 结束语

嵌入式系统中,在系统硬件既定的情况下,通过优化软件设计提高系统性能是很有实际意义的。进行代码优化前要进行系统性能分析和评估,找到问题的瓶颈所在,针对影响系统性能的主要代码进行优化。代码优化的目标是体积小、速度快,但是在通常情况下二者不能兼得,一般寻找的是二者的折中,究竟应该偏向何方,就应该根据系统的实际需要来权衡,以达到最合理的优化效果。

参考文献

[1]华清远见嵌入式培训中心.嵌入式Linux C语言应用程序设计[M].北京:人民邮电出版社,2007.

嵌入式系统引导加载程序分析 篇7

一个嵌入式系统可以大概分为四个流程:引导加载程序(类似于平时所提及的BIOS),嵌入式操作系统(内核),文件系统,嵌入式软件部分(用户的应用程序)[2]。由此可见,引导加载过程是第一阶段也是非常重要的阶段。

本次课题所采用的是TI公司所推出的DM368处理器,是一款集成Arm+Dsp双核架构芯片,基于DM368设计的开发板实现1080p30 H.264高清编码(硬编码),一般在嵌入式软件的开发过程中,都会有操作系统的支持,以便更好的管理硬件软件资源,进程管理,合理的资源共享等功能,为嵌入式应用程序的开发和执行提供一个稳定,方便的环境。此次采用的是嵌入式Linux操作系统,易剪裁,可固化在只有几kb或者几MB的存储器芯片中内核中,支持的硬件种类也很多,支持几乎所有的而网络协议等,较为常用[3]。

1 内核的引导程序启动

在PC机(或者虚拟机)上,linux启动需要的是GRUB引导装入器,在嵌入式开发板中起着类似于grub功能的则是非常重要的bootloader,操作系统内核或应用程序运行之前的一段程序。TI的片子与通常所用的三星的片子有所不同,三星的片子上电后会自动[9]从nandflash中搬移4kb到dm368内部的RAM上,这4kb的程序会完成后面的搬移工作,将剩下的代码从nandflash搬移到DDR上,而TI的片子需要RBL,UBL,u-boot(较为常用)多级加载共同来完成引导程序的启动工作。

RBL(ARM ROM Boot Loader),固化在dm368芯片上的一块ROM区域(地址固定),芯片出场的时候已经烧写到ROM里了。系统外接DDR2 SDRAM和NAND Flash作为片外存储,DM368提供了专门的DDR2控制接口(EMIF),AEMIF接口可以支持NAND flash,NOR Flash本次课题研究所采用的是外接NAND FLASH启动,除了NOR FLASH启动外,其他方式的启动都需要运行RBL,RBL是必不可少的。由于U-BOOT编译出来的都比较大,RBL不可支持那么大的程序,所以就需要一个UBL。

RBL在nandflash某块中会寻找UBL的描述符,将UBL复制到ARM中的RAM中,UBL并非是固化好的,而是需要我们与u-boot一样进行编译烧写的,在开发包中编译UBL bin文件。注意ubl的入口地址在0x0020到0x7800之间,大小应该在30KB左右。UBL在nandflash找到u-boot的描述符,把u-boot加载到DDR上运行,最后u-boot加载u Image并启动linux系统,完成了从上电到linux启动的整个大概流程。

2 u-boot的启动流程(两个阶段)

u-boot属于二级引导程序,在整个引导过程中占据很重要的位置,初始化cpu及相关硬件系统和支持高级语言的运行。系统上电后,进行初始化,关闭看门狗,初始化外设,最终运行任务就是将内核映象从硬盘上(nandflash)读到RAM中,然后跳转到内核的入口点去运行,启动操作系统,准备好软件环境[4]。

首先了解引导程序中的一个阶段u-boot的启动流程,一般分为两个阶段:

第一阶段中比较核心代码是/arch/arm/cpu/arm926ejs/start.S和arch/arm/cpu/arm926ejs/davinci/lowlevel_init.S,完成开发板的核心配置,由汇编语言完成,可以提高系统运行的效率,主要的工作:硬件设备初始化(设置异常向量,设置cpu,使cpu进入特权模式,屏蔽中断,初始化ram,设置堆栈,清除BSS段),跳转到第二阶段代码入口。

start.S中一段代码中得出:

start.S中调用lowlevel_init.S来进行内存ram的初始化,

第二阶段代码的入口函数:

以前的版本中是start_armboot

第二阶段实现主要是:/arch/arm/lib/board.c中的board_init_r函数,这一阶段主要用C语言来完成,方便移植这个函数会调用很多初始化函数来完成系统的全面初始化,初始化本阶段使用的硬件设备,检测系统内存映射,将内核从Flash读取到RAM中,为内核设置启动参数,调用内核。最后执行common/main.c中的main_loop函数。

大概了解u-boot的启动流程之后,将开发包中的u-boot进行配置,编译[1],最后生成u-boot.bin文件。由于开发板属于arm平台,在配置编译过程中需要对编译链改为交叉编译链。还涉及到u-boot的移植部分,u-boot与具体的cpu体系结构(arm,powerpc等)及嵌入式硬件整体设计,板级设备的配置有关,即使两块开发板基于同一种cpu,但是硬件系统设计不同,也需要修改bootloader,才能让运行在一块开发板的程序也运行在另外一块开发板上,一般总是选择一个与自己本身的开发板硬件特性相近的bootloader已经支持的开发板为蓝本进行移植,根据两者的不同来进行修改或添加。

利用Wintech的TDS560USB PLUS仿真器与CCS3.3(dsp开发环境)配合使用烧写nandwriter.out,根据提示烧写ubl.bin,u-boot.bin到nandflash,仿真器的作用是将目标板和pc机连起来,注意u-boot的运行地址(DDR),以防和linux内核的运行地址(DDR)相冲突[7]。

3 u-boot的启动信息以及出现的网络问题

开发板上电启动,在超级终端出现下列打印信息:

前半部分是ubl的启动信息,后半部分是u-boot的启动信息(u-boot基本移植完成),在超级终端出现此打印信息时证明引导加载过程基本正确。检测网络部分并搭建tftp服务,由于网络部分有问题,修改网络部分的驱动并检查开发板phy芯片,通过u-boot网络命令下载内核并启动[8]。

4 内核启动及测试程序的运行

引导程序最终功能是为了正确引导内核启动,根据自己的板子设置进行必要的移植工作。

内核主要由驱动组成[5],根据实际开发板对内核中相应的硬件驱动进行修改,添加[6]。

如下图所示内核启动的登录界面

通过nfs在开发板内核启动界面上运行主机所交叉编译好的测试程序,成功。

5 结语

由此可见,只有当上述引导程序加载完毕,必要时需要进行移植保证正确运行,进而引导内核启动,并且通过测试程序的验证,为以后编写所需求的高清编码嵌入式软件打下基础,所以引导程序是嵌入式系统中非常重要的一部分。

参考文献

[1]叶顺流.基于ARM的嵌入式linux的研究与实现[D].重庆:重庆大学,2005

[2]孙纪坤,张小全.嵌入式Linux系统开发技术详解-基于ARM[M].北京:人民邮电出版社,2006.

[3]王亚刚嵌入式Linux系统移植与裁减技术研究[D].西安:西北大学,2005:19-40

[4]万永波,张根宝,田泽.基于ARM的嵌入式系统Bootloader启动流程分析[J].微计算机信息,2005,21

[5]董明峰.Linux系统引导概述[J].微机发展,2002,13(8):69-72

[6]邹思轶.嵌入式Linux设计与应用[M].北京:清华大学出版社,2002:54-60说

[7]马学文,朱名日,程小辉.嵌入式系统中Bootloader的设计与实现.计算机工程,2005,31(7):96~98

[8]韦东山.嵌入式linux应用开发完全手册[M].人民邮电出版社,2008

上一篇:CAD使用技巧下一篇:企业发展中的工业工程