coldfireV2 学习笔记之一
0赞
发表于 1/6/2011 9:59:27 AM
阅读(3284)
Coldfire V2 core
- Coldfire是m68k的改进型,1994年开始
- Coldfire内核基于变长精简指令集(RISC)体系结构,整合和CISC和RISC的优点
- 变长RISC的优点:更高的编码效率与更低的内存占用率
- Coldfire V2具有两个独立的流水线,两者之间由指令缓存器去耦
- 取指令流水线(IFP)负责预取指令,是两级的流水线
- 操作数执行流水线(OEP)负责执行指令,也是两级流水线
- 指令缓存器(instruction buffer)是一个FIFO,起联系上述两个流水线的作用
- Up to 159Dhrystone2.1 MIPS@166MHZ
Coldfire V2流水线

- 指令地址生成器:计算下一个预取指令地址,并送到地址总线准备访问指令存储器
- 取指令:通过数据总线将存储器中的预取指指令写入本级FIFO指令缓存器的空闲区。
- 指令缓存器:是两级FIFO,存放预取指令,并将其发送给OEP
- 译码级:对指令进行译码,并取操作数
- 地址生成执行级:执行实际指令的操作。当执行执行完成后,译码级将从指令缓存器中取下条指令,如果指令缓存器空,则直接从IFP取下条指令
Coldfire V2执行模式
- 两个模式:用户模式和管理员模式(内核模式)
- 用户模式:提供大多数应用程序的执行环境,但某些特权指令和资源不能访问
- 内核模式:为操作系统等系统软件提供执行环境,可以执行和访问所有的指令和资源
Coldfire V2的寄存器
用户模式
- 16个32bits通用寄存器(D0~D7,A0~A7)
- 1个32bits程序计数器(PC)
- 1个8bits条件码寄存器(CCR)
- 4个48bits的EMAC寄存器(不是所有的型号都有)
内核模式
- 所有用户模式的寄存器(除去CCR)
- 16bits的状态寄存器(SR),其低8bits就是CCR
- 32bits的管理员堆栈寄存器(SSP)
- 32bits的向量基地址寄存器(VBR)
- D0~D7数据寄存器:存放数据或用作index寄存器,可以1bits,8bits,16bits,32bits操作
- A0~A6地址寄存器:用于对存储器选址,也可用作index寄存器,software stack寄存器,base address寄存器;可以16bits,32bits操作
- A7和OTHER_A7:通常用作堆栈寄存器(SP).coldfire实现了两个SP,一个是用户模式USP,一个是内核模式SSP.A7代表当前模式下的SP,OTHER_A7则代表另一个模式下的SP
- CCR是SR的低8位,可以在用户模式下访问;而SR高8位只能在内核模式下访问
- PC寄存器存放当前正在执行的指令地址,当一条指令执行完时,PC自动增加,指向下条指令
- 向量基地址寄存器(VBR):存储coldfire异常向量表的基地址,复位时VBR=0指向0x0处的异常向量表
Coldfire的寻址模式
- 寄存器直接寻址模式
- 地址寄存器间接寻址
- 后增地址寄存器间接寻址
- 预减地址寄存器间接寻址
- 16位偏移量地址寄存器间接寻址
- 变址和8位偏移量地址寄存器间接寻址
- 16位偏移量的程序计数器间接寻址
- 变址和8位偏移量的程序计数器间接寻址
- 绝对短数据寻址模式
- 绝对长数据寻址模式
- 立即数寻址模式
Coldfire异常处理
- 系统异常包括系统错误,设备中断请求和陷阱指令引起的异常
- Coldfire处理异常的流程是先挂起正在执行的程序,将机器状态信息保存到系统堆栈,然后跳转到预定义的异常处理例程入口,执行异常处理例程。一旦完成,处理器将恢复机器状态,重新执行被打断的程序
Coldfire中断架构
- 与M68K相同,处理器支持7level中断,其中level7优先级最高;发生中断时,中断控制器会把该中断的level发送给coldfire
- Coldfire核收到中断level后,会与SR寄存器的10:8位interrupt mask对比,如果大于interrupt mask,则响应该中断
- 一旦进入中断响应处理,处理器自动切换到内核模式,禁止Trace mode,同时设置SR的interrupt mask等于该中断的level,然后获取中断向量号,并在内存中创建一个异常堆栈帧,保存PC和SR,接着跳转到中断服务程序
- 中断服务程序的第一个指令通常是重新装载SR,这样可以实现对中断嵌套的任意控制
- Isr执行完成后,处理器会恢复SR和PC,继续被打断的程序流程
Coldfire中断控制器
- Coldfire处理器集成了1个至3个中断控制器,MCF5223X和MCF5225x集成了2个控制器
- 每个中断控制器最多管理63个中断源,每一个中断源分配一个唯一的中断向量号
- Coldfire中断控制器支持两级优先级控制:interrupt level和interrupt priority
- 中断控制器支持7级中断嵌套,高优先级中断可以中断低优先级中断
- 每个中断控制器支持7级中断level,1级优先级最低,7级最高;可以将多个中断源分配到同一级level上
- 如果处于同一level的多个中断同时发生,则通过各中断的interrupt priority来区分优先级
中断向量号的确定
- 在coldfire MCU的参考手册上,每个中断控制器用中断源号标识各个中断
- 但coldfire处理器本身在响应中断时采用的是中断向量号,具体编写isr时也是根据中断向量号来确定isr在异常向量表中的位置的
- 转换公式:
INTC0:中断向量号=64+中断源号
INTC1:中断向量号=128+中断源号
中断控制器寄存器
- Interrupt pending Register(IPRHx/IPRLx)
- Interrupt Mask Register(IMRHx/IMRLx)
- Interrupt Force Register(INTFRCHx/INTFRCLx)
- Interrupt Request Level register(IRLRx)
- Interrupt Acknowledge Level and Priority Register(IACKLPRx)
- Interrupt Control Register(ICRxn)
- Software Interrupt Acknowledge(SWIACKx)
- Level m Interrupt Acknowledge Register(LmIACKx)
x代表第几个中断控制器(x=0,1,2)
n代表该中断控制器管理的中断源号(n=1~63)
m代表Interrupt Level的数值(m=1~7)
