一、什么是cache
基于程序访问的局限性,在主存和CPU通用寄存器之前设置了一类高速的、容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU在一段时间内使用,这对提高程序的运行速度有很大的作用。这类介于主存和CPU之间的高速小容量存储器称作高速cache。比较常见的cache包括icache和dcache。icache的使用比较简单,系统刚上电时,icache中的内容是无效的,并且icache的功能是关闭的,往CP15协处理器中的寄存器1的bit[12]写1可以启动icache,写0可以停止icache。icache关闭时,CPU每次取指都要读主存,性能非常低。因为icache可随时启动,越早开icache越好。与icache相似,系统刚上电时, dcache中的内容是无效的,并且dcache的功能是关闭的,往CP15协处理器中的寄存器1的bit[2]写1可以启动dcache,写0可以停止dcache。因为 dcache必须在启动mmu后才能被启动,而对于裸机而言,没必要开mmu,所以本教程的程序将不会启动dcache。
二、程序说明
完整代码见目录4_leds_c_icache。相比代码3_led_c_sp,代码4_leds_c_icache与其的唯一区别在于在start.S中增加了控制icache的代码。
相关代码如下:
mrc p15, 0, r0, c1, c0, 0
#ifdef CONFIG_SYS_ICACHE_OFF
bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache
#else
orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache
#endif
mcr p15, 0, r0, c1, c0, 0
如果没有定义CONFIG_SYS_ICACHE_OFF则打开icache,否则关闭icache。至于协处理器的相关指令,可查阅ARM公司的相关手册,或者相关芯片手册或者《arm体系结构与编程》一书等。
三、完整的烧写过程
已将SD卡插入电脑,假设linux识别了SD卡,其识别号为sdb。执行下面命令:
# chmod 777 –R 4_leds_c_icache
# cd 4_leds_c_icache
# make
# cd sd_fuse
# make
# ./ fast_fuse /dev/sdb
四、上电实验
将sd卡插入Tiny4412中,选择sd卡启动,然后上电,可以看到以下现象:
LED正常闪烁,只是闪烁得非常慢,这是因为代码里的延时时间相比以前被增大了10倍。我们知道IROM的固化代码已经帮我们启动了icache,如果要体验icache 的威力,只需通过定义宏CONFIG_SYS_ICACHE_OFF来关闭icache。经测试,当关闭icache时,LED闪烁一次的时间大约需要45秒,而打开icache时,LED闪烁一次则需要35秒左右,可见打开icache节省了10S左右的时间。