Tiny6410之控制icache驱动

Posted 凌潇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tiny6410之控制icache驱动相关的知识,希望对你有一定的参考价值。

什么是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 $@ $< -c
84 %.o : %.c
85     arm-linux-gcc -o $@ $< -c
86 clean:
87     rm *.o *.elf *.bin *.dis -rf
View Code

以上是关于Tiny6410之控制icache驱动的主要内容,如果未能解决你的问题,请参考以下文章

Linux-2.6.39在Tiny6410上的移植 - 外设驱动移植

Tiny6410之按键裸机驱动

Tiny6410之uart裸机驱动

Tiny6410之LED裸机驱动

Tiny6410之蜂鸣器

Tiny64140之初始化时钟