本文转载自:http://blog.csdn.net/eshing/article/details/37115411

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

目录(?)[+]

 

一、什么是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左右的时间。

tiny4412 裸机程序 五、控制icache【转】的更多相关文章

  1. Tiny4412之C语言实现流水灯,Tiny4412裸机程序[3]

    在前边我们使用汇编完成了一个流水灯实验: Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 ---- - -- -- -- - -- -- 修改: # ${MKBL2} ${SOURCE ...

  2. tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37410571 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  3. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  4. tiny4412 裸机程序 七、重定位代码到DRAM【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...

  5. tiny4412 裸机程序 一、说明【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37109115 首先.我想说明为什么我写这个文档?我自己想学点东西,过于求成,又过于自信,直接买了 ...

  6. tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37115697 一.重定向 对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运 ...

  7. tiny4412 裸机程序 三、关闭看门狗和调用C程序【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37112779 一.原理说明 上是章中大家可能有会觉得奇怪,CPU不是有看门狗嘛?为什么CPU没有 ...

  8. Tiny4412汇编流水灯代码,Tiny4412裸机LED操作【转】

    本转载自:http://www.techbulo.com/1313.html Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 2014年10月20日 ⁄ 裸机程序 ⁄ 共 4171字 ...

  9. 基于KEIL4开发ARM9(S3C2440)的裸机程序

    本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...

随机推荐

  1. MySql (二)入门语句和基本操作

    mysql的入门语句:查看服务器下的库 show databases; 创建库(数据库被创建后它的名字是不可以更改的) create database 数据库名; 2.1.插看当前所在的库 selec ...

  2. Java基础(二)--this关键字及初始化

    构造器: 构造器的名称必须和类名完全相同,所以一般方法的"首字母小写"命名规则并不适合构造器 默认构造器: 也叫无参构造器,作用就是创建一个默认对象,如果你不是手写出来,编译器默认 ...

  3. 02Struts2 环境搭建

    Struts2 环境搭建 1.下载 Apache Struts2 类库 2.建立web工程 3.配置web.xml <?xml version="1.0" encoding= ...

  4. 数据结构与算法(3)- C++ STL与java se中的vector

    声明:虽然本系列博客与具体的编程语言无关.但是本文作者对c++相对比较熟悉,其次是java,所以难免会有视角上的偏差.举例也大多是和这两门语言相关. 上一篇博客概念性的介绍了vector,我们有了大致 ...

  5. Java中对象流使用的一个注意事项

    再写jsp的实验作业的时候,需要用到java中对象流,但是碰到了之前没有遇到过的情况,改bug改到崩溃!!记录下来供大家分享 如果要用对象流去读取一个文件,一定要先判断这个文件的内容是否为空,如果为空 ...

  6. session对象的使用

    session对象的使用 制作人:全心全意 session在网络中被称为会话.由于HTTP协议是一种无状态协议,也就是当一个客户向服务器发出请求,服务器接收请求,并返回响应后,该连接就结束了,而服务器 ...

  7. buf.readUIntBE()

    buf.readUIntBE(offset, byteLength[, noAssert]) buf.readUIntLE(offset, byteLength[, noAssert]) offset ...

  8. sublime 使用笔记

    unbuntu安装sublime---------------------------------------------sudo add-apt-repository ppa:webupd8team ...

  9. Maven学习总结(29)——Maven项目的pom.xml中log4j2配置

        <dependency>         <groupId>org.apache.logging.log4j</groupId>         <a ...

  10. [luoguP2875] [USACO07FEB]牛的词汇The Cow Lexicon(DP)

    传送门 f[i] 表示前 i 个字符去掉多少个 的最优解 直接暴力DP ——代码 #include <cstdio> #include <cstring> #include & ...