蠢耋 。 学习蕊 ■_园 地
%A VxWorks在AT9l FR40l 62上的BSP定制
%A ■ 北工业大学 王慧吴旭光马昕万伟安
%A 讨论BSP的概念以及ARM芯片AT9 1 FR40 1 62的特点;研究在BSP定制过程中需要清楚的VxWork S映
%A 摘 要 像的生成和种类
%A , 以及系统的启动流程:着重研究vx w。r k s操作系统在A T9 l FR 4 0 l 6 2上的BsP定
%A 制。
%A 关键词 BSP VxWorks ARM 映像 AT91FR40162
%A 引 言
%A VxWorks是美国WindRiver公司设计开发的一种嵌
%A 入式实时操作系统(RTOS)。它采用微内核结构, 具有高
%A 可靠性、实时性、丰富的网络协议、良好的兼容性和裁
%A 减性等特点, 支持多种处理器;同时, 具有友好的用户
%A 开发环境和良好的持续发展能力。VxWorks的一个强项
%A 是应用程序编码在很大程度上与目标板的硬件和结构无
%A 关。这是由于它把所有特定的硬件功能都集成在一个被
%A 称作板级支持包BSP (Board Support Package)的库中。
%A A T9 l F R40 l 62是Atm el公司出品的一款A R M
%A (Advanced RISC Machines)微控制器,其核心为高性能的
%A 32位RISC体系结构, 并具有高密度的l6位指令集和极
%A 低的功耗。它的尺寸仅为l0mm × l0mm, 并在片l夭]集成
%A 有256KB的Flash存储器和2MB的片内SRAM 。它力许
%A 多计算密集的嵌入式控制应用领域提供了功能强大、使
%A 用灵活且性价比高的解决方案,同时还可以帮助用户减
%A 小PCB尺寸和系统成本。
%A 本文主要研究将VxWorks移植到AT91FR40162上,即
%A BSP包的定制。开发BSP的要点可概括为以下两部分:一
%A 是要清楚VxWorks映像(image)的生成和种类,系统的启动
%A 顺序和过程,相应BSP设置文件的修改.BSP备文件的组
%A 成和作用; 二是要清楚系统底层驱动, 也就是对
%A AT9lFR40l62芯片及相关的硬件有所了解, 如上电启动
%A 过程、读写ROM、地址空间分配、寄存器、中断定义等。
%A 1 BSP的概念
%A BSP是介于底层硬件和上层软件之间的底层软件开
%A 发包. 它的主要功能是屏蔽硬件, 提供操作系统的驱动
%A 及硬件驱动。BSP在VxWorks系统中的地位如图l所示。
%A VxWorks针对不同的CPU,会有不同的BSP。即使同一
%A 种CPU, 由于外设的一点差别,BSP的相应部分也不一
%A 样。所以根据硬件设计编写和修改BSP, 保证系统正常
%A 运行是非常重要的。
%A BSP的概念只是针对嵌入式操作系统而言的, 而像
%A DOS、Windows、UNIX等BIOS操作系统是无BSP可言的。
%A BSP有点类似PC机主板上的BIOS,但有一些区别。BIOS
%A 主要是负责在电脑开启时检测、初始化系统设备(设置
%A 栈指针、中断分配、内存初始化等), 装入操作系统并
%A 调度操作系统向硬件发出的指令, 不包含一些基本的硬
%A 件驱动。BSP是和操作系统绑在一起运行在主板上的。尽
%A 管BSP的开始部分和BIOS所做的工作类似, 可是大部分
%A 和BIOS不同, 作用也完全不同。此外,BSP还包含和系
%A 统有关的基本驱动(串口、网口等)。程序员可以编程
%A 修改BSP, 在BSP中任意添加一些和系统无关的驱动或
%A 程序, 甚至可以把上层开发的统统放到BSP中。
%A 2 VxWorks映像
%A VxWorks的映像由代码段(text)、数据段(data)和BSS
%A 三部分组成一可分为两类:可引导映像(Bootable Image)
%A 独立于硬件的软件
%A I 应用工具
%A I I/O系统l l VxWorks库l I TCPflP
%A + 千
%A I文件系统l
%A l ●
%A 儿i 独立W于ind硬I~件的软 .、
%A 乙 I 卜_― .1 卜―‘‘ 毒仃
%A 驱动器U BsP L―J 驱动器
%A I l J 硬件 J
%A I圆圆圆I 态翼
%A 图1 BSP在VxWorks中的位置
%A 圈皿啊Micmcont~oll。 &Fmbedd。d Sy。【e 77
%A 维普资讯
http://www.cqvip.com
%A 和可下载映像(Loadable Image),如下所示。
%A r不驻留R0M的映像/压缩
%A r可引导映像 J ROM.based Image 、、不乐缩
%A 映像{B。。诅b0。 g。l驻留R0M的映像 l
%A 可下载映像 ROM0residem Image
%A Loadable Image
%A 可引导映像是将引导程序和VxWorks融为一体的映
%A 像。它常常直接烧入ROM 或Flash, 包括不驻留ROM 的
%A 映像(ROM.based image)和驻留ROM 的映像(ROM-resident
%A image)这两种类型。图2所示的不驻留ROM 映像在BsP
%A 初始化时,把image完全搬到RAM 中执行。图3所示的
%A 驻留ROM映像在BSP初始化时,把image中的data段复
%A 制到RAM 中, 代码在ROM 中运行。
%A R0M/Flash RAM
%A 引导程序
%A VxW orks
%A R0M ―based
%A VxW orks
%A Image
%A LOCAL
%A ― ―
%A M EM
%A ― ―
%A LOCAL
%A ― ―
%A ADRS
%A RAM L0W ADRS
%A 图2 ROM―based image
%A R0M/Flash RAM
%A 引导程序
%A VxWOrks / / xworks
%A 代码段/ 数据段+BSS
%A VxW orks
%A 数据段+
%A BSS
%A LOCAL
%A ―
%A M EM
%A ―
%A LOCAL
%A ―
%A ADRS
%A RAM L0W ADRS
%A FREE RAM ADRS
%A 图3 ROM―resi dent image
%A 可下载映像实际包括两部分:VxWorks和BootRom
%A 两部分是独立创建的, 如图4所示。先由引导代码把引
%A 导程序搬到RAM HIGH―ADRS中,ROM 引导程序的作
%A 用是初始化调试下载通道和调试信息输出通道, 为下载
%A VxWorks做准备。被调试的image通过主机与目标机之
%A 间的某种耦合方式(如串口和网口)下载到目标机的
%A I M/Flash RAM
%A 引导程序
%A 、 \ w 。
%A 引R导0程M序 )
%A 引导程序
%A 。
%A RAM 巾。
%A 3 VxWorks启动流程
%A VxWorks image的运行方式分为在ROM 中和在RAM
%A 中两种。两者启动顺序的区别是在R A M 中运行的
%A VxWorks要调用sysInit()函数;而在ROM 中运行不需要。
%A 如图5所示,sysInit()主要是初始化RAM 用的, 系统直
%A 接跳到RAM 的首地址运行VxWorks。
%A VxWorks在ROM 中运行,生成的映像是ROM.resi.
%A dent image, 如图3所示。写入ROM 中的VxWorks是非
%A 压缩的. 不需要解压, 系统直接跳到ROM 的首地址运
%A 行VxWorks。只把VxWorks image的data段复制到RAM
%A 的RAM LOW ADRS,text部分留在ROM 并在ROM 中
%A 执行。在ROM 中运行的VxWorks主要是为了节省RAM
%A 空间, 以便应用程序有更大的空间运行, 但缺点是运行
%A 速度慢。具体流程如图5所示。
%A VxWorks在RAM 中运行,生成的映像是ROM.based
%A image(~H图2所示)或Loadable image (如图4所示);写
%A 入ROM 中的VxWorks image或引导程序是压缩的, 需要
%A 先解压并复制所有的text和data到RAM 相应的地址中。
%A 具体流程如图5所示。
%A L0cAL MEM L0cAL ADRS 图5 VxWorks BSP执行流程图
%A RAM
%A ― L0w― ADR 4 AT91 FR401 62简介
%A FREE
%A ― ―
%A RAM
%A ― ―
%A ADRS
%A RAM
%A ―
%A HIGH
%A ― ―
%A ADRS
%A 图4 可下载映像
%A AT9 l FR40 1 62的片上资源包括:ARMTTDMI处理器
%A 核、256 KB的片内SRAM 和2MB的Flash存储器、完全
%A 可编程的外部总线接口EBI、具有8个优先级且可以独
%A 立屏蔽的向量中断控制器、32个可编程的I/O 口线、3通
%A 道的l 6位定时器/计数器、2个通用同步/异步收发器
%A 78 丰砖■..・入菇l健▲而l圈皿圈
%A 维普资讯
http://www.cqvip.com
%A 8 雾蓁雾繁 -
%A USART、可编程的看门狗定时器、先进的省电特性、完
%A 全静态的操作。
%A AT91FR40162需要注意的是, 启动ROM 地址重映射
%A (remap)的概念。当一个系统上电后, 程序将自动从0地
%A 址处开始执行。因此, 在系统的初始状态,要求0地址
%A 开始处的存储器是非易性的ROM 或Flash等。但是因为
%A ROM 或Flash的访问速度相对较慢. 每次中断发生 .
%A 都要从读取ROM 或Flash上面的向量表开始. 影响了巾
%A 断的响应速度。因此,ARM 提供一种灵活的地址重映
%A 射方法。该方法可以将内部RAM 的地址重新映射到OxO
%A 的位置,而将Flash的地址映射在OxO l oooooo(由NCS0片
%A 选)的位置。那么在系统执行重映射命令之前 需要将
%A Flash中的中断向量拷贝到内部RAM 中 这样在重映射
%A 命令执行之后, 便可以在内部RAM 中0X0的位置找到
%A 中断向量。重映射命令通过EBI用户接口进行访问. 即
%A 对EBI RCR(重映射控制寄存器)的RCB写”l” 重映射
%A 命令执行之后, 如果不是发生了内/外部复位是无法回
%A 到重映射之前的状态的。具体的存储器重映射地址如
%A 图6所示。
%A 重映射命令执行之前 重映射命令执行之后
%A 0xff闭fffr 0x仟
%A 片内外围 片内外围
%A 0xfrc0OO0o 0xffc00000
%A 0xffbffff0 f
%A xffbf珩r 外围器件
%A 0x20000000
%A 保留 Oxl行fH行
%A 外部SRAM
%A Oxl0000000
%A 0x00400000
%A 0x0l仃盯lff
%A 0 片内Flash
%A x003f珩r 0
%A x0l000000
%A 片内 0x00仟ffff
%A 保留
%A 0x003o(IooO 0x00300000
%A 0x002f珩r 0x002
%A 保留的 保留的
%A 片内器件 片内器件
%A 0x00lo(IooO 0x00l00000
%A Ox0oOf珩r 0x000
%A 片内Flash 片内RAM
%A Oxoc1000Oo0 0x00000000
%A 图6 AT91 FR401 62的存储器映射图
%A 5 VxWorks在AT91FR40162上的BSP定制
%A 下面以VxWorks在AT91FR40l62上的BSP定制为例,
%A 具体说明B S P的生成方法和需要注意的问题。根据
%A AT91FR40162的片上资源,可以外扩串口、网口、USB
%A 口、JTAG 口等外扩口, 并制成开发板。移植采用生成
%A 不驻留ROM 的可引导映像rom―based image, 用户也可
%A 以根据具体J立用生成其它类型的映像。该映像在RAM
%A 中执行, 执行流程图如图5所示,可以参照该图来修改
%A BSP。
%A 由于AT91FR40162的内核是ARM7TDMI,所以BSP
%A 文件主要在VxWorks编译环境Tornado的目录vxworks/
%A target/config al1和vxworks/target/config/integrator7t文件夹
%A 里。其中,al1文件夹里的文件是所有BSP的通用文件,
%A 一般来说是不需要修改的;integrator7t文件夹的文件是
%A 需要用户自己定制的B SP文件。
%A 5.1 编写BSP文件
%A (1)修改Makefi l e文件
%A Makefile文件控制映像的创建, 主要需要改动编译
%A 器名称、目标地址等(注:在Makefile文件里凡是十六
%A 进制数前面郜无需加”0X”)。这里有几个需要改动的地
%A 址的含义:
%A ◆ ROM TEXT ADRS表示boot ROM 的入口地址;
%A ◆ ROM SIZE表示ROM 区域的大小;
%A ◆ RAM LOW ADRS表示加载vxWorks的目标地址;
%A ◆ RAM HIGH ADRS表示boot ROM拷贝到RAM 的
%A 目标地址。
%A (2)修改i nteg rato r.h
%A integrator.h用来设置所有非可选的、与AT91FR40162
%A 芯片相关的信息, 如设置存储器地址、串行接口、时钟
%A 以及I/O设备等。在该文件中必须包含以下内容。
%A ◆ 存储器地址。定义所有存储器地址, 包括内部
%A 256KB SRAM 、外部2MB SRAM和2MB Flash以及存储
%A 器地址和总线地址。其中,LOCAL―MEM―LOCAL―ADRS
%A 是板上存储器的起始地址,LOCAL―
%A M EM
%A ―
%A BUS
%A ― ADRS是
%A 总线地址。
%A ◆ 中断向量/级别。定义所有的中断向量和优先
%A 级,如先进中断控制器AIC(Advanced Interrupt Contro1)、
%A 串口中断等。
%A ◆ 设备寄存器位的含义。对于板载控制寄存器, 为
%A 每一个寄存器中每一位或几个位定义一个宏值。如定义
%A 外部总线接口EBI(External Bus Interface)、串行口
%A (USART)、并行口PIO、特殊功能寄存器SF(Special
%A Function)、省电模块PS(Power Saving)等。
%A ◆ 系统和附加时钟参数(最大和最小速率)。需要
%A 给定系统时钟速率、辅助时钟速率。
%A (3)修改COnfi g.h
%A 该文件包含AT9 1 FR40 1 62所有的包含文件和定义,
%A 根据该芯片的特点需按以下配置宏定义。
%A 圈唧瞳MicT彻 IIeTs&Embedded SysIems 79
%A 维普资讯
http://www.cqvip.com
%A ◆ 改CPU 7TDMI下的DEFAULT BOOT LINE为”PPP
%A (0,0)host:vxWorks tom”。其中,PPP(Point―to―Point Protoco1)
%A 是点对点传输协议;host是主机名. 用户可以自己命名:
%A vxW orks
%A ― tom是VxWorks Image文件路径名。
%A ◆ 修改地址。注意ROM―
%A TEXT ADRS、ROM
%A ―
%A SIZE 、
%A RAM
%A ―
%A LOW
%A ―
%A ADRS、RAM
%A ―
%A HIGH
%A ― ADRS要与Makefile文
%A 件里定义的一致,L0cAL MEM LOCAL ADRS和
%A LOCAL
%A ―
%A M EM
%A ― SIZE要正确。如AT9 1一
%A ONBOARD
%A ―
%A SRA M
%A ― ADRS这类的宏已经在integrator.h中定义
%A ◆ 加#include”integrator.h”。
%A ◆ 加PPP协议。PPP是点对点传输协议。
%A #define PPP
%A ―
%A OPT
%A ―
%A NO
%A ―
%A PAP l
%A #define PPP
%A ―
%A OPT
%A ―
%A NO
%A ―
%A CHAP l
%A #define PPP
%A ― ―
%A OPT
%A ― ―
%A DEBUG 0
%A #define PPP
%A ―
%A OPT
%A ―
%A PASSIVE
%A ―
%A MODE l
%A #define PPP
%A ― ―
%A TTY 0
%A ◆ 定义中断优先级和加中断保护模式。
%A (4)修改romI n i t.s
%A 该文件包含用于初始化汇编代码. 是系统上电后运
%A 行的第一个程序。在romInit.S中需要进行如下的工作一
%A ◆ 保存启动方式。对于冷启动,如果CPU配置的是
%A HIGH VECTORS,就设置入口地址为0xFFFF0000,否则设
%A 置入口地址为0x00000000;
%A ◆ 拷贝数据到片内RAM 中。
%A ◆ 屏蔽中断。通过设置cpsr的I―BIT和F―BIT都为
%A l来实现, 还要设置中断寄存器为关模式. 同时设定运
%A 行模式为SVC32模式,屏蔽AIC中断。
%A ◆ 设置EBI接口及其参数。
%A ◆ 初始化堆栈指针S P 。堆栈指针S P 指向
%A STACK
%A ― ADRS。这个宏的定义为:当映像为驻留ROM
%A 时, 该宏值为一Sdata;当映像为非驻留ROM 时, 该宏
%A 值为一tomInit。这两个地址经过地址映射后, 都指向被
%A 拷贝映像在RAM 的目标地址。
%A ◆ 加亮灯程序。为了测试方便, 可以在函数中加一
%A 些亮灯程序。
%A ◆ 指针跳转到romStartO函数并执行。
%A ◆ 加EBI一系列参数以及remap命令。Remap命令
%A 地址映射情况详见图6。
%A (5)boot I n i t.c文件
%A bootlnit.C将文本段和数据段从ROM 中复制到RAM
%A 中。从romlnit.S文件中的romlnit()程序跳到在此文件下
%A 定义的romStart()程序后终止。romStart程序运行了对于
%A R0M 印象所需的解压缩和重定位工作, 一般不需要用
%A 户修改。
%A (6)修改sYsAL i b.s
%A VxWorks映像的入口点一sysInit放在这个文件中。此
%A 文件包含特定目标板与系统相关的汇编源程序。SysInit
%A ()函数屏蔽处理器中断,并设置堆栈指针。sysInit()完成
%A 了将控制传送给usrInit(), 且与romlnit.S文件实现的功能
%A 相似。
%A ◆ 加亮灯程序。同上, 可以通过修改亮灯的次序
%A 区分f)ji个函数。
%A ◆ 禁止中断并转换到SVC32模式。
%A ◆ 设置中断堆栈指针。
%A (7)US rConf i g.c文件
%A usrConfig.C包含适用于传统VxWorks映像的主初试
%A 化编码。它包含rOOt任务、基本的系统初始化子程序、
%A 网络初始化、时钟中断。为了使VxWorks的配置文件表
%A 现得更简单,此文件被分成了许多小文件,存放在target/
%A S r C/COnfig/u S r[ 】.C中(这些文件不需要修改)。
%A usrConfig.C也不需修改。
%A (8)修改sYsL i b.c。
%A SY SLib.C提供了目标板级的接口, 此文件主要修改
%A sysHwInit0和sysHwInit20这两个函数。sysHwInit0初始
%A 化CPU板上的硬件,sysHwInit20增加一些系统配置和初
%A 始化。
%A 在sysHwInit()中修改以下地方:
%A ◆ 禁止看门狗定时器;
%A ◆ 初始化C/T Block模式寄存器;
%A ◆ 配置并且初始化串口;其中,sysse rialHwInit()函
%A 数在sysSeria1.C中,该可选文件用于所有串口设置和初
%A 始化;所以还要相应地修改sysSeria1.C文件。
%A 在sysHwInit2()中修改以下地方:
%A ◆ 初始化中断库以及中断驱动;
%A ◆ 配置定时器timer类型, 由于在这用到timer的库,
%A 所以要把AT9 l lib (如参考文献[1】)中的at91 Timer.C,
%A at9 I Timer.h,at9 1 IntrCt1.C拷到target/config/integtator7t下。
%A ◆ 配置串口中断类型,其中,sysSerialHwInit2 0函
%A 数在也sysSeria1.C中。sysSeria1.C函数需要调用at9 1 Sio.h
%A 以及at91Sio.C。这两个文件也在AT9llib中, 需要将这两
%A 个文件拷到target/config/integtator7t下。
%A 5.2 编译生成
%A 系统定制完之后, 有两种编译方式:一种是在To r―
%A nado下进行编译,生成Image文件;另一种直接用Make
%A 编译, 但是要写好脚本文件。需要清楚各生成文件的类
%A 型, 如下所示。本例最后生成vxWorks―tom映像。
%A ◆ Bootable image:
%A 80 丰哼■J-入菇▲健^而l圈皿喝
%A 维普资讯
http://www.cqvip.com
%A vxW orks
%A ― tom ―VxWorks in ROM,非压缩,在RAM
%A 中运行。
%A vxW orks.st
%A ― rom―Stand―alone in ROM,压缩,在RAM
%A 中运行。
%A vxW orks.res
%A _
%A rom
%A _ nosym -VxWorks in ROM, 非压缩,
%A 在ROM 中运行。
%A vxW orks.res
%A ― rom ―Stand―alone in ROM,非压缩.在
%A ROM 中运行。
%A ◆ Loadable image:
%A vxWorks―basic Tornado,shell和symbol table在主机
%A 端。
%A vxWorks.st一独立的image,包含shell和symbol table,
%A 在目标板运行。
%A 5.3 需要避免的错误
%A ◆ 忘记LOCAL―
%A M EM
%A ―
%A LOCAL
%A ― ADRS。不要假定
%A LOCAL
%A ―
%A M EM
%A ―
%A LOCAL
%A ― ADRS是零, 并且没有将它包括
%A 在需要对存储器起始地址进行补偿的宏模快中. 要根据
%A 具体情况设置它的值。
%A ◆ 在romInit.S中做的工作太多。不要试图将过多的
%A 设备初始化程序写入romInit.S,将实际设备的初始化放
%A 到sysLib.C文件的sysHwInit()函数中。
%A ◆ 在sysALib.S中做的工作太少。许多BSP编写者
%A 认为romInit.S中的初始化只需做一次, 这是错误的概
%A 念。在sysALib.S中,sysInit0程序应该重复romlnit.S中
%A 的初始化。
%A ◆ 将修改过的驱动程序存放在错误的目录下。BSP
%A 编写者经常修改风河公司的设备驱动程序, 这些被改动
%A 过的程序应该放在特定的B SP目录下(如放在ta rget/
%A A l t e r a Ha rdCopy
%A conng/integtator7t下), 而不能放在target/src/drv和target/
%A h/d rV目录下(只有风河公司的源程序才能被存放在这
%A 些目录下)
%A 由于版面所限,源程序代码不在此列出, 详见本刊
%A 网络补充版WWW.dpj.com.cn。
%A 结 语
%A VXWO rk S具有很好的可靠性、实时性和可裁减性,
%A 适合于工业控制、通信等对实时性、可靠性要求高的领
%A 域。我们采用西安傅立叶公司的带串口的AT9lFR40l62
%A 开发板, 已经成功把VxWorks移植到该开发板上。如果
%A 用户对ARM 处理器及相关底层硬件、驱动很熟悉, 并
%A 且深刻理解了BSP的一些相关概念, 参照本文,相信移
%A 植VxWorks到自己所使用的ARM芯片上并不困难。■
%A 参考文献
%A l WWW.atme1.corn
%A 2 Tornado BSP Developer‘s Kit for VxW orks User‘s Guide,
%A Tornado 2.0.Edition 1.1999
%A 3 VxW orks Programmer‘s Guide,Edition 1.1 999
%A 4 马忠梅,等.AT91系列ARM核微控制器结构与开发.北
%A 京:北京航空航天大学出版社,2003
%A 王慧: 硕士研究生, 研究方向嵌入式操作系统、AR M在控制领
%A 域内的应用。吴旭光:教授,研究方向鲁棒控制理论, 系统
%A 建模和仿真, 嵌入式操作系统, 总线和集散控制。
%A (收稿日期:2003―12-30)
%A 结构化AS I C荣膺
%A EDN2 0 0 3年度创新大奖
%A 2004年3月31日Altera公司宣布其HardCopy Stratix结构化ASIC荣获EDN 数字Ic类2003年度创新大奖。Altera的HardCopy
%A 结构化AsIC是三个决赛产品之一, 其余两个是Fudit su的Acc elArraY结构化ASIC和M-Systems的DiskOnChip G3器件 HardCopy
%A 器件是业界真正从FPGA至低成本结构化ASIC的产品。EDN 创新奖颁奖典礼于3月29日在San Franci s C0的w Hote1举行,典礼上
%A 公布了2003年度创新大奖的获奖者。获奖者在2004年4月1 5日的EDN杂志和www.e dn.com上公布。
%A Altera的HardCOPY St rati x器件是结构化ASIC,提供了从FPGA至低成本掩膜编程器件的无缝移植方式。HardCOPY器件可以
%A 通过A1te ra的QUartu s II软件直接进行设计, 它具有ASIC级的性能、价格和特性,让客户根本无风险地完成成品的开发。Ha rdCoPY
%A 器件具有和成功的stratix FPGA相同的特性, 同时性能平均提高50 。HardCoPy还比同等的Stratix FPGA降低了多达4O鬈的功耗。
%A Alt era的Har dCoPY器件是网络、无线通信 高端消费电子、工业、测试和医疗市场上高性能大批量应用的理想选择。有关Ha r dCOPY
%A Stratix器件的详细情况,请访问WWW.alte ra.com/har dcopy stratix。
%A I醯田_一Microc。 打olIefs&E埘bedded sy5fc口 8 1
%A 维普资讯
http://www.cqvip.com