嵌入式系统的特点
专用、软硬件可剪裁可配置
低功耗、高可靠性、高稳定性
软件代码短小精悍
代码可固化
实时性
弱交互性
软件开发需要专门的开发工具和开发环境
要求开发、设计人员有较高的技能
嵌入式系统发展的4个阶段:
以单芯片为核心的可编程控制器形式的系统
以嵌入式CPU为基础、以简单操作系统为核心的嵌入式系统
以嵌入式操作系统为标志的嵌入式系统
以Internet为标志的嵌入式系统
嵌入式操作系统软硬实时定义和区别
具有强(硬)实时特点的嵌入式操作系统
系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,则被称为硬(强)实时系统。硬实时系统,其系统响应时间在毫秒或微秒级(数控机床)。一个硬实时系统通常在硬件上需要添加专门用于时间和优先级管理的控制芯片, uc/os和VxWorks是典型的实时操作系统。
具有弱(软)实特点的嵌入式操作系统
在软实时系统中,虽然响应时间同样重要,但是超时却不会发生致命的错误。软实时系统则主要在软件方面通过编程实现现实的管理。比如Windows CE、uCLinu是一个多任务分时系统。系统响应时间在毫秒或几秒的数量级上
ARM体系结构的命名规则
ARM {x} {y} {z} {T} {D} {M} {I} {E} {J} {F} {-S}
大括号内的字母可选
x —— 系列号,例如:ARM9中的“9”;
y —— 内部存储管理/保护单元,例如ARM92中的“2”、ARM94中的“4”;
z —— 内含有高速缓存Cache;
T —— 支持16位的Thumb指令集;
D ——支持JTAG片上调试;
M ——支持用于长乘法操作(64位结果)的ARM指令,包含快速乘法器;
I —— 带有嵌入式追踪宏单元ETM(Embedded Trace Macro),用来设置断点和观察点的调试硬件;
E —— 增强型DSP指令(基于TDMI);
J —— 含有Java加速器Jazelle,与Java虚拟机相比,Java加速器Jazelle使Java代码运行速度提高了8倍,功耗降低到原来的80%;
F——向量浮点单元;
S——可综合版本,意味着处理器内核是以源代码形式提供的。这种源代码形式又可以被编译成一种易于EDA工具使用的形式。
ARM9流水线:
5级流水线结构,分别是取指,译码、执行、存储器访问、寄存器写操作。
与3级对比,5级将存储器访问和寄存器写操作分别由流水线来处理,增加处理指令的执行效率。
取指:从指令Cache中读取指令。
译码:对指令进行译码,识别出是对哪个寄存器进行操作并从通用寄存器中读取操作数。
执行:进行ALU运算和移位操作,如果是对存储器操作的指令,则在ALU中计算出要访问的存储器地址。
存储器访问:如果是对存储器访问的指令,用来实现数据缓冲功能(通过数据Cache)。
寄存器回写:将指令运算或操作结果写回到目标寄存器中。
例子:MOV R0,R1 ADD R5,R5,#1 LDR R3,[R4] STR R9,[R13] MOV R6,R7 MOV R8,R7 ADD R0, R0, R2
5级流水线互锁分析:当前指令的执行可能需要前面指令的执行结果,当这时前面的指令没有执行完毕,从而会导致当前指令的执行无法获得合法的操作数,这时就会引起流水线的等待,这种现象在流水线机制里称为互锁。
ARM微处理器的工作模式(7种)
User-用户模式(usr)
ARM处理器正常的程序执行状态
FIQ-快速中断模式(fiq)
用于高速数据传输或通道处理
IRQ-外部中断模式(irq)
用于通用的中断处理
Supervisor-管理模式(svc)
操作系统使用的保护模式
复位、软中断调用(SWI)
Abort-中止模式(abt)
当数据访问或指令预取中止时进入该模式
可用于虚拟存储及存储保护
Undefined-未定义指令异常模式(und)
当未定义的指令执行时进入该模式
可用于支持硬件协处理器的软件仿真
System-系统模式(sys)
运行具有特权的操作系统任务
使用和User模式相同寄存器组
嵌入式处理器的特点
对实时多任务有很强的支持能力
具有功能很强的存储区保护功能
可扩展的处理器结构
嵌入式微处理器必须功耗很低。
ARM异常处理
异常进入
异常(Exception)通常定义为:处理器需要中止指令正常执行的任何情形并转向相应的处理,包括ARM内核产生复位,取指或存储器访问失败,遇到未定义指令,执行软件中断指令,或者出现外部中断等。
在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行
处理器允许多个异常同时发生,它们将会按固定的优先级进行处理
异常返回
异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回(编程完成)
1将SPSR复制回CPSR中
2将链接寄存器LR的值减去相应偏移量(偏移量计算不作要求)后送到PC中
ARM通用寄存器,专用寄存器
ARM 有37个32-Bits长的寄存器
30 个通用寄存器
1个用作CPSR(current program status register)
5个用作SPSR(saved program status registers)
1 个用作PC( program counter)
这些寄存器不能被同时访问取决于处理器的工作状态和工作模式
通用寄存器包括R0~R14,可以分为两类
未分组寄存器R0~R7
分组寄存器R8~R14
未分组寄存器R0~R7
在所有的工作模式下,每个未分组寄存器都指向对应的一个物理寄存器
在中断或异常处理进行工作模式转换时,由于不同的处理器工作模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏
分组寄存器R8~R14
R8~R12
每个寄存器对应2个不同的物理寄存器
当使用FIQ模式时,访问R8_fiq~R12_fiq
当使用其他模式时,访问R8_usr~R12_usr
R13、R14
每个寄存器对应6个不同的物理寄存器
其中一个寄存器是用户模式与系统模式共用
另外5个物理寄存器对应于其他5种不同的工作模式
不同物理寄存器的区分
R13_<mode>
R14_<mode>
mode为:sys_usr(系统_用户模式)、fiq(快速中断模式)、irq (外部中断模式) 、svc(管理模式)、abt(中止模式)、und(未定义指令异常模式)
例如:
R13_usr、R13_fiq、R13_irq
R14_svc、R14_abt、R14_und
R13寄存器
常用作堆栈指针SP(Stack Pointer),一种习惯用法
也可使用其他的寄存器作为堆栈指针
在Thumb指令集中,某些指令强制使用R13作为堆栈指针
在应用程序初始化时,一般都要初始化每种模式下的R13,使其指向该工作模式的栈空间
R14寄存器
也称链接寄存器LR (Link Register)
当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份
BL Label
;下一条指令地址→LR, Label→PC
当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值
其他情况下,R14用作通用寄存器
R15寄存器
R15寄存器用作程序计数器(PC)
ARM状态:位[1:0]为0,位[31:2]用于保存PC
Thumb状态:位[0]为0,位[31:1]用于保存PC
由于ARM体系结构采用了多级流水结构,对于ARM指令集而言,PC总是指向当前执行指令的下两条指令的地址,即PC的值为当前执行指令的地址值加8个字节 (4字节*2 取指(PC)、译码)。
程序状态寄存器的构成
一个当前程序状态寄存器(CPSR)
五个备份程序状态寄存器(SPSR)
备份的程序状态寄存器用来进行异常处理
程序状态寄存器的功能
保存ALU中的当前运行状态
控制允许和禁止中断
设置处理器的工作模式
ARM体系结构的存储结构
从0地址开始的以字节为单位的线性组合
从0字节到3字节放置第一个存储的字数据,从第4个字节到第7个字节放置第二个存储的字数据,依次排列
作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(232字节)
受到物理地址线的限制,一般实际嵌入式处理器最大寻址空间为几百兆
存储器大/小端
RM存储字数据采用两种方法
大端模式(Big endian)
字数据的高字节存储在低地址中
字数据的低字节存放在高地址中
小端模式(Little endian)
低地址中存放的是字数据的低字节
高地址中存放的是字数据的高字节
大端和小端都支持,默认是小端模式
ARM的寻址方式(PPT第3章 第6页)
ARM的寻址方式分为数据处理指令寻址方式和内存访问指令寻址方式。
数据处理指令寻址方式
Operand2(第二个操作数)的寻址方式
立即数寻址方式
寄存器寻址方式
寄存器移位寻址方式
内存访问指令寻址方式
字及无符号字节的Load/Store指令的寻址方式;
杂类Load/Store指令的寻址方式;
批量Load/Store指令的寻址方式;
堆栈操作寻址方式。
Load/Store指令是对内存进行存储/加载数据操作的指令,根据访问的数据格式的不同,这列指令的寻址分为字、无符号字节的Load/Store指令寻址和半字、有符号字节Load/Store指令寻址两大类。
汇编指令语法格式:
LDR {<cond>}{B}{T}<Rd>,<addressing_mode>
STR {<cond>}{B}{T}<Rd>,<addressing_mode>
(1)偏移量为立即数
前变址不回写
[<Rn>,#+/-<immed_offset>]
前变址回写
[<Rn>,#+/-<immed_offset>]!
后变址回写
[<Rn>],#+/-<immed_offset>
(2)偏移量为寄存器的值
前变址不回写
[<Rn>,+/-<Rm>]
前变址回写
[<Rn>,+/-<Rm>]!
后变址回写
[<Rn>],+/-<Rm>
(3)偏移量通过寄存器移位获得
前变址不回写
[<Rn>,+/-<Rm>,<shift>#shift_amount ]
前变址回写
[<Rn>,+/-<Rm>,<shift>#shift_amount]!
后变址回写
[<Rn>],+/-<Rm>,<shift>#shift_amount
半字、有符号字节Load/Store指令寻址(也叫杂类Load/Store指令的寻址方式)
这类指令可用来加载有符号字节、加载有符号半字、加载/存储无符号半字。
加载有符号字节到寄存器:
LDR {<cond>}SB <Rd>,<addressing_mode>
加载有符号半字到寄存器:
LDR {<cond>}SH <Rd>,<addressing_mode>
加载无符号半字到寄存器:
LDR {<cond>}H <Rd>,<addressing_mode>
存储无符号半字到内存:
STR {<cond>}H <Rd>,<addressing_mode>
(1)偏移量为立即数
前变址不回写
[<Rn>,#+/-<immed_offset8>]
前变址回写
[<Rn>,#+/-<immed_offset8>]!
后变址回写
[<Rn>],#+/-<immed_offset8>
(2)偏移量为寄存器的值
前变址不回写
[<Rn>,+/-<Rm>]
前变址回写
[<Rn>,+/-< Rm >]!
后变址回写
[<Rn>],+/-< Rm >
有关例题,直接看ppt第3章和第4章
PLL(锁相环)
PLL是一个相位误差控制系统。它比较输入信号和压控振荡器输出信号之间的相位差,从而产生误差控制电压来调整压控振荡器的频率,以达到与输出信号同频。
锁相环输出频率
MPLL =(m×Fin)/(p×2S)
m = M+8, M:M寄存器的值
p = P+2, P:P寄存器的值
S:S寄存器的值
S3C2410有4种电源管理模式:
正常模式:锁相环工作,为CPU和所有片内外设提供时钟
慢时钟模式:锁相环不工作
CPU等直接使用原始时钟、或原始时钟的分频工作,此模式工作时钟频率低而
使功耗低,并且锁相环不工作也使功耗降低
空闲模式:停止为CPU提供时钟,CPU不工作(其外设均工作)
退出方法:
任何中断请求可唤醒CPU工作,退出空闲模式
掉电模式:时钟模块断电,除了唤醒电路之外所有部分均不供电
系统需分成两部分供电。此模式功耗最低
退出方法:用中断唤醒必须设置外中断
(1)外部中断EINT0---15
(2)实时钟报警中断
S3C2410X串行通信(UART)单元
UART有三个独立的异步串行I/O 端口:UART0、UART1、UART2,每个串口都可以在中断和DMA 两种模式下进行收发。UART支持的最高波特率达230.4kbps。
3个UART都有遵从1.0规范的红外传输功能, UART0、UART1有完整的握手信号,可以连接MODEM。
每个UART 包含:波特率发生器、接收器、发送器和控制单元。波特率发生器以PCLK或UCLK为时钟源。发送器和接收器各包含1个16 字节的FIFO寄存器和移位寄存器。
当发送数据的时候,数据先写到FIFO 然后拷贝到发送移位寄存器,然后从数据输出端口(TxDn)依次被移位输出。被接收的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到FIFO 中。
波特率由一个专用的UART 波特率分频寄存器(UBRDIVn)控制。计算公式如下:
UBRDIVn = (int)(UCLK/(波特率×16) ) – 1
UBRDIVn = (int)(PCLK/(波特率× 16) ) –1
时钟选用UCLK还是PCLK由UART控制寄存器UCONn[10]的状态决定。
UCONn[10] = 0,选用PCLK
UCONn[10] = 1,选用UCLK
UBRDIVn的值必须在1~(216−1)之间
例子:若波特率为115200bps,时钟源频率PCLK为40MHz,除数UBRDIVn应如何计算?
解:UBRDIVn
=( int) (40000000/(115200×16))-1
=( int)(21.7)-1
=20