本帖最后由 fjjjnk1234 于 2014-7-26 14:45 编辑
HELPER2416学习笔记2——ICache实验
参与HELPER2416开发板助学计划
通过S3C2416的数据手册可以知道S3C2416有16KB的指令缓存ICache和16KB的数据缓存DCache。
基于程序访问的局限性,在主存和CPU通用寄存器之前设置了一类高速的、容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU在一段时间内使用,这对提高程序的运行速度有很大的作用。这类介于主存和CPU之间的高速小容量存储器称作高速缓冲存储器(Cache)。
当ICache被关闭时(默认就是关闭的),CPU每次取指时都要读取主存,性能非常低。
当Icache被开启后,CPU每次取指时都会先在ICache中查看是否能找到所要的指令,而不管Ctt是0还是1。(Ctt是页描述符的C位,关于这个Ctt,现在还不太明白)。如果找到了,称为Cache命中;如果找不到,称为Cache缺失。ICache被开启后,CPU的取指分为3种情况:
(1)Cache命中且Ctt为1时,从ICache中取出指令,返回CPU。
(2)Cache缺失且Ctt为1时,CPU从 主存中读出指令。同时,一个称为“8-word linefill”的动作将发生,这个动作把该指令所处区域的8个word写进ICache的某个条目中。
(3)Ctt为0时,CPU从主存中读出指令。
开启I-Cache的方法:往CP15协处理器中寄存器1的第12位写1。
关于CP15协处理器的相关内容,我在S3C2416数据手册中没有找到,可能是找得不细心吧。在《ARM体系结构与编程中》找到了相关的内容。在166页,以下相关内容的截图:
本实验主要测试开启ICache的作用。
我尝试在Keil MDK 5.1中做这个实验,结果失败了,看了J-Link的调试信息,好像在工程的汇编代码中已经把ICache打开了。如图:
所以决定在Linux中写了简单的led灯程序测试下,Makefile参考了网友分享的。
ICache.s:
- .code 32
- .globl _start
- _start:
- @close the watchdog
- ldr r0,=0x53000000
- mov r1,#0x00000000
- str r1,[r0]
- @open I-Cache
- orr r0,r0, #0x00001000
- mcr p15,0,r0,c1,c0,0
- @set the GPBCON
- ldr r0,=0x56000010
- mov r1,#0x00000004
- str r1,[r0]
- led_on:
- ldr r2,=0x56000014
- mov r1,#0x00000000
- str r1,[r2]
- bl delay
- led_off:
- mov r1,#0x00000002
- str r1,[r2]
- bl delay
- bl led_on
- delay:
- mov r3,#0x200000
- delay1:
- sub r3,r3,#1
- cmp r3,#0x0
- bne delay1
- mov pc,lr
复制代码
makefile:
OBJ=ICache
ALL_s=$(wildcard *.s)
$(OBJ).bin:$(ALL_S)
arm-linux-gcc -o $(OBJ).o -c -g $(ALL_s)
arm-linux-ld -o $(OBJ) -Ttext 0x40000000 -g $(OBJ).o -o $(OBJ)_elf
arm-linux-objcopy -O binary -S $(OBJ)_elf $(OBJ).bin
clean:
rm *.o *.bin *_elf
先把程序中以下两句注释掉,再解除注释,下载程序后对比可以看到LED灯闪烁的速度快了很多。
论坛ID:fjjjnk1234
提交时间:2014.07.26