浙工大嵌入式考点整理.docx
《浙工大嵌入式考点整理.docx》由会员分享,可在线阅读,更多相关《浙工大嵌入式考点整理.docx(31页珍藏版)》请在冰豆网上搜索。
![浙工大嵌入式考点整理.docx](https://file1.bdocx.com/fileroot1/2023-1/28/3cf5234d-d0c0-4478-b1c1-384ea0dc37c2/3cf5234d-d0c0-4478-b1c1-384ea0dc37c21.gif)
浙工大嵌入式考点整理
嵌入式系统定义
以应用为中心,以计算机技术为基础,软件、硬件可裁减,功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
ARM7架构的3级流水线
取指级:
取指级完成程序存储器中指令的读取,并放入指令流水线中。
译码级:
对指令进行译码,为下一周期准备数据路径需要的控制信号。
这一级指令“占有”译码逻辑,而不“占有”数据路径。
执行级:
指令“占有”数据路径,寄存器被读取,运算单元产生相应的运算结果并回写到目的寄存器中,运算单元的结果则根据指令需求来更改状态寄存器的条件位。
ARM9的5级流水线
取指:
指令从存储器中取出,放入指令流水线。
译码:
指令译码,从寄存器中读取寄存器操作数。
执行:
产生逻辑运算的结果或存储器地址。
访存/缓冲:
如果需要,则访问数据存储器。
否则,ALU的结果只是简单地缓冲一个时钟周期,以便使所有指令具有同样的流水线流程。
回写:
将指令产生的结果回写到寄存器,包括任何从存储器读取的数据。
复杂指令集——CISC精简指令集——RISC
CISC处理器的实现复杂性更高,而RISC编译器的复杂性更高;
CISC处理器功耗高、流水线效率低;
RISC代码密度不高,可执行文件体积较大,汇编代码可读性较差
总线分类按相对于CPU的位置划分片内总线片外总线:
按功能类型数据总线Dbus地址总线Abus控制总线Cbus
总线的主要参数总线宽度又称总线位宽,指的是总线能同时传送数据的位数。
如16位总线就是具有16位数据传送能力。
总线频率总线工作速度的一个重要参数,工作频率越高,速度越快。
通常用MHz表示。
总线带宽又称总线的数据传送率,是指在一定时间内总线上可传送的数据总量,用每秒最大传送数据量来衡量。
总线带宽越宽,传输率越高。
总线带宽(单位:
MB/s)=(总线宽度/8)×总线频率
如:
总线宽度32位,频率66MHZ,则总线带宽=(32/8)*66MHz=264MB/s
一个微处理器系统可能含有多条总线高速总线AHB低速总线APB
嵌入式存储系统是由寄存器、高速缓冲区Cache、主存储器和辅助存储器组成。
SDRAM存储单元可以理解为一个电容,总是倾向于放电,为避免数据丢失,必须定时刷新。
FLASH存储器(可在线进行电写入、电擦除的ROM存储器)有两种主要技术
NORFLASH:
具有SRAM接口,可字节读写、操作速度慢、10万次寿命
NANDFLASH:
多周期寻址,页读写、速度快、需ECC校验、100万次寿命、易产生坏块
存储格式
大端格式:
高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
小端格式:
低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
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),指向正在取指的地址。
R14寄存器与异常
异常类型
偏移
数据中止
8
PC=ADDR+12,返回当前指令
未定义
0
PC=ADDR+8,返回下一条指令
软中断
0
PC=ADDR+8,返回下一条指令
取指异常
4
PC=ADDR+8,返回当前指令
IRQ/FIQ
4
PC=ADDR+12,返回下一条指令
寄存器CPSR为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。
每种异常都有自己的SPSR,在因为异常事件而进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。
CPSR寄存器的格式
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;R2←R3;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];R0←[R1+4]
基址加偏移-带自动索引的前索引寻址LDRR0,[R1,#4]!
;R0←[R1+4]、R1←R1+4
基址加偏移-后索引寻址LDRR0,[R1],#4;R0←[R1]、R1←R1+4
基址加索引寻址LDRR0,[R1,R2];R0←[R1+R2]
相对寻址由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址
BLSUBRl;调用到SUBRl子程序
SUBR1…;BL使用了相对寻址方式
多寄存器寻址一条指令可以完成多个寄存器值的传送。
这种寻址方式可以一次对多个寄存器寻址,最多可传送16个寄存器。
LDMIAR1!
,{R2-R4,R5};R2←[R1],R3←[R1+4],R4←[R1+8],R5←[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)。
块复制寻址多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。
如:
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};
inti;
GPFUP&=0xFFFFFF87;//使能上拉F3-6
GPFCON&=0xC03f;
GPFCON|=0x1540;//将F3-6设为输出口
while
(1)
{
for(i=0;i<4;i++)
{
GPFDAT=ledtab[i];
Delay(70);
}
}
return(0);
}
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、PageAddress、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个周期寻址某一存储单元
相关寄存器
NANDFlash配置寄存器NFCONF 地址0x4E000000
NANDFlash命令设置寄存器NFCMD 地址0x4E000004
NANDFlash地址设置寄存器NFADDR 地址0x4E000008
NANDFlash数据寄存器NFDATA 地址0x4E00000C
NANDFlash操作状态寄存器NFSTAT 地址0x4E000010
NANDFlashECC寄存器NFECC 地址0x4E000014
NandFlash的寻址把一个完整的NandFlash地址分解成ColumnAddress与PageAddress进行寻址。
ColumnAddress只有8位,需配合A8完成一页范围内寻址。
在0~255内时用00h命令,当读取的起始地址是在256~511时,则使用01h命令。
column_addr=0x102;
NF_CMD=; 从2ndhalf开始读取
NF_ADDR=; 1stCycle
NF_ADDR=page_address&0xff; 2nd.Cycle
NF_ADDR=(page_address>>8)&0xff; 3rd.Cycle
NF_ADDR=(page_address>>16)&0xff; 4th.Cycle
读页操作时序
NAND读整页函数
staticvoidReadPage(U32addr,U8*buf) //addr表示flash中的第几页,即‘flash地址>>9’
{
U16i;
NFChipEn(); //使能NandFlash
WrNFCmd(READCMD0);//发送读指令‘0x00’,由于是整页读取,所以选用指令‘0x00’
WrNFAddr(0); //写地址的第1个cycle,即ColumnAddress,由于是整页读取所以取0
WrNFAddr(addr); //写地址的第2个cycle,即A[9:
16]
WrNFAddr(addr>>8); //写地址的第3个cycle,即A[17:
24]
WrNFAddr(addr>>16);//写地址的第4个cycle,即A[25]
WaitNFBusy();//等待系统不忙
for(i=0;i<512;i++)
buf[i]=RdNFDat();//循环读出1页数据
NFChipDs(); //释放NandFlash
}
写页操作时序
NAND写整页函数
staticintWritePage(U32addr,U8*buf) //addr表示flash中的第几页,即‘flash地址>>9’
{
U32i;
NFChipEn(); //使能NandFlash
WrNFCmd(PROGCMD0); //发送写开始指令’0x80’
WrNFAddr(0); //写地址的第1个cycle
WrNFAddr(addr); //写地址的第2个cycle
WrNFAddr(addr>>8);//写地址的第3个cycle
WrNFAddr(addr>>16);写地址的第4个cycle
WaitNFBusy(); //等待系统不忙
for(i=0;i<512;i++)
WrNFDat(buf[i]);//循环写入1页数据
WrNFCmd(PROGCMD1);//发送写结束指令’0x10’
WaitNFBusy(); //等待系统不忙
WrNFCmd(PROGCMD3);//发送读状态指令’0x70’
NFChipDs(); //释放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寄存器的地址是0x4A000004,复位后为0x00000000。
中断屏蔽寄存器(INTMSK)也是由32位组成,每一位与一个中断源相对应。
若某位设置为1,则中断控制器不会处理该位所对应的中断源提出的中断请求。
如果设置为0,则对应的中断源提出的中断请求可以被处理。
INTMSK寄存器的地址是0x4A000008,复位后为0xFFFFFFFF。
中断优先级寄存器(PRIORITY)是IRQ中断模式下的中断优先级控制寄存器,每个中断源在寄存器中有3位对应,分别代表ARB_SEL的2位和ARB_MODE的1位。
该寄存器的地址是0x4A00000C,复位后0x0000007F。
中断未决寄存器(INTPND)是32位寄存器,寄存器中的每一位对应一个中断源。
经过中断优先级仲裁器选出的优先级最高的中断后,这个中断在INTPND对应的位会被置1。
在对于IRQ的中断服务程序中,可以读取寄存器决定那个中断源被处理。
在该位写入1可以清除中断。
该寄存器的地址是0x4A000010,复位后0x00000000。
外部中断控制寄存器共有3个,分别为EXTINT0、EXTINT1、EXTINT2,它们均是可读/可写的,用于对24个外部中断请求信号的有效方式进行选择。
其地址分别为0x56000088、0x5600008c、0x56000090,复位后均为:
0x00000000。
外部中断屏蔽寄存器(EINTMASK)用来作为20个外部中断的屏蔽寄存器。
其地址为0x560000A4,复位后为0x00FFFFF0,此寄存器是可读可写的。
外部中断悬挂寄存器(EINTPEND)用来作为20个外部中断的未决定寄存器。
其地址为0x560000A8,复位后为0x00,此寄存器是可读可写的
例:
利用两个按键触发外部中断EINT0、EINT2,写出中断初始化和服务程序。
staticvoid__irqEint0_ISR(void){
Delay(10);
ClearPending(BIT_EINT0);
Uart_Printf("EINT0isoccurred.\n");
}
staticvoid__irqEint2_ISR(void){
Delay(10);
ClearPending(BIT_EINT2);
Uart_Printf("EINT2isoccurred.\n");
}
//中断初始化函数
voidEint_Init(void)
{
rGPFCON=rGPFCON&~(3)|(1<<1);//GPF0设置为EINT0
rGPFCON=rGPFCON&~(3<<4)|(1<<5);//GPF2设置为EINT2
rGPFUP|=(1<<0);//disableGPF0pullup
rGPFUP|=(1<<2);//disableGPF2pullup
rEXTINT0=(rEXTINT0&~(7<<0))|(2<<0);//EINT0->fallingedgetriggered
rEXTINT0=(rEXTINT0&~(7<<8))|(2<<8);//EINT2->fallingedgetriggered
pISR_EINT0=(unsigned)Eint0_ISR;
pISR_EINT2=(unsigned)Eint2_ISR;
}
//开外部中断
voidEnable_Eint(void)
{
rEINTPEND=0xffffff;//toclearthepreviouspendingstates
rSRCPND|=BIT_EINT0|BIT_EINT2;
rINTPND|=BIT_EINT0|BIT_EINT2;
rEINTMASK=~((1<