一、嵌入式系统概述
1.微处理器相关
1.体系结构
a.冯诺依曼体系
特点:指令和数据公用同一条数据总线
注重:主频、缓存
b.哈佛体系
特点:指令和数据分开存储,使用不同的数据总线进行传输
注重:流水线的层级
缺点:不适用于 跳转(调度)比较频繁的场合
2.RISC与CISC
a.CISC特点:
1.指令多
2.寻址方式多(甚至可以在内存和内存之间进行寻址,而不通过寄存器)
3.2/8法则
b.RISC特点:
1.指令少,好记
2.寻址方式少,一般只支持load/store两类访存指令
3.流水线
2.嵌入式系统的组成
1.软件
操作系统(可选)
应用程序
网络(可选)
2.硬件
a.嵌入式微处理器
分类:
MCU
MPU
DSP
SOC
组成:
内核(arm、mips、ppc)
外设控制器
内部内存(sram,缓存)
b.时钟
c.电源和复位
d.内存
e.至少一个IO通道
f.其他外围设备
3.最小系统
1.处理器
2.时钟
3.内存
4.电源和复位
5.至少一个IO通道
二、ARM内核概述
1.ARM内核特点:
1.采用哈佛体系结构(ARM7TDMI采用冯诺依曼体系,之后统统采用哈佛体系)
2.采用RISC
1.指令长度固定
2.指令较少
3.寻址方式相对单一
3.流水线技术
3.ARM内核系列
ARM7
ARM7TDMI
ARM9
ARM920T
ARM11
StrongARM
Cortex A,M,R
Cortext A8,M3
1.工作状态
1.ARM状态--执行32bit的ARM指令
2.Thumb状态--执行16bit的Thumb指令
注:使用BLX或者BX指令可以切换工作状态
2.内存格式
1.支持big-endian和little-endian模式
little-endian
高字节在高地址,低字节在低地址
以低字节为字的地址
big-endian
低字节在高地址,高字节在低地址
以高字节为字的地址
3.数据类型
字--32bit
半字--16bit
字节--8bit
4.操作模式
------------------------------------以下为“非特权模式”
USER(usr)
------------------------------------以下为“特权模式”
System(sys)
------------------------------------以下为“异常模式”
SuperVisor(svc)
FIQ(fiq)
IRQ(irq)
Abort(abt)
Undefined(und)
特权模式与非特权模式
1.特权模式可以访问系统中所有的资源,而非特权模式仅可以访问部分系统资源
2.特权模式之间可以任意切换,非特权模式要想切换到特权模式只有一种手段:异常
5.寄存器
37个寄存器 = 31个通用寄存器 + 6个状态寄存器
前提:User模式和Sys模式共享同一组寄存器
1.几个特殊的寄存器
R13--sp(stack pointer)--习惯使用r13来代表当前模式下的栈指针
R14--lr(link return register)--用于存放子程序调用的返回地址
R15--pc(program counter)--pc总是指向下一条应该被取值的指令
PSR
MODE[4:0]--模式bit
T[5]--状态bit 1代表Thumb
F[6]--Fiq disable1代表disable
I[7]--Irq disable1代表disable
.
.
.
V[28]--溢出
C[29]--进位/借位
Z[30]--zero 1代表zero
N[31]--Negative
2.R0-R12
普通数据寄存器,被所有模式共用
fiq有自己的r8-r12寄存器
3.R13
每种模式有自己独立的r13,因为每种模式都有独立的栈空间
4.R14
每种模式有自己独立的r14,因为每种异常模式都需要使用r14保存异常产生之前的模式的返回地址
5.R15
所有模式共享
6.CPSR
所有模式共享
7.SPSR
每种异常模式都有自己的SPSR
6.异常
1.异常的种类(7种)
Reset
SWISVC
FIQFIQ
IRQIRQ
Undefined InstructionUND
Data Abort
Prefetch AbortABT
2.ARM开发板加电之后的第一个运行模式:SVC
3.产生异常,系统自动做的事情
1.保留返回地址
将下一条指令的地址(PC-4)保存到对应异常的r14寄存器中
2.备份状态寄存器
将当前模式下的CPSR,保存到对应异常的SPSR
3.切换到对应的异常模式
强制修改CPSR的模式bit,为对应的异常模式
4.到异常向量处,取下一条指令
强制将PC的值修改为对应的异常向量
5.对于有些异常,还会禁用中断标志,以阻止不可预期的异常嵌套
6.如果在产生异常之前处于Thumb状态,产生异常之后,会切换到ARM状态
4.从异常中返回,应该做的事情
1.返回继续执行
将异常模式的lr寄存器的值(进行修正)赋给pc
2.恢复cpsr
将异常模式的spsr赋给cpsr
3.如果设置了中断禁用标志,需要清除
5.异常向量
Reset0x0SVC
Undefined Instruction0x4UND
Software Interrupt0x8SVC
Abort(Prefetch)0xCABT
Abort(Data)0x10ABT
IRQ0x18IRQ
FIQ0x1CFIQ
注意:
1.开发板加电之后,执行的第一条指令的地址为0x0
2.开发板加电之后,第一个运行模式是SVC
3.每个异常向量只有4个字节(FIQ除外),只能放一条跳转指令
4.FIQ放在异常向量的最后,可以节省一条跳转指令
6.异常的优先级
Reset
Data Abort
FIQ
IRQ
Prefetch Abort
UND、SWI
==============================================================
day02 ARM指令和寻址方式
==============================================================
1.ARM指令的特点:
1.RISC
2.长度固定,4个字节
3.所有指令可以条件执行
beq
4.采用load/store体系
只有load、store两类指令可以访问内存
5.三级流水线
PC = 当前正在执行的指令的地址 + 8
2.ARM指令格式
MOV{条件}{s} Rd Rn ...
对于立即数包含在指令内部的汇编指令,立即数的范围一定是有限制的,不可能包括0-4G所有数据
条件码:
EQ
NE
GT
GE
LT
LE
AL always1110
3.常用ARM指令
1.mov指令
movr0,r1; r0 = r1
mov r0,#1;r0 = 1;
mov r1,#0x10;r1 = 0x10
2.add、sub
add r0,r0,r1; r0 = r0 + r1
add r0,r1,r2; r0 = r1 + r2
add r0,r1,#0x3; r0 = r1 + 0x3
3.b,bl
mov r0,#1
bl label
mov r0,#2
loop
b loop
label
mov r0,#3
mov pc,lr
4.cmp指令
cmp r0,r1
cmp r0,#0x10
5.ldr指令
ldr r0,[r1];; r0 = *(unsigned int *)r1;
str r0,[r1];; *(unsigned int *)r1 = r0;
6.orr | and
stmfd sp!,{r0-r12,lr}
==============================================================