目录
第一章 嵌入式系统概述
第二章 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处理器发展过程中体系结构的演变(了解)
一些经典的处理器采用的是哪些架构(暂时不知道哪些是经典的处理器)(了解)
体系结构 | 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处理器支持的数据类型
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。
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位字。
相对应的在指令中增加一个字母表示数据类型:
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指令集中有三种基本的数据存取指令:
单字和无符号字节的数据传送指令
半字和有符号字节的数据传送指令
式中
H|SH|SB选择传送数据类型;
其它部分的汇编器格式与传送字和无符号字节相同。
说明:半字传送的地址必须是偶数。
LDR和STR双字:加载两个相邻的寄存器和存储两个相邻的寄存器,64位双字。
句法:
其中: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{
SWPB R1,R1,[R0] 交换字节,将[R0]中的字节数据 读取到R1中,同时将R1中的数据写入到[R0]中
SWP R1,R2,[R3] 交换字数据,将[R3]中的数据读 取到R1中,同时将R2中的数据写入到[R3]中
10.程序状态寄存器与通用寄存器之间的传送指令
ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。
这两条指令分别是:
MRS R0, CPSR ;将CPSR的值复制到R0中
ORR R0, R0, #C0 ;R0的位6和位7置1,即屏蔽外部中断和快速中断
MSR CPSR, R0 ;将R0值写回到CPSR中
11.转移指令
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用于产生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处理器的组成内容:主要由6大部分组成,分别为CPU核心、系统外设、多媒体、电源管理、存储器接口和Connectivity模块。CPU和各个部分之间通过多层次AHB/AXI总线进行通信。
Linux 操作系统的基本体系结构
ARM-Linux内核的主要架构及功能
进程调度的一般原理:
Policy是进程的调度策略,用来区分实时进程和普通进程,二者调度算法不同,实时进程优先于普通进程.进程按照优先权的高低被依次调用,实时优先级级别最高
选择进程的依据
选择进程的依据主要有进程的调度策略(policy) 静态优先级(priority) 动态优先级(counter) 实时优先级(rt-priority)四个部分.
在Linux中,用函数googness()综合四项依据及其他因素,赋予各影响因素权重,调度程序以权重作为选择进程的依据
在ARM汇编中调用C程序
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数据库是什么样的数据库
MySQL是多用户、多进程的SQL数据库系统。MySQL既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。MySQL为多种编程语言提供了 API。支持多线程,充分利用 CPU 资源。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发常选择 MySQL 作为网站数据库。
Sqlite主要特点有:
嵌入式系统设计中基于协同设计概念的系统的设计方法
软硬件协同设计是在系统目标要求的指导下,通过综合分析系统软硬件功能及现有资源,协同设计软硬件体系结构,以便能够工作在最佳状态
如图所示为一种典型的嵌入式系统协同设计方法
传统的嵌入式系统设计和协同设计的区别
传统的嵌入式系统设计:在整个设计过程中,通常采用“硬件优先的原则",即在粗略估计软件任务需求的情况下,首先进行硬件设计,然后在此硬件设计平台上进行软件设计。
协同设计:设计过程中硬件和软件设计是相互作用的,在软硬件功能分配时就考虑到了现有的软硬件资源,在软硬件功能的设计和仿真评价过程中,软件和硬件是互相支持的.