380 likes | 479 Views
Coldfire V2 overview. MCF5223X and MCF5225x. bluefeynman@gmail.com. Coldfire V2 core. Coldfire 是 m68k 的改进型 ,1994 年开始 Coldfire 内核基于变长精简指令集 (RISC) 体系结构,整合和 CISC 和 RISC 的优点 变长 RISC 的优点:更高的编码效率与更低的内存占用率 Coldfire V2 具有两个独立的流水线,两者之间由指令缓存器去耦 取指令流水线 (IFP) 负责预取指令,是两级的流水线
E N D
Coldfire V2 overview MCF5223X and MCF5225x bluefeynman@gmail.com
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执行模式 • 两个模式:用户模式和管理员模式(内核模式) • 用户模式:提供大多数应用程序的执行环境,但某些特权指令和资源不能访问 • 内核模式:为操作系统等系统软件提供执行环境,可以执行和访问所有的指令和资源
16个32bits通用寄存器(D0~D7,A0~A7) 1个32bits程序计数器(PC) 1个8bits条件码寄存器(CCR) 4个48bits的EMAC寄存器(不是所有的型号都有) 所有用户模式的寄存器(除去CCR) 16bits的状态寄存器(SR),其低8bits就是CCR 32bits的管理员堆栈寄存器(SSP) 32bits的向量基地址寄存器(VBR) Coldfire V2的寄存器 内核模式 用户模式
D0~D7数据寄存器:存放数据或用作index寄存器,可以1bits,8bits,16bits,32bits操作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位偏移量的程序计数器间接寻址 • 绝对短数据寻址模式 • 绝对长数据寻址模式 • 立即数寻址模式
寄存器直接寻址 • 主要用于存取内核通用数据寄存器 • 举例: MOVE.W D2,D5//将D2的低16位复制到D5低16位 MOVE.L D2,D5//将D2复制到D5 MOVE.B D2,D5//将D2的低8位复制到D5低8位
地址寄存器间接寻址 • 利用地址寄存器A0~A6,间接的访问存储器 • 举例: MOVE.B D2,(A5)//将D2的低8位复制到A5寄存器所指向的存储器空间中 MOVE.W (A3),D1//将A3所指向的存储器中的一个字(16bits)复制到D1
后增地址寄存器间接寻址 • 与地址寄存器间接寻址类似,但在寻址后地址寄存器会自动增加以指向下一个存储单元 • 举例: MOVE.W D2,(A5)+//将D2的低16位复制到A5指向的存储单元,并将A5+2,指向下一个单元 MOVE.L D2,(A5)+//将D2的数据复制到A5指向的存储单元,并将A5+4,指向下一个单元
预减地址寄存器间接寻址 • 与地址寄存器间接寻址类似,但在操作前先将地址寄存器值减,以指向前一个存储单元 • 举例: MOVE.L D2,-(A5)//将D2的内容复制到A5-4的存储器单元
16位偏移量地址寄存器间接寻址 • 访问的存储器地址=地址寄存器的内容+16位的偏移量,偏移量可正可负 • 举例: MOVE.B D4,0x100(A3)//将D4的值复制给A3+0x100所指向的存储器单元(8bits) MOVEA.L #0x1234,A0 MOVE.L D0,0x100(A0)//将D0复制到0x1234+0x100=0x1344的存储器单元(32bits)
变址和8位偏移量地址寄存器间接寻址 • 该寻址模式用于访问存储器空间,它由一个变址寄存器和8位的偏移量以及一个地址寄存器共同生成被访问存储器的地址。
举例: MOVE.L (0x20,A0,D0.L*4),A1 将地址为0x20+A0+D0*4的存储器单元的内容复制到A1寄存器中
16位偏移量的程序计数器间接寻址 • 访问的存储器地址=PC寄存器的内容+16位的偏移量,偏移量可正可负 • 举例: MOVE.L D0,0x100(PC)//将D0的内容复制到0x100+PC指向的存储器单元
变址和8位偏移量的程序计数器间接寻址 • 与变址8位偏移量的地址寄存器间接寻址相似,只是这里引用的是PC寄存器
绝对短数据寻址模式 • 用于寻址存储器空间,利用一个绝对短数据(16bits)来制定被访问的存储器单元地址 • 举例: MOVE.W D5, 0x2000//将D5存储到0x2000地址中
绝对长数据寻址模式 • 用于寻址存储器空间,利用一个绝对长数据(32bits)来制定被访问的存储器单元地址 • 举例: MOVE.L 0x12340000,D4//将地址为0x12340000的存储单元内容载入D4
立即数寻址模式 • 用于将常数载入寄存器 • 举例: MOVE.W #0x4000,D1//将立即数0x4000载入D1
Coldfire异常处理 • 系统异常包括系统错误,设备中断请求和陷阱指令引起的异常 • Coldfire处理异常的流程是先挂起正在执行的程序,将机器状态信息保存到系统堆栈,然后跳转到预定义的异常处理例程入口,执行异常处理例程。一旦完成,处理器将恢复机器状态,重新执行被打断的程序
异常向量表 • Exception Vector Table共256项,coldfire使用前64项,后192项留给用户使用,可以分配给外设中断
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来区分优先级
中断优先级details • Coldfire的中断控制器采用两级中断优先级模式:interrupt level+interrupt priority • 63个中断源可划分成7个interrupt level • 每个interrupt level可最多包括9个interrupt priority • Interrupt level7的优先级别最高,同一level 中interrupt priority 7的优先级最高
Coldfire中断编程简介 • 中断向量号的确定 • 中断控制器相关寄存器 • 注意事项
中断向量号的确定 • 在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)
Interrupt pending Register(IPRHx/IPRLx) • 由两个32bits寄存器组成,共64bits,每位代表对应的中断源是否有未决(pending)的请求。用户只读,不可写。 • IPRLx的bit 0是保留的,必须为0 • 举例:IPRH0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 则表示中断控制器0的33、36、55、56、58、号中断源发生了中断请求,且当前coldfire还没有进行处理
Interrupt Mask Register(IMRHx/IMRLx) • 由两个32bits的IMRHx/IMRLx组成,除去IMRLx的bit 0外,每位对应中断控制器管理的一个中断源,up to 63个中断源 • 如果某位为1,则禁止对应的中断源 • IMRLx的bit 0如果为1,则禁止该中断控制器管理的所有63个中断源
Interrupt Force Register(INTFRCHx/INTFRCLx) • 由两个32bits的INTFRCHx和INTFRCLx组成,其中INTFRCLx的bit 0为保留位,始终为0。其余63bit分别对应该中断控制器管理的63个中断源 • 通过软件设置对应位为1,强制触发对应的中断,而且不受interrupt mask register的限制
Interrupt Request Level register(IRLRx) 记录当前哪些Level上有中断请求
Interrupt Acknowledge Level and Priority Register(IACKLPRx) • 记录中断控制器当前响应的中断Level和priority
Interrupt Control Register(ICRxn) • 对应于每个中断源都有一个中断控制寄存器,用来设置每个中断源的interrupt Level和在该level里的interrupt priority • ICRx1~ICRx7是只读的,不能设置 • ICRx8~ICRx63可以设置
Software Interrupt Acknowledge(SWIACKx) • 什么是SWIACK:Software IACK 允许中断服务程序确定是否有另一个pending的中断请求 • 目的:尽可能的减小中断响应的overhead • 实现方法:在一个ISR的结束,通过软件读取SWIACKx寄存器,如果此时有另一个pending的中断,则读取SWIACKx寄存器将返回该中断的向量号,ISR可以直接跳到该pending中断的ISR执行。这样减小了中断处理时的保存现场/恢复现场的开销 • SWIACKx寄存器是8位的,保存着当前pending的最高level中最高priority的中断向量号(未被屏蔽);如果没有中断pending,其值为0
Level m Interrupt Acknowledge Register(LmIACKx) • 对应于每个interrupt level都有一个LmIACKx寄存器,如对于INTC0的interrupt level 2有一个L2IACK0的寄存器 • 该寄存器8位 • 保存该level中未被屏蔽的priority最高的pending中断向量号
中断编程的注意事项 • 在分配优先级的时候,不要把多个中断源分配到同一个interrupt level的同一个interrupt priority上,否则导致的结果是不确定的 • 一个中断的isr名称应该放在异常向量表中对应中断向量号的位置 • 中断控制器只是提供对中断的整体控制,各个模块仍然需要对各自的中断机制做控制。比如UART模块也有一些寄存器用于使能发送、接收等中断;程序需要同时设置中断控制器的寄存器和模块相应寄存器才能使中断机制正常工作