嵌入式系统设计与应用

目录

第一章 嵌入式系统概述

第二章 ARM处理器体系结构

第三章 ARM指令集

第四章 S5PV210处理器

第五章 Linux操作系统和内嵌式汇编

第十章 SQL数据库

第十一章 开发设计案例


第一章 嵌入式系统概述

嵌入式系统的组成:嵌入式处理器为中心,配置存储器I/O设备通信模块以及电源等必要的辅助接口组成

嵌入式系统的基本架构:设备驱动层 ,实时操作系统(RTOS),应用程序接口层(API).和实际应用程序层

嵌入式操作系统的作用:(1)补平硬件差异的界面或是说隐藏硬件,让应用程序可以在上面运行

                                         (2) 程序设计人员无须考虑到不同硬件所造成的差异,可专注于所擅长领域的开发  

嵌入式系统的常见类型:(1)商用型的操作系统主要有VxWorks、Windows CE 、Psos、Palm OS、OS-9、LynxOS、QNX、LYNX等

                                         (2)免费型的操作系统主要有Linux和µC/OS-II 

Cortex-A系列的应用方向:高端智能手机、大屏幕的移动设备、企业网路设备、服务器、无线基台、数字电视。

Cortex-R系列的应用方向:如汽车制动系统、动力传动解决方案、大容量存储控制器等深层嵌入式实时应用。

Cortex-M系列的应用方向:针对成本和功耗敏感的应用,如智能测量、人机接口设备、汽车和工业控制系统、家用电器、消费性产品和医疗器械等。

第二章 ARM处理器体系结构

ARM处理器的发展过程(大概发展过程了解一下,产品系列)

  1. V1版本 v1版本ARM处理器没有商品化,只出现在ARM1原型机上
  2. V2版本 对v1版本进行了扩展和完善。仍旧采用26位地址空间和64M寻址空间
  3. V3版本 基于该版本的ARM6处理器,做为IP核独立的处理器,具有片上高速缓存、MMU和写缓存的集成CPU
  4. V4版本 该版本在v3版本的基础上做了进一步的扩充,是目前被应用最广的ARM体系结构,ARM7TDMI、ARM9、StrongARM等都采用该结构
  5. V5版本  在v4版本的基础上增加了一些新的指令。ARM9E、ARM10和Intel的XScale处理器都采用该版本结构
  6. V6版本 该版本降低耗电量的同时提高了图像处理能力,适合无线和消费类电子产品;高数据吞吐量和高性能的结合
  7. V7版本 v7版本架构是在v6版本的基础上诞生的,对于早期的ARM处理器软件提供了较好的兼容性
  8. V8版本  首款支持64位指令集的处理器架构.

ARM处理器发展过程中体系结构的演变(了解)

  1. Thumb指令集(T变种)Thumb指令集是把32位的ARM指令集的一个子集重新编码后而形成的一个特殊的16位的指令集 
  2. 长乘指令(M变种)长乘指令是一种生成64位相乘结果的乘法指令(此指令为ARM指令),M变种增加了两条长乘指令
  3. 增强型DSP指令(E变种)E变种的ARM体系增加了一些增强处理器对典型的DSP算法处理能力的附加指令
  4. Java加速器Jazelle(J变种)ARM的Jazelle技术是Java语言和先进的32位RISC芯片完美结合的产物
  5. ARM媒体功能扩展(SIMD变种)

一些经典的处理器采用的是哪些架构(暂时不知道哪些是经典的处理器)(了解)

体系结构 ARM内核版本
V1 ARM1
V2 ARM2
V2a ARM2aS、ARM3
V3 ARM6、ARM600、ARM610、ARM7、ARM700、ARM710
V4 Strong ARM、ARM8、ARM810
V4T ARM7TDMI、ARM720T、ARM740T、ARM9TDMI、ARM920T、ARM940T
V5TE ARM9E-S、ARM10TDMI、ARM1020E
V6 ARM11、ARM1156T2-S、ARM1156T2F-S、ARM1176JZF-S、ARM11JZF-S
V7 ARM Cortex-M、ARM Cortex-R、ARM Cortex-A
V8 Cortex-A53/57、Cortex-A72等

