• 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
    海阔凭鱼跃,天高任鸟飞。
  • 相关阅读:
    Win10 企业版ltsc 无法访问samba网络共享问题及解决!(转)
    内核发送uevent的API,用户空间解析uevent(转)
    修改kile工程名字(转)
    gdb调试
    当usbnet打印 kevent * may have been dropped(转)
    收藏一份devmem源码
    Linux Performance
    控制 input框只输入数字
    springboot环境中,可能会出现使用font-Awesome结果图标不显示的问题,在webService的pom文件中添加如下配置代码
    js防止页面抖动(按钮,请求等重复提交)
  • 原文地址:https://www.cnblogs.com/chenshikun/p/5814495.html
Copyright © 2020-2023  润新知