《单片机小白转嵌入式Linux学习记录,基于S3C2440----目录》
CACHE 高速缓存
S3C2440 内部有
16k 指令缓存 16K 数据缓存
通过 CP15 协处理器来控制
程序局部性
a. 时间局部性 在程序执行时,在一段时间内有极大的概率访问同一地址的指令/数据。
b. 空间局部性 在程序执行时,在一段时间内有极大的概率访问相邻地址的指令/数据。
对于高速缓存中的数据存储方式:
地址 : 数据
地址 : 数据
地址 : 数据
地址 : 数据
地址 : 数据
对于高速缓存中的指令存储方式:
地址 : 指令
地址 : 指令
地址 : 指令
地址 : 指令
地址 : 指令
Data CACHE 与 Instruction CACHE 在读取时类似。
以 Data CACHE 为例:地址A 地址B 相邻
1. 程序要读取地址A的数据
a. cpu以地址A查找CACHE,一开始CACHE中无数据 : CACHE MISS
b. cpu把地址A发送到SDRAM,SDRAM返回的不只是地址A的数据, 而是一系列的数据 CACHE LINE = 8 WORD = 32 byte
把返回的数据读入 CACHE : CACHE FILL 并返回A地址对应的数据给 CPU
2. 程序再次读取地址A的数据
a. cpu以地址A查找CACHE,CACHE 有对应的地址,直接读取CACHE中的数据给CPU : CACHE HIT 命中
3. 程序读取地址B的数据
a. cpu以地址B查找CACHE,CACHE 有对应的地址,直接读取CACHE中的数据给CPU : CACHE HIT 命中
......
......
4. 16k CACHE满
a. 将老数据置换出去
b. 填充新数据
write buffer 写入缓冲,由于CPU运行的比较快,写外部硬件比较慢,所以 CPU 可以直接把要写的数据扔给 write buffer 然后去执行下一条指令,write buffer 去和硬件打交道,从而提高CPU运行速度。
Data CACHE 和 write buffer 可以后四种组合方式:s3c2410 585
1. NCNB 不启动 Data CACHE 和 write buffer CPU直接操作外部硬件,适用于外设寄存器操作。
2. NCB 不启动 Data CACHE 启动 write buffer , CPU把要写的数据给 write buffer ,write buffer再把数据写给硬件。
3. WT 启动 Data CACHE 不启动 write buffer , CPU把数据写给 Data CACHE ,Data CACHE 再把数据写给硬件。写通
4. WB 启动 Data CACHE 和 write buffer ,写回 分为两种情况:
miss 未命中: CPU -> write buffer -> 硬件
hit 命中: CPU -> Data CACHE(标记 dirty 脏) -> 合适的时机 -> write buffer -> 硬件
合适的时机:
a. Data CACHE 缓存满需要替换时 会把标记 dirty 的数据 -> write buffer -> 硬件
b. 强刷 flush ,CACHE -> write buffer -> 硬件
--------------------------------------------------------------------
协处理器CP15 管理CACHE 和 MMU
主CPU:r0 - r15
协处理器: c0 - c15 c7 有多个专用寄存器 类似于主CPU的专用寄存器。
协处理器操作:S3C2440 P142
<MCR|MRC>{cond} p#,<expression1>,Rd,cn,cm{,<expression2>}
mcr p15,0,r1,c1,c0,0
mrc : mov register coprocessor 将协处理器寄存器数据 写入 主CPU寄存器
p15 : CP15 协处理器
r1 : 主CPU寄存器
c1 : 协处理器寄存器
c0,0: 区分是哪一个c1 有可能一个寄存器对应多个专用寄存器
mcr p15,0,r1,c1,c0,0 将主CPU 寄存器数据写入 写协处理器 寄存器
演示:
由于 Data CACHE 只能通过地址映射后才能使用。演示 Instruction CACHE
使能 Instruction CACHE 需要 设置协处理器CP15 C1-> 12bit 置 1 启动 Instruction CACHE 。 C1 : Control Register 1 参考S3C2410数据手册 附录 2-11 描述
代码:
在start.s 中添加
-----------------------
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #(1<<12) /* r0 = r0 | (1<<12) */
mcr p15, 0, r0, c1, c0, 0
-----------------------
最近编辑记录 xinxiaoci (2018-06-05 18:09:54)
离线