什么是cache:
基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一类高速的、容量较小的存储
器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU 在一段时间
内使用,这对提高程序的运行速度有很大的作用。这类介于主存和CPU 之间的高速小容量存储器
称作高速cache。主要为了解决主存和CPU之间速度不匹配的问题。
比较常见的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 后才能被启动
第一步:查找cache的控制寄存器
第二步:编写led灯的测试程序(见Tiny之LED裸机驱动)
第三步:实验现象流水灯会变化的快一些
编码实现:
1 // start.S启动代码 2 .global _start 3 4 _start: 5 6 // 把外设的基地址告诉CPU 7 ldr r0, =0x70000000 8 orr r0, r0, #0x13 9 mcr p15,0,r0,c15,c2,4 10 11 // 关看门狗 12 ldr r0, =0x7E004000 13 mov r1, #0 14 str r1, [r0] 15 16 // 设置栈 17 ldr sp, =0x0C002000 18 //cache 控制寄存器 19 ldr r0, 0x72000004 20 // 开启icaches 21 #ifdef CONFIG_SYS_ICACHE_OFF 22 bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache 23 #else 24 orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache 25 #endif 26 mcr p15, 0, r0, c1, c0, 0 27 28 29 // 调用C函数点灯 30 bl main 31 32 halt: 33 b halt 34 35 /////////////////////////////////////// 36 //Tiny6410Addr.h 37 #ifndef _Tiny6410Addr_H 38 #define _Tiny6410Addr_H 39 //GPK 40 #define GPKIO_BASE (0x7F008800) 41 #define rGPKCON0 (*(volatile unsigned*)(GPKIO_BASE+0x00)) 42 #define rGPKDAT (*(volatile unsigned*)(GPKIO_BASE+0x08)) 43 44 #endif 45 ////////////////////////////////////// 46 //clock.c 47 #include "Tiny6410Addr.h" 48 #define GPK4_OUT (1<<4*4) 49 #define GPK5_OUT (1<<4*5) 50 #define GPK6_OUT (1<<4*6) 51 #define GPK7_OUT (1<<4*7) 52 //延时函数 53 void delay() 54 { 55 volatile int i = 0x10000; 56 while (i--); 57 } 58 59 int main() 60 { 61 unsigned int i = 0x10; 62 //将GPK4-7设置为输出 63 rGPKCON0 = GPK4_OUT | GPK5_OUT |GPK6_OUT |GPK7_OUT; 64 //跑马灯式 65 while (1) 66 { 67 rGPKDAT = i; 68 i++; 69 if(i == 0x100) 70 i=0x10; 71 delay(); 72 } 73 74 return 0; 75 } 76 ////////////////////////////// 77 //Makefile 78 led.bin: start.o main.o 79 arm-linux-ld -Ttext 0x50000000 -o led.elf $^ 80 arm-linux-objcopy -O binary led.elf led.bin 81 arm-linux-objdump -D led.elf > led_elf.dis 82 %.o : %.S 83 arm-linux-gcc -o [email protected] $< -c 84 %.o : %.c 85 arm-linux-gcc -o [email protected] $< -c 86 clean: 87 rm *.o *.elf *.bin *.dis -rf
时间: 2024-10-21 14:16:17