FLASH读取速度与CPU核的工作频率存在偏差,但基于FLASH的程序存储器又是大多数微控制器构成的一个部分.为了速率匹配,PIC32提供了访问FLASH等待周期的接口寄存器:CHECON,最多可以设置7个等待周期;同时,为了不降低系统性能,在总线矩阵BUS Matrix与FLASH存储之前添加了cache;cache逻辑框图见图1
图1 cache逻辑框图
cache可看作16个全关联(见全关联与组联等概念)的RAM数组,每一个称为cache line(16字节),程序对cache line的操作分为两步,1:写CHIDX,索引片选具体的单元;2:读写寄存
器,如CHEMSK,CHETAG等.一般而言,对于cache的寄存器操作往往在初始化中,初始化完毕后,cache基本由自身硬件逻辑维护运行.
PIC32MX微控制器的cache分为指令cache(包括具有地址屏蔽(mask)功能的指令cache两个)12个,数据cache最多可以到4个(具体可编程确定),cache的硬件结构比较复杂,工作原理包含了地址匹配与选中输出.
CPU读取FLASH内容时,被读取的FLASH的物理地址出现在cache的输入端,cache的硬件逻辑将其与cache line中的地址标志域(LTAG)和对应的CHEMSK匹配(不管CHIDX是否为10和11),如果有匹配成功的地址,则将物理地址的低两位作为索引,选择对应cache line(16字节)中的4字节并输出至指令总线,否则将由cache硬件逻辑读取flash存储区,读取时间为设定的flash访问等待周期.
cache的使用中,具有地址屏蔽的指令cache意义是比较明显的.借鉴PIC32数据手册上所讲,如果中断工作在Multi-vector下,且比较频繁时,在中断入口后前16字节完全相同的情况下,使用具有地址屏蔽的指令cache可以节省很多时间.具体使用方法是LTAG[23...4]作为中断基地址,CHEMSK[15...5]作为相邻中断的代码存储空间间隔.以间隔为32个字节为例:
若中断基地址为-0x9FC01000,CHEMSK中LMASK为0x001,
产生CPU中断1时,CPU产生的FLASH存储地址为0x9FC01020,所以要进行屏蔽运算的地址为0x9FC0102.
产生地址:0x9FC01020
屏蔽地址: 0x0020=0x001*32
结果地址:0x9FC0000
产生CPU中断4时,CPU产生的FLASH存储地址为0x9FC01080,所以要进行屏蔽运算的地址为0x9FC0102.
产生地址:0x9FC01080
屏蔽地址: 0x0020=0x001*32
结果地址:0x9FC00080,显然,这个时候的LMASK是覆盖不了的,如果LMASK为0x3FF,则可以覆盖整个中断代码区;前提是一定要保证每一个中断向量入口前4条(或少于4条)指令是完全相同的,最后运行的一条一定要跳转到处理该中断向量处。这样既保证了消耗尽量少的等待周期,同时又能执行正确的中断处理。
cache模块的另外一个功能是指令预取。cache的硬件逻辑假设当前程序的执行是顺序的,它会根据当前程序的存储地址,计算下一个16 bytes的指令位置,并读取FLASH中的指令内容。若16 Bytes字节中包含跳转指令,则执行该指令时,预取的指令会被丢弃。
文章评论(0条评论)
登录后参与讨论