浙工大嵌入式考点整理Word格式.docx
《浙工大嵌入式考点整理Word格式.docx》由会员分享,可在线阅读,更多相关《浙工大嵌入式考点整理Word格式.docx(34页珍藏版)》请在冰豆网上搜索。
![浙工大嵌入式考点整理Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/30/c5c71f28-7fe9-42d0-bb18-962de62d913b/c5c71f28-7fe9-42d0-bb18-962de62d913b1.gif)
0x56
0x34
0x4002
0x4003
0n7B
小端格式:
低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
32bit的数0x12345678在Little-endian模式以及Big-endian模式CPU
内存中的存放方式
设计一个C语言程序,判定CPU的大、小端模式
shortintx;
charx0,x1;
x=0x1122;
x0=((char*)&
x)[0];
〃低地址单元
x1=((char*)&
x)[1];
〃高地址单元
若x0=0x11,则是大端;
若x0=0x22,则是小端
嵌入式软件分类系统软件控制、管理计算机系统的资源支撑软件辅助软件开发的工具
应用软件面向应用领域
ARM指令集变种:
T、M、E、D、I、J、F、S
标志
含义
说明
T
支持Thumb指令集
Thumb指令集版本1:
ARMv4T
Thumb指令集版本2:
ARMv5T
Thumb-2:
ARMv6T
D
片上调试
Debug
M
支持长乘法
32位乘32位得到64位,32位的乘加得到64位
I
EmbeddedICE
在线仿真
E
DSP指令
增加了DSP算法处理器指令:
16位乘加指令,带符号数的加减法,双字数据操作,cache预取指令
J
Java加速器Jazelle
提高java代码的运行速度
S
可综合
提供VHDL或Verilog语言设计文件
ARM处理器工作状态
ARM状态,执行32位的、字对齐的ARM指令操作数寄存器的状态(位[0])为0
Thumb状态,执行16位的、半字对齐的Thumb指令操作数寄存器的状态(位[0])为1
处理器模式
备注
用户(usr)
正常程序工作模式
不能直接切换到其它模式
系统(sys)
用于支持操作系统的特权任务等(系统调用)
与用户模式类似,但具有可以直接切换到其它模式等特权
快中断(fiq)
支持高速数据传输及通道处理
FIQ异常响应时进入此模式
中断(irq)
用于通用中断处理
IRQ异常响应时进入此模式
管理(svc)
操作系统保护代码
系统复位和软件中断响应时进入此模式
中止(abt)
用于支持虚拟内存和/或存储器保护
访问无效的地址空间时会进入此模式
未疋义(und)
支持硬件协处理器的软件仿真
未疋义指令异常响应时进入此模式
内部寄存器31个通用32位寄存器;
6个状态寄存器。
R0〜R13为保存数据或地址值的通用寄存器。
它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。
R0〜R7为未分组的寄存器,对应
于相同的32位物理寄存器。
R8〜R14为分组寄存器。
它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器。
R8〜R12有
两个分组的物理寄存器。
一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模
式。
这样在发生FIQ中断后,可以加速FIQ的处理速度。
寄存器R13、R14分别有6个分组的物理寄存器。
一个用于用户和系统模式,其余5个分别用于5种异常模式。
R13堆栈指针(SP)。
在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,
只是习惯上都这样使用
R14链接寄存器(LR)在每种模式下,模式自身的R14版本用于保存子程序返回地址,当
发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
R15为程序计数器(PC),指向正在取指的地址。
莫别
垂克垂在:
'
二峯丰的老称
吾馍式下实賊呵共尋希
寧理
屮止
耒更文
程序计
叫)
R0
Rl(aS)
Rl
R2(a3}
他
R3
R4(vl)
R4
R5(v2)
R5
R6(v3)
R6
R^-4)
RS(v5)
Rfi
RSfiq*
R9(SBj®
R9
KS.fiq*
RKXSLa?
)
RIO
Rn(H»
:
v3)
Rll
R120P)
R12
IU2fkl*
RLXSP]
RU
R13svc*
R13imd*
RB卫i•
Rl4(Lfy
R14
R14sw*
R14it•
R14^md*
R14uq*
R14fiq*
R15
RI6(CPSR)
CPSR
SPSR
无
&
PSR.abt
SPSJiabt
SPSR.uDd
SPSRjrn
SPSRfiq
R14寄存器与异常
异常类型
偏移
数据中止
8
「PC=ADDR+12,返回当前指令
未定义
PC=ADDR+8,返回下一条指令
软中断
取指异常
4
「PC=ADDR+8,返回当前指令
IRQ/FIQ
PC=ADDR+12,返回下一条指令
寄存器CPSR为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器
(SPSR)”可以被访问。
每种异常都有自己的SPSR,在因为异常事件而进入异常时它保存
CPSR的当前值,异常退出时可通过它恢复CPSR。
CPSR寄存器的格式
」模式位
—状态位
—F1Q蔡止
313029282726
N
Z
C
V
溢出标志
进位或借位扩展
零
运算结果符号位
IRQ蔡止
N:
运算结果的最高位。
对于有符号二进制补码,结果为负数时N=1,为正数或零时N=0;
Z:
指令结果为0时Z=1(通常表示比较结果“相等”),否则Z=0;
C:
当进行加法运算最高位产生进位时C=1,否则C=0。
当进行减法运算最高位产生借位时C=0,否则C=1。
对于结合移位操作的非加法/减法指令,C为从最高位最后移出的值,其它指令C通常不变;
V:
当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。
立即寻址操作数直接通过指令给出,数据包含在32位指令编码中,以#为前缀。
0x,0b,0d分别对应16进制、2进制和10进制例:
MOVR1,#0x56000000寄存器寻址把寄存器中的数值作为操作数,指令执行时直接取出寄存器值进行操作。
寄存器内容并不变化例:
MOVR2,R3;
R2JR3;
R3中的内容赋给R2
寄存器移位寻址操作数由寄存器的值做相应移位而得到。
移位的方式在指令中以助记符的
形式给出,而移位的位数可用立即数或寄存器寻址方式表示。
寄存器内容并不变化
例:
MOVR0,R1,LSLR3;
R1<
<
=R3R0=R1
5种位移操作:
LSL/ASL逻辑/算术左移,寄存器中字的低位空出位补0
LSR逻辑右移,寄存器中字的高位空出位补0
ASR算术右移,移位过程中保持符号位不变,即若源操作数为正数,则字的高位空出位补0,否则补1
ROR循环右移,由字的低位移出位填入字的高位空出位
RRX带扩展的循环右移,操作数右移一位高位空出位用原C标志值填充;
寄存器间接寻址寄存器的内容为操作数的地址指针,用[]标示。
操作数存放在存储单元中
例:
LDRR0,[R1]
变址寻址将基址寄存器的内容与指令中给出的偏移量(不超过4KB)相加,形成操作数的有
效地址变址寻址包括基址加偏移和基址加索引寻址两种方式
基址加偏移一前索引寻址LDRR0,[R1,#4];
R0J[R1+4]
基址加偏移一带自动索引的前索引寻址LDRR0,[R1,#4]!
;
R0J[R1+4]、R1JR1+4
基址加偏移—后索引寻址LDRR0,[R1],#4;
R0J[R1]、R1JR1+4
基址加索引寻址LDRR0,[R1,R2];
R0J[R1+R2]
相对寻址由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址
BLSUBRI;
调用至USUBRI子程序
SUBR1…;
BL使用了相对寻址方式
多寄存器寻址一条指令可以完成多个寄存器值的传送。
这种寻址方式可以一次对多个寄存
器寻址,最多可传送16个寄存器。
LDMIAR1!
{R2-R4,R5};
R2J[R1],R3J[R1+4],R4J[R1+8],R5J[R1+12]
堆栈寻址堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。
堆栈寻址
是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存
储单元即是堆栈的栈顶。
存储器堆栈可分为两种:
向上生长:
向高地址方向生长,称为递增堆栈向下生长:
向低地址方向生长,递减堆栈
满堆栈堆栈指针指向最后压入的堆栈的有效数据项
空堆栈堆栈指针指向下一个待压入数据的空位置
堆栈寻址命令包括LDMFA/STMFA、LDMEA/STMEA、LDMFD/STMFD、LDMED/STMED。
LDM和STM表示多寄存器寻址,即一次可传送多个寄存器值。
LDM:
一次装载多个,这里用来出栈。
STM:
一次存储多个,这里用来入栈。
F/E表示指针指向的位置
F:
full满堆栈,表示堆栈指针指向最后一个入栈的有效数据项
E:
empty空堆栈,表示堆栈指针指向下一个要放入的空地址
A/D表示堆栈的生长方式
A:
堆栈向高地址生长,即递增堆栈(Ascend)。
D:
堆栈向低地址生长,即递减堆栈(Descend)。
-RO
_R1满递减
-KZSTMFDR13!
f{RO-R3}
-m
•RL满递减
LDMFDR13!
}{RO〜
*R3
块复制寻址多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。
如:
STMIAR0!
{R1-R7};
将R1〜R7的数据保存到存储器中。
;
存储指针在保存第一个值之后增加,;
增长方向为向上增长。
A存储指针在保存第一个值前增加B存储指针在保存第一个值后增加
I增加方向为向上增长D增加方向为向下增长
通过控制GPF3,GPF4,GPF5,GPF6的控制实现对LED1,LED2,LED3,LED4亮灭的控制。
LED灯通过电源、限流电阻与ARM的I/O口相连,设计程序使得4个LED轮流闪烁。
#defineGPFCON(*(volatileunsigned*)0x56000050)#defineGPFDAT(*(volatileunsigned*)0x56000054)
#defineGPFUP(*(volatileunsigned*)0x56000058)voidmain()〃流水灯程序
{
unsignedcharledtab[]={0xf7,0xef,0xdf,0xbf};
for(i=0;
i<
4;
i++)
GPFDAT=ledtab[i];
Delay(70);
}
return(O);
S3C2440的存储空间分成8组,通过CS[0:
7]选择。
最大容量是1GB,bank0---5为固定128MB,bank6---7的容量可编程改变,可以是2、4、8、16、32、64、128MB。
S3C2440可以选择从NANDFLASH或NORFLASH启动。
启动NORFLASH只能接到Bank0,其数据线宽只能是16位和32位。
其它存储器的数据线宽可以是16位和32位。
若定义SDRAM的起始地址#define_RAM_STARTADDRESS0x30000000
则可以确定该存储器连接到哪一根GCSn
外部存储器中某一存储单元的地址为:
基地址+偏移地址
外接网卡控制芯片DM9000,其片选端接到GCS4,则内部位于300H地址处的寄存器的实
际地址为:
0x20000000+0x0300=0x20000300
按照K9F1208的组织方式可以分四类地址:
ColumnAddress、halfpagepointer、Page
Address、BlockAddress。
ColumnAddress表示数据在半页中的地址,大小范围0-255,用A[0:
7]表示;
halfpagepointer表示半页在整页中的位置,即在0-255空间还是在256-511空间,用A[8]表示;
PageAddress表示页在块中的地址,大小范围0-31,用A[13:
9]表示;
BlockAddress表示块在flash中的位置,大小范围0~4095,A[25:
14]表示。
K9F1208通过4个周期寻址某一存储单元
l/OO
I/O1
I/O2
1/03
1/04
1/05
1/06
1/07
1stCycle
Ao
Ai
A2
A3
阳
As
Ae
A?
ColumnAddress
2ndCycle
AiO
A11
Al2
Al3
An
Ais
A16
RowAddress
3rdCycle
Ai?
AiS
A20
A21
A22
A23
A24
(PageAddress)
4ihCycle
A25
*L
NOTE:
ColumnAddress:
StartingAddressoftheRegister.
OOhCommand(Read):
Definesthestartingaddressofthe1sthalfoftheregister.01hComrrhandfRead):
Definesthestartingaddressoflhe2ndhalfoftieregis怕
*AflissettoTow"
or"
High"
bytheOOhor01hCommand
*Lmustbesetto"
Low*.
*Thedeviceignoresanyadditionalinputofaddresscyclesthanreguired.
相关寄存器
NANDFlash
配置寄存器
NFCONF
地址
0X4E000000
命令设置寄存器
NFCMD
0X4E000004
地址设置寄存器
NFADDR
0X4E000008
数据寄存器
NFDATA
0X4E00000C
操作状态寄存器
NFSTAT
0X4E000010
ECC寄存器
NFECC
0X4E000014
NandFlash的寻址把一个完整的NandFlash地址分解成ColumnAddress与PageAddress进行寻址。
ColumnAddress只有8位,需配合A8完成一页范围内寻址。
在0~255内时用00h命令,当读取的起始地址是在256~511时,则使用01h命令。
column_addr=0x102;
NF_CMD=;
NF_ADDR=
NF_ADDR=page_address&
Oxff;
NF_ADDR=(page_address>
>
8)&
16)&
读页操作时序
从2ndhalf开始读取
2nd.Cycle
3rd.Cycle
4th.Cycle
OnK^Fl^n^XDC-P
GEs
lew*duringIR
tRF?
CLE
r
two—*
WE
tCRY
ALE0
IR
RE
NAddress
〉~©
out卜gout时扌彳补―X
R/B
PagefRow}Address
tRHZ
tLJI-'
Doutm
NAND读整页函数
staticvoidReadPage(U32addr,U8*buf)//addr表示flash中的第几页,即'
flash地址>
9'
{
U16i;
NFChipEn();
〃使能NandFlash
WrNFCmd(READCMDO);
//发送读指令‘0x00'
由于是整页读取,所以选用指令‘0x00'
WrNFAddr(O);
//写地址的第1个cycle,即卩ColumnAddress,由于是整页读取所以取0
WrNFAddr(addr);
〃写地址的第2个cycle,即卩A[9:
16]
WrNFAddr(addr>
8);
//写地址的第3个cycle,即卩A[17:
24]
16);
//写地址的第4个cycle,即卩A[25]
WaitNFBusy();
//等待系统不忙
512;
buf[i]=RdNFDat();
//循环读出1页数据
NFChipDs();
〃释放NandFlash
写页操作时序
CLEJ—\/中\
staticintWritePage(U32addr,U8*buf)//addr表示flash中的第几页,即'
9{
U32i;
WrNFCmd(PROGCMD0);
//发送写开始指令’0x80'
WrNFAddr(0);
//写地址的第1个cycle
〃写地址的第2个cycle
//写地址的第3个cycle
写地址的第4个cycle
WrNFDat(buf[i]);
//循环写入1页数据
WrNFCmd(PROGCMD1);
//发送写结束指令’0x10'
WrNFCmd(PROGCMD3);
//发送读状态指令’0x70'
//释放NandFlash
returnRdNFDat&
0x01;
//返回写操作结果
在中断控制器中有五个控制寄存器:
中断源未决寄存器,中断模式寄存器,屏蔽寄存器,优
先级寄存器和中断未决寄存器
中断源未决寄存器(SRCPND)由32位构成,每位与一个中断源相关。
当某个中断源产生中断请求服务,则对相应的位置1。
因此该寄存器记录了哪个中断源在等待处理。
注意:
SRCPND寄存器的每一位都由中断源自动置位,而不管中断屏蔽寄存器(INTMASK)中对
应的位是否被屏蔽。
在某个特定中断源的中断服务程序中,SRCPND寄存器的相应位必须
被清除从而保证能收到同一中断源的下一次中断请求。
换言之,如果SRCPND寄存器的某
位始终置1,则总是被认为一个有效的中断请求等待处理。
用户可以通过写数据到SRCPND
寄存器来清除未决位。
数据位为1表示该位置的未决位将清除,而0表示该位置的未决位保
持不变。
SRCPND寄存器的地址是0x4A000000,复位后为0x00000000。
中断模式寄存器(INTMOD)是32位的,S3C2440的中断模式有2种:
FIQ模式和IRQ模式。
如果某位设置成1,则相应的中断按FIQ模式处理。
若设置成0,则按IRQ模式处理。
仅有一个中断源能够在FIQ模式下处理,也就是说,INTMOD仅有一个位可以被置1。
因
此,用户应该将最紧迫的中断源设置为FIQ模式使用。
INTMOD寄存器的地