比较新的产品所使用的的一些处理器类型

Cortex-A8处理器工作模式

处理器模式 备注
用户模式 正常程序执行模式
系统模式 使用和用户模式相同的寄存器组,用于运行特权级操作系统任务
管理模式 系统复位或软件中断时进入该模式,是供操作系统使用的一种保护模式
外部中断模式 低优先级中断发生时进入该模式,常用于普通的外部中断处理
快速中断模式 高优先级中断发生时进入该模式,用于高速数据传输和通道处理
数据访问中止模式 当存取异常时进入该模式,用于虚拟存储和存储保护
未定义指令中止模式 当执行未定义指令时进入该模式,用于支持硬件协处理器的软件仿真
安全监控模式 可在安全模式和非安全模式下转换

 Cortex-A8处理器支持的数据类型

  • 字节:8位
  • 半字:16位
  • :32位
  • 双字:64位

 Cortex-A8处理器的储存模式

  • 大端模式:被存字数据的高字节存储在存储系统的低地址中,而被存字数据的低字节则存放在存储系统的高地址中.
  • 小端模式:与大端存储格式相反,在小端存储格式中,存储系统的低地址中存放的是被存字数据中的低字节内容,存储系统的高地址存放的是被存字数据中的高字节内容

举例:一个32字的0x12345678

大端存储模式
78
56
34
12

                                                                                                                      

小端模式在高地址为12,低地址为78.

ARM处理器中各种异常中断

异常类型 中断方式 优先级
复位异常 管理模式 1
数据异常中止 数据访问中止模式 2
快速中断异常(FIQ) 快速中断模式 3
外部中断异常(IRQ) 外部中断模式 4
预取指异常中止 未定义指令中止模式 5

软件中断异常(SWI)

未定义指令异常(包括协缺处理器)

管理模式

未定义指令模式

6

状态寄存器:ARM处理器有1个当前程序状态寄存器CPSR和6个备份程序状态寄存器SPSR

工作机制:

  • 保存最近执行的算术或逻辑运算的信息;
  • 控制中断的允许或禁止;
  • 设置处理器工作模式。

原理:

  • 每一种处理器模式下使用专用的备份程序状态寄存器。
  • 当特定的中断或异常发生时,处理器切换到对应的工作模式下,该模式下的备份程序状态寄存器保存当前程序状态寄存器的内容。
  • 当异常处理程序返回时,再将其内容从备份程序状态寄存器回复到当前程序状态寄存器。

若内存按字节编址,用存储容量为8K*8比特的存储器芯片构成地址编号A0000H~DFFFFH的内存空间,则至少需要多少片?

本题考查内存容量的计算。

给定起、止地址码的内存容量 = 终止地址 – 起始地址 + 1。

将终止地址加1等于E0000H,再减去起始地址,即E0000H – A0000H = 40000H。

十六进制的 (40000)16 = 218。

组成内存储器的芯片数量 = 内存储器的容量/单个芯片的容量。

218/(8*210) = 218/213 = 25

设指令由取指、分析、执行3个子部件完成,每个子部件的工作周期均为Dt,采用常规标量单流水线处理机。若连续执行10条指令,则共需时间 ?Dt。(五级流水答案为14Dt)

本题考查指令流水的概念。

顺序执行时,每条指令都需三步才能执行完,没有重叠。

所以连续执行10条指令后,共需时间为2 + 10=12Dt。

嵌入式系统设计与应用_第1张图片

第三章 ARM指令集

 ARM指令集的基本格式:〈opcode〉{〈cond〉} {S}〈Rd〉,〈Rn〉,{〈operand2〉}

ARM条件码

