0


嵌入式系统设计与应用

第一章 嵌入式系统概述

**嵌入式系统的组成:**以嵌入式处理器为中心,配置存储器、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内核版本V1ARM1V2ARM2V2aARM2aS、ARM3V3ARM6、ARM600、ARM610、ARM7、ARM700、ARM710V4Strong ARM、ARM8、ARM810V4TARM7TDMI、ARM720T、ARM740T、ARM9TDMI、ARM920T、ARM940TV5TEARM9E-S、ARM10TDMI、ARM1020EV6ARM11、ARM1156T2-S、ARM1156T2F-S、ARM1176JZF-S、ARM11JZF-SV7ARM Cortex-M、ARM Cortex-R、ARM Cortex-AV8Cortex-A53/57、Cortex-A72等
比较新的产品所使用的的一些处理器类型

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

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

** Cortex-A8处理器的储存模式**

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

举例:一个32字的0x12345678

大端存储模式
78563412

小端模式在高地址为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。

第三章 ARM指令集

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

ARM条件码
指令条件码助记符CPSR条件标记位值含义0000EQZ置位相等0001NEZ清零不等0010CSC置位无符号>=0011CCC清零无符号<0100MIN置位负0101PLN清零正或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位Z清0无符号>1001LSC清零Z置位无符号<=1010GEN等于V带符号>=1011LTN不等于V带符号<1100GTZ清零且N等于V带符号>1101LEZ置位或N不等于V带符号数<=1110AL忽略无条件执行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 {<cond>} {B} Rd, [Rn, <offset>] {!}
  • 后变址格式 LDR|STR {<cond>} {B} {T} Rd, [Rn],<offset>
  • 相对PC的形式 LDR|STR {<cond>} {B} Rd, LABEL

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

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

式中<offset>是#±<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{<cond>} {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 操作系统的基本体系结构

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

进程调度的一般原理:

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

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

选择进程的依据

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

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

在ARM汇编中调用C程序

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

#include <stdio.h>
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等。
  • 便携性
  • 易用性
  • 紧凑性
  • 有效性
  • 可靠性

第十一章 开发设计案例

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

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

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

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

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

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

标签: 数据库 database

本文转载自: https://blog.csdn.net/qq_45762362/article/details/124201060
版权归原作者 天明2027 所有, 如有侵权,请联系我们删除。

“嵌入式系统设计与应用”的评论:

还没有评论