嵌入式 复习.docx
《嵌入式 复习.docx》由会员分享,可在线阅读,更多相关《嵌入式 复习.docx(17页珍藏版)》请在冰豆网上搜索。
嵌入式复习
ARM重点整理
第1章:
1、嵌入式系统定义:
根据IEEE(国际电气和电子工程师协会)的定义:
嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”。
简单讲,就是嵌入到对象体中的专用计算机系统。
从技术的角度定义:
以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
从系统的角度定义:
嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。
2、µC/OS-
定义:
一个源码公开、可移植、可裁剪、占先式的实时多任务操作系统,其绝大部分源码使用ANSIC写的。
特点:
提供源代码、可移植、可固化、可裁剪、可剥夺、多任务、可确定性、任务栈、系统服务、中断管理、稳定性与可靠性。
第2章:
1、ARM体系结构
ARM处理器为RISC芯片,其简单的结构使ARM内核非常小,这使得器件的功耗也非常低。
它具有经典RISC的特点:
(1)大的、统一的寄存器文件;
(2)装载/保存结构,数据处理操作只针对寄存器的内容,而不直接对存储器进行操作;
(3)简单的寻址模式;
(4)统一和固定长度的指令域,简化了指令的译码。
(5)每条数据处理指令都对算术逻辑单元和移位器控制,以实现ALU和移位器的最大利用;
(6)地址自动增加和减少寻址模式,优化程序循环;
(7)多寄存器装载和存储指令实现最大数据吞吐量;
(8)所有指令的条件执行实现最快速的代码执行。
2、三级流水线:
正常操作过程中,在执行一条指令的同时对下一条(第二条)指令进行译码,并将第三条指令从存储器中取出。
ARM处理器使用流水线来增加处理器指令流的速度,使得几个操作可同时进行,处理和存储器系统可连续操作,能提供0.9MIPS/MHz的指令执行速度。
3、处理器状态:
ARM7TDMI处理器内核使用V4T版本的ARM结构,该结构包含32位ARM指令集和16位Thumb指令集。
因此ARM7TDMI处理器有两种操作状态:
ARM状态:
32位,这种状态下执行的是字方式的ARM指令;
Thumb状态:
16位,这种状态下执行半字方式的Thumb指令。
注意:
两个状态之间的切换并不影响处理器模式或寄存器内容。
4、处理器模式:
ARM体系结构支持7种处理器模式,分别为:
用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式,如下表所示。
这样的好处是可以更好的支持操作系统并提高工作效率。
ARM7TDMI完全支持这七种模式。
处理器模式
说明
备注
用户(usr)
正常程序工作模式
不能直接切换到其它模式
特权模式
系统(sys)
用于支持操作系统的特权任务等
与用户模式类似,但具有可以直接切换到其它模式等特权
异常模式
快中断(fiq)
支持高速数据传输及通道处理
FIQ异常响应时进入此模式
中断(irq)
用于通用中断处理
IRQ异常响应时进入此模式
管理(svc)
操作系统保护代码
系统复位和软件中断响应时进入此模式
中止(abt)
用于支持虚拟内存和(或)存储器保护
在ARM7TDMI没有大用处
未定义(und)
支持硬件协处理器的软件仿真
未定义指令异常响应时进入此模式
4、内部寄存器:
在ARM7TDMI处理器内部有37个用户可见的寄存器。
所有的37个寄存器,分成两大类:
31个通用32位寄存器、6个状态寄存器。
在汇编语言中寄存器R0~R13为保存数据或地址值的通用寄存器。
它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。
寄存器R13常作为堆栈指针(SP)。
用于保存待使用的寄存器的内容。
R14为链接寄存器(LR),在结构上有两个特殊功能:
当使用BL指令调用子程序时,返回地址将自动存入R14中;
当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
寄存器R15为程序计数器(PC),它指向正在取指的地址。
可以认为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。
如果R15使用的方式超出了这些限制,那么结果将是不可预测的
5、CPSR标志位:
N运算结果的最高位反映在该标志位。
对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0;
Z指令结果为0时Z=1(通常表示比较结果“相等”),否则Z=0;
C当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0。
当进行减法运算(包括CMP指令),并且最高位产生借位时C=0,否则C=1。
对于结合移位操作的非加法/减法指令,C为从最高位最后移出的值,其它指令C通常不变;
V当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。
CPSR控制位:
CPSR的最低8位为控制位,当发生异常时,这些位被硬件改变。
当处理器处于一个特权模式时,可用软件操作这些位。
它们分别是:
中断禁止位;T位;模式位。
中断禁止位包括I和F位:
当I位置位时,IRQ中断被禁止;当F位置位时,FIQ中断被禁止。
T位反映了正在操作的状态:
当T位置位时,处理器正在Thumb状态下运行;当T位清零时,处理器正在ARM状态下运行。
模式位包括M4、M3、M2、M1和M0,这些位决定处理器的操作模式。
(注意:
不是所有模式位的组合都定义了有效的处理器模式,如果使用了错误的设置,将引起一个无法恢复的错误。
)
6、异常向量表(8个异常向量):
地址
异常类型
进入时的模式
进入时I的状态
进入时F的状态
0x00000000
复位
管理
禁止
禁止
0x00000004
未定义指令
未定义
I
F
0x00000008
软件中断
管理
禁止
F
0x0000000C
中止(预取)
中止
I
F
0x00000010
中止(数据)
中止
I
F
0x00000014
保留
保留
—
—
0x00000018
IRQ中断
禁止
禁止
F
0x0000001C
FIQ
快中断
禁止
禁止
7、异常向量的优先级:
当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序:
8、异常的进入和退出
注意:
中断返回指令的寄存器列表(其中必须包括PC)后的“^”符号表示这是一条特殊形式的指令。
这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复。
这里使用的堆栈指针SP(R13)是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。
这个堆栈指针应必须在系统启动时初始化。
进入异常:
在异常发生后,ARM7TDMI内核会作以下工作:
1.在适当的LR中保存下一条指令的地址,当异常入口来自:
ARM状态,那么ARM7TDMI将当前指令地址加4或加8复制(取决于异常的类型)到LR中;
为Thumb状态,那么ARM7TDMI将当前指令地址加2,加4或加8(取决于异常的类型)复制到LR中;异常处理器程序不必确定状态。
2.将CPSR复制到适当的SPSR中;
3.将CPSR模式位强制设置为与异常类型相对应的值;
4.强制PC从相关的异常向量处取指。
退出异常:
当异常结束时,异常处理程序必须:
1.将LR中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同;
2.将SPSR的值复制回CPSR;
3.清零在入口置位的中断禁止标志。
注:
恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。
第3章:
1、ARM指令的基本格式如下:
{}{S},{,}
其中<>号内的项是必须的,{}号内的项是可选的。
各项的说明如下:
opcode:
指令助记符;cond:
执行条件;
S:
是否影响CPSR寄存器的值;
Rd:
目标寄存器;Rn:
第1个操作数的寄存器;
operand2:
第2个操作数;
灵活的使用第2个操作数“operand2”能够提高代码效率。
它有如下的形式:
#immed_8r——常数表达式;
Rm——寄存器方式;
Rm,shift——寄存器移位方式;
2、
(1)前索引
前索引也称为前变址,在数据传送之前,将先计算基地址与偏移量,其结果作为传送数据的存储地址。
例如:
LDRRd,[Rn,#0x04]!
LDRRd,[Rn,#-0x04]
备注:
其中的惊叹号‘!
’用于指示指令执行后,修改否基址寄存器。
2)后索引
后索引也称为后变址,是用基址寄存器中的地址值寻址,找出操作数进行操作,操作完成后,再把地址偏移量和基址相加/减,结果送到基址寄存器。
例:
LDRRd,[Rn],#0x04
STRRd,[Rn],#-0x08
在后索引中,都会修改基址寄存器(不需要惊叹号后缀)。
第4章:
1、两种常见的ARM编译开发环境
ADS/SDTIDE开发环境:
它由ARM公司开发,使用了CodeWarrior公司的编译器;
EmbestIDE开发环境:
集成了GNU开发工具的IDE开发环境,由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。
2、ATPCS(ARM-ThumbProduceCallStandard)是ARM程序和Thumb程序中子程序调用的基本规则。
目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。
这些基本规则包括子程序调用过程中
(1)寄存器的使用规则:
子程序间通过寄存器R0~R3来传递参数
这时,寄存器R0~R3可以记作A1~A4
在子程序中,使用寄存器R4~R11来保存局部变量
这时,寄存器R4~R11可以记作V1~V8
在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量
(2)数据栈的使用规则:
根据堆栈指针指向位置的不同和增长方向的不同可以分为以下4种数据栈:
FD(FullDescending)满递减
ED(EmptyDescending)空递减
FA(FullAscending)满递增
EA(EmptyAscending)空递增
ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。
(3)参数的传递规则:
参数个数固定的子程序参数传递规则:
第一到四个整数参数,通过寄存器R0~R3来传递,其他参数通过数据栈传递;
参数个数可变的子程序参数传递规则:
当参数不超过4个时,可以使用寄存器R0~R3来传递参数。
当参数超过4个时,还可以使用数据栈来传递参数。
(4)存储器映射
概念:
通过地址映射的方法将各存储器分配到特定的地址范围后,这时用户所看见的存储器分布为存储器映射。
(5)MAM的工作原理
▪使能MAM模块后,ARM内核将通过MAM模块访问Flash存储器。
▪MAM模块中的数据总线宽度为128位,所以一次读取操作可以读出4条ARM指令或8条Thumb指令。
▪Flash存储器被分为两组,当CPU执行其中一组Flash内的指令时,另一组进行读取缓存操作。
▪每个Flash组包含预取指缓存和分支跟踪缓存。
▪预取指缓存区保存有将要执行的指令。
而分支跟踪缓存区保存有程序跳转后可能执行到的指令。
▪当程序向前跳转时,尝试从预取指缓存区取指。
▪当程序向后跳转时,尝试从分支跟踪缓存区取指。
▪如果程序跳转出缓存的范围,CPU将要停止,等待若干个周期,直到正确的指令从Flash中被读出。
(6)中断源
中断使能寄存器(VICIntEnable):
寄存器中每一位控制着一个中断源,各中断源的位置与中断源列表所示相同。
向某位写入1时,允许对应的中断源产生中断。
中断使能清零寄存器(VICIntEnClr):
与中断使能寄存器的功能相反,向某位写入1时,禁止对应的中断源产生中断。
中断选择寄存器(VICIntSelect):
寄存器中每一位控制着一个中断源,各中断源的位置与中断源列表所示相同。
向某位写入1时,对应中断源产生的中断为FIQ中断,否则为IRQ中断。
向量控制寄存器(VICVectCntl0~15):
VICVectCntlx[4:
0]:
分配给此优先级向量IRQ中断的中断源序号;
VICVectCntlx[5]:
该位为1,使能当前优先级的向量IRQ中断。
否则为禁止。
向量地址寄存器(VICVectAddr0~15):
该寄存器中存放对应优先级向量IRQ中断服务程序的入口地址。
向量地址寄存器(VICDefVectAddr):
VICDefVectAddr寄存器存放非向量中断服务程序的入口地址,当发生非向量中断时该寄存器中保存的地址存入VICVectAddr寄存器。
(7)IRQ中断设计实例
(8)UART0
*状态控制寄存器(U0LCR)
字长:
这些位控制数据长度。
00:
5位字符长度;01:
6位字符长度;
10:
7位字符长度;11:
8位字符长度;
停止位:
控制每帧数据包含的停止位个数。
0:
1个停止位;1:
2个停止位;
奇偶使能:
控制是否进行奇偶校验。
如果使能,发送时将添加一位校验位。
0:
禁止奇偶产生和校验;1:
使能奇偶产生和校验;
奇偶选择:
设置奇偶校验类型。
00:
奇数(数据位+校验位=奇数);
01:
偶数(数据位+校验位=偶数);
10:
校验位强制为1;11:
校验位强制为0;
间隔:
当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方(LPC2000)产生间隔中断。
在某些通信方式中,使用间隔中断作为通信的起始信号(如:
LINBus)。
0:
禁止间隔发送;1:
使能间隔发送;
除数锁存:
因为U0DLL和U0RBR/U0THR的地址重叠,通过设置该位可以指定其中某个寄存器操作。
0:
禁止访问除数锁存寄存器;1:
使能访问除数锁存寄存器;
**状态寄存器(U0LSR)
RDR:
接收数据就绪。
判断该位是否置一,决定能否从FIFO中读取数据。
0:
U0RBR为空;
1:
U0RBR中包含有效数据。
从接收FIFO中读走所有数据后,恢复为0。
OE:
溢出错误标志。
当U0RBR寄存器中已经有新的字符就绪,而接收FIFO已满时,该位置位。
0:
接收缓存区没有溢出;
1:
接收缓存区发生溢出错误。
PE:
奇偶校验错误。
在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与U0LCR中的设置不符,将引起奇偶校验错误。
0:
没有发生奇偶校验错误;
1:
发生奇偶校验错误。
读操作使该位恢复为0。
FE:
帧错误标志。
当接收字符的停止位为0时,产生帧错误。
0:
没有发生帧错误;
1:
发生帧错误。
读取该位时恢复为0。
BI:
间隔中断标志。
在发送数据时,如果RXD0引脚保持低电平,将产生间隔中断。
发生间隔中断后,接收模块停止数据接收。
0:
没有发生间隔中断;
1:
发生间隔中断。
THRE:
反映U0THR是否为空,也可以认为发送FIFO是否为空。
0:
不为空;
1:
空。
对U0THR进行写操作,使该位恢复为0。
TEMT:
当发送移位寄存器和U0THR均为空时,该位置位。
0:
不为空;
1:
空。
对U0THR进行写操作,使该位恢复为0。
RXFE:
如果一个带有接收错误(如帧错误、奇偶错误或间隔中断)的字符装入U0RBR时,该位置位。
0:
U0RBR中没有接收错误,或U0FCR[0]为0;
1:
U0RBR中包含至少一个UART0Rx错误。
•使用UART0注意要点
•U0RBR与U0THR在同一地址上,但实际上是两个独立的寄存器,读操作时选择U0RBR,写操作时选择U0THR;
•U0DLL与U0RBR/U0THR、U0DLM与U0IER在同一地址上,通过除数访问位DLAB选择。
当该位为1时,选择U0DLL和U0DLM。
为0时,选择U0RBR/U0THR和U0IER;
•无论在U0FCR中是否使能FIFO,接收FIFO不能被禁止。
关闭FIFO后,接收FIFO只有一个字节缓冲;
•波特率计算公式:
U0DLM、U0DLL=FPCLK/(16×baud);
(9)UART0初始化代码
(9)I2C
I2C接口是Philips推出的一种串行总线方式,用于IC器件之间的通信。
它通过SDA(串行数据线)和SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并通过软件寻址识别每个器件,而不需要片选线。
(10)
SPI传输时序
•使用SPI接口的注意要点
•作主机时,SSEL引脚必须接上拉电阻,不能作为IO口使用;
•作主机时,在发送一字节数据的同时接收一字节数据;
•SPI时钟分频值必须大于或等于8;
•数据寄存器与内部移位寄存器之间没有缓冲区,写SPDR会使数据直接进入移位寄存器。
因此数据只能在上一次数据发送完成后写入SPDR寄存器。
(10)定时器
LPC2000系列“微控制器”具有两个功能强大的定时器,它们具有以下特性:
▪具有32位可编程预分频器;
▪多达4路捕获通道,可设置被捕获信号的特征;
▪4个32位匹配寄存器,可设置匹配发生后的动作;
▪4个对应于匹配寄存器的外部输出,可设置匹配输出的信号特征。
•使用定时器的注意要点
•定时计数器(TC)本身不能产生中断,只有与匹配寄存器发生匹配后才能引起中断事件;
•在定时器匹配发生后,可以不停止定时器工作,而动态修改匹配寄存器的值;
•定时器使用匹配功能的同时,还可以使用捕获功能,而不必分时使用;
•定时器计数时钟频率=Fpclk/(PR+1)
(11)IOS
μC/OS-II是一个完整的、可移植、可固化、可剪裁的占先式实时多任务内核。
•时钟节拍(时钟滴答)Tick,是一种定时器中断,可通过编程方式实现
•时钟节拍是一种特殊的中断,操作系统的心脏。
首先32位的整数OSTime加一。
对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。