指令条件码 助记符 CPSR条件标记位值 含义
0000 EQ Z置位 相等
0001 NE Z清零 不等
0010 CS C置位 无符号>=
0011 CC C清零 无符号<
0100 MI N置位
0101 PL N清零 正或零
0110 VS V置位 溢出
0111 VC V清零 未溢出
1000 HI C置位Z清0 无符号>
1001 LS C清零Z置位 无符号<=
1010 GE N等于V 带符号>=
1011 LT N不等于V 带符号<
1100 GT Z清零且N等于V 带符号>
1101 LE Z置位或N不等于V 带符号数<=
1110 AL 忽略 无条件执行
1111  NV 未使用

ARM指令的寻址方式(9种)

1.立即寻址:立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址

ADD    R0,R0,#1        /*R0←R0+1*/

ADD    R0,R0,#0x3f    /*R0←R0+0x3f*/

2.寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。

MOV  R1,R2        ;将R2的值存入R1 

SUB  R0,R1,R2    ;将R1的值减去R2的值,结果保存到R0

第二操作数移位方式

LSL:逻辑左移,空出的最低有效位用0填充。

LSR:逻辑右移,空出的最高有效位用0填充。

ASL:算术左移,由于左移空出的有效位用0填充,因此   它与LSL同义。

ASR:算术右移,算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用0填充,如果是负数用1填充。

ROR:循环右移,移出的字的最低有效位依次填入空出的最高有效位。

RRX:带扩展的循环右移。将寄存器的内容循环右移1位,空位用原来C标志位填充。

ADD    R3,R2,R1,LSR  #2    ;R3 <—R2 + R1÷4

ADD    R3,R2,R1,LSR  R4    ;R3 <—R2 + R1÷2R4

3.寄存器间接寻址:寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。

LDR    R0,[R1]        /*R0←[R1]*/      

STR    R0,[R1]        /*[R1]←R0*/

第一条指令将以R1的值为地址的存储器中的数据传送到R0中。

第二条指令将R0的值传送到以R1的值为地址的存储器中。 

4.基址加偏址寻址:基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。 

前变址模式:         LDR R0,[R1,#4]    ;R0←[R1+4]

自动变址模式:     LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4

后变址模式:         LDR R0,[R1] ,#4    ;R0←[R1]、R1←R1+4

传送数据类型:传送数据可以是有符号、无符号的8位、16位半字和32位字。   

相对应的在指令中增加一个字母表示数据类型:     

  •  B:选择字节操作   
  •  H:选择半字操作   
  •  不加则选择字操作 

5.堆栈寻址:堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶.

四种类型的堆栈工作方式

  • 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。
  • 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。
  • 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
  • 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成

ARM指令:                                                                                                                Thumb指令:

 STMFD SP! {R1-R7,LR}    ;入栈                                                                             PUSH {R1-R7,LR}    ;入栈

 LDMFD SP! {R1-R7,LR}    ;出栈                                                                             POP {R1-R7,LR}    ;出栈 

6.块拷贝寻址:块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。LDM/STM指令可以把存储器中的一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中.

7.相对寻址:与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。

BL    NEXT        ;跳转到子程序

                        ;NEXT处执行

 ……                                 

NEXT

 ……    

 MOV    PC,LR        ;从子程序返回

8.变址寻址 :将某个寄存器的值与指令中给出的偏移量相加,形成操作数有效的地址,再根据该有效地址访问存储器.

LDR              R0 , [ R1 , # 2 ]               ;R0 ← [ R1 + 2]

 9.多寄存器寻址:可以在一条指令中传送多个寄存器的值,一条指令最多可以传送16个通用寄存器的值.连续的寄存器之间用"-"连接,不连续的中间用","分隔;

LDMIA     R0 ! , {R1-R3,R5}                                 ;R1 ← [ R0 ]

                                                                                ;R2 ← [ R0 + 4 ]

                                                                                ;R3 ← [ R0 + 8 ]

                                                                                ;R4 ← [ R0 + 12 ] 

 ARM中各种指令

1、ADD、SUB、 RSB、      ADC、        SBC、             RSC 

       加           减       反减       加带进位     减带进位        反减带进位    

多个字节算术运算举例:

R2,R3中的64位整数与R0,R1中的64位整数相加,结果放在R4,R5中:   

 ADDS R4,R0,R2    ;加低有效位   

ADC  R5,R1,R3      ;加高有效位

96位减法举例:

SUBS   R3,R6,R9     

SBCS  R4,R7,R10     

SBC     R5,R8,R11

2.AND、ORR、EOR、BIC

 逻辑与、或、   异或、位清零

3.MOV和MVN(传送和取反传送)

MVN指令:          MVN {条件}{S}  目的寄存器, 源操作数

MVN指令将一个立即数、一个寄存器或被移位的寄存器的值先按位求反,再传送到目的寄存器中。后缀S表示是否影响标志位。

MVN  R0, #0x0FF             ;将立即数0xFF按位求反后装入R0,操作后R0=0xFFFFFF00

 4.CMP和CMN(比较和比较反值)

这些指令将寄存器的值与Operand2进行比较。它们根据结果更新条件标志码,但结果不放到任何寄存器中     

CMP:根据Rn - Op2设置条件码,结果丢弃     

CMN:   根据Rn + Op2设置条件码,结果丢弃

CMN  R1, R0            ;将R1的值和R0的值相加,并根据结果设置CPSR的标志位      

CMN  R1, #0x200         ;将R1的值和立即数200相加,并根据结果设置CPSR的标志位

 5.TST和TEQ(测试和测试相等)

TST {cond} Rn,Operand2     

TEQ {cond} Rn,Operand2

TST:对Rn的值和Operand2的值进行按位“与”操作,设置条件码,丢弃结果     

TEQ:对Rn的值和OPerand2的值进行按位“异或”操作,设置条件码,丢弃结果

TST  R1, #0x0F        ;检测R1的低4为是否为0

 6.MUL和MLA(乘法和乘加)

MUL {cond} {S} Rd,    Rm,  Rs ;

MLA {cond} {S} Rd , Rm , Rs , Rn ;                      Rm*Rs+Rn->Rd

7.Load/Store指令

ARM的数据存取指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令。ARM指令集中有三种基本的数据存取指令:  

  • 单寄存器的存取指令(LDR,STR)  
  • 多寄存器存取指令(LDM,STM)  
  • 单寄存器交换指令(SWP)

单字和无符号字节的数据传送指令

  • 前变址格式       LDR|STR {} {B} Rd, [Rn, ] {!}    
  • 后变址格式       LDR|STR {} {B} {T} Rd, [Rn],    
  • 相对PC的形式 LDR|STR {} {B} Rd, LABEL

半字和有符号字节的数据传送指令

  • 前变址格式 LDR|STR{ } H|SH|SB  Rd,  [Rn, ]{!}    
  • 后变址格式 LDR|STR {} H|SH|SB  Rd,  [Rn],

式中是#±<8位立即数>或#±Rm;

H|SH|SB选择传送数据类型;

其它部分的汇编器格式与传送字和无符号字节相同。

说明:半字传送的地址必须是偶数。

LDR和STR双字:加载两个相邻的寄存器和存储两个相邻的寄存器,64位双字。

句法:     

  • op{cond}D Rd,[Rn]     
  • op{cond}D Rd,[Rn,offset]{!}     
  • op{cond}D Rd,label     
  • op{cond}D Rd,[Rn],offset

其中:Rd    加载或存储寄存器其中一个,另一个是R(d+1)。              

Rd必须是偶数寄存器,且不是R14     

Rn      除非指令为零偏移,或不带回写的前索引,否则,Rn不允许与Rd和R(d+1)相同

LDRD         R6,[R11]                                          

LDRMID     R4,[R7],R2

STRD         R4,[R9,#24]

STRD         R0,[R9,R2]!

LDRD         R1,[R6]

STRD         R14,[R9,#36]

STRD         R2,[R3],R6

8.多寄存器存取指令LDM/STM

多寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中

LDM / STM { < cond > } < add mode >  Rn { ! } ,  < registers > { ^ }

add mode    IA、IB、DA、DB、FD、ED、FA、EA

Rn                基址寄存器,装有传送数据的初始地址,        

                     Rn不允许是R15

registers     加载或存储寄存器列表。

^                  不允许在用户模式或系统模式下使用.

LDMIA        R8,{R0,R2,R9}     

STMDB    R1!,{R3-R6,R11,R12}     

STMFD    R13!,{R0,R4-R7,LR}     

LDMFD    R13!,{R0,R4-R7,PC}     

STMIA        R5!,{R5,R4,R9}

9.单寄存器交换指令(SWP

SWP{} {B} Rd,Rm,[Rn]

SWPB R1,R1,[R0]    交换字节,将[R0]中的字节数据        读取到R1中,同时将R1中的数据写入到[R0]中     

SWP   R1,R2,[R3]    交换字数据,将[R3]中的数据读        取到R1中,同时将R2中的数据写入到[R3]中

10.程序状态寄存器与通用寄存器之间的传送指令 

ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。

这两条指令分别是:

  • 状态寄存器到通用寄存器的传送指令(MRS)
  • 通用寄存器到状态寄存器的传送指令(MSR)

MRS  R0, CPSR        ;将CPSR的值复制到R0中    

ORR  R0, R0, #C0     ;R0的位6和位7置1,即屏蔽外部中断和快速中断

MSR  CPSR, R0        ;将R0值写回到CPSR中

 11.转移指令

  • B           转移指令    
  • BL         带链接的转移指令    
  • BX        带状态切换的转移指令    
  • BLX      带链接和状态切换的转移指令

B {条件}  目标地址

跳转指令B是最简单的跳转指令,跳转到给定的目标地址,   从那里继续执行。

B          WAITA    ;无条件跳转到标号WAITA处执行 B    0x1234       ;跳转到绝对地址0x1234处

BL {条件}  目标地址  

用于子程序调用,在跳转之前,将下一条指令的地址复制到链接寄存器R14(LR)中,然后跳转到指定地址执行。 

BL        FUNC1         ;将当前PC值保存到R14中,然后跳转到标号FUNC1处执行

 BLX {条件}  目标地址

BLX指令从ARM指令集跳转到指定地址执行,并将处理器的工作状态由ARM状态切换到Thumb状态,同时将PC值保存到链接寄存器R14中

BLX      FUNC1     ;将当前PC值保存到R14中,然后跳转到标号FUNC1处执行,并切换到Thumb状态

BLX      R0             ;将当前PC值保存到R14中,然后跳转R0中的地址处执行,并切换到Thumb状态

BX {条件}  目标地址

带状态切换的跳转指令,跳转到指定地址执行。

若目标地址寄存器的位[0]为1,处理器的工作状态切换为Thumb状态,同时将CPSR中的T标志位置1,目标地址寄存器的位[31:1]复制到PC中

若目标地址寄存器的位[0]为0,处理器的工作状态切换为ARM状态,同时将CPSR中的T标志位清0,目标地址寄存器的位[31:1]复制到PC中

BX   R0         ;跳转R0中的地址处执行,如果R0[0]=1,切换到Thumb状态

12.异常中断指令(感觉考不到)

  • 软件中断指令(SWI)  
  • 断点指令(BKPT—仅用于v5T体系)

软件中断指令SWI用于产生SWI异常中断,用来实现在用户模式下对操作系统中特权模式的程序的调用;

断点中断指令BKPT主要用于产生软件断点,供调试程序用

13.前导0计数CLZ

对Rd设置为Rm中为1的最高有效位的位置

即对Rm中的前导0的个数进行计数,结果放到Rd     

若Rm=0,则Rd=32     

若Rm[31]=1,则Rd=0

MOV R11,#0x35E20     

CLZ R5,R11        ;R5=?

14.协处理指令(感觉不考,有空看看)

第四章 S5PV210处理器

S5PV210处理器的组成内容:主要由6大部分组成,分别为CPU核心系统外设多媒体电源管理存储器接口Connectivity模块。CPU和各个部分之间通过多层次AHB/AXI总线进行通信。 

第五章 Linux操作系统和内嵌式汇编

Linux 操作系统的基本体系结构

嵌入式系统设计与应用_第2张图片

ARM-Linux内核的主要架构及功能

嵌入式系统设计与应用_第3张图片

进程调度的一般原理:

  • 进程的调度策略(policy)
  • 静态优先级(priority)
  • 动态优先级(counter)
  • 实时优先级(rt-priority)

Policy是进程的调度策略,用来区分实时进程和普通进程,二者调度算法不同,实时进程优先于普通进程.进程按照优先权的高低被依次调用,实时优先级级别最高

选择进程的依据

选择进程的依据主要有进程的调度策略(policy) 静态优先级(priority) 动态优先级(counter) 实时优先级(rt-priority)四个部分.

在Linux中,用函数googness()综合四项依据及其他因素,赋予各影响因素权重,调度程序以权重作为选择进程的依据

在ARM汇编中调用C程序

嵌入式系统设计与应用_第4张图片

C语言中内嵌汇编(字符串复制)

#include 
void my_strcpy(char *scr,const char *dst)
{
int ch;
_ _arm
{loop:
LDRB ch,[src],#1
STRB ch,[dst],#1
CMP ch,#0
BNE loop
}
}
int main(void)
{
const char *a=“Hello woorld!”;
char b[20];
_ _arm
{
MOV R0,a
MOV R1,b
BL my_strcpy,{R0,R1}
}
printf(“Original string:%s\n”,a);
printf(“Copied string:%s\n”,b);
return 0;
}

第十章 SQL数据库

本章只考选择题

SQL数据库是什么样的数据库

MySQL是多用户多进程的SQL数据库系统。MySQL既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。MySQL为多种编程语言提供了 API。支持多线程,充分利用 CPU 资源。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发常选择 MySQL 作为网站数据库。

Sqlite主要特点有:

  • 支持ACID事务。 零配置,即无需安装和管理配置。
  • 储存在单一磁盘文件中的一个完整的数据库。
  • 数据文件可在不同字节顺序的机器间自由共享。
  • 支持数据库大小至2TB。 程序体积小,全部C语言代码约3万行(核心软件,包括库和工具),250KB大小。
  • 相对于目前其他嵌入式数据库具有更快捷的数据操作。
  • 支持事务功能和并发处理。 程序完全独立,不具有外部依赖性。
  • 支持多种硬件平台,如arm/ Linux、SPARC/Solaris等。
  • 便携性
  • 易用性
  • 紧凑性
  • 有效性
  • 可靠性

第十一章 开发设计案例

嵌入式系统设计中基于协同设计概念的系统的设计方法

软硬件协同设计是在系统目标要求的指导下,通过综合分析系统软硬件功能现有资源,协同设计软硬件体系结构,以便能够工作在最佳状态

如图所示为一种典型的嵌入式系统协同设计方法

嵌入式系统设计与应用_第5张图片

传统的嵌入式系统设计和协同设计的区别

传统的嵌入式系统设计:在整个设计过程中,通常采用“硬件优先的原则",即在粗略估计软件任务需求的情况下,首先进行硬件设计,然后在此硬件设计平台上进行软件设计。

协同设计:设计过程中硬件和软件设计是相互作用的,在软硬件功能分配时就考虑到了现有的软硬件资源,在软硬件功能的设计和仿真评价过程中,软件和硬件是互相支持的.

你可能感兴趣的:(数据库,database)