Tiny4412裸机程序之操做ICache

1、首先普及一下什么是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。工具

2、再介绍一下ARM协处理器CP15及MCR和MRC指令  

在基于ARM的嵌入式应用系统中,存储系统一般是经过系统控制协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。性能

访问CP15寄存器的指令spa

  • MCR   ARM寄存器到协处理器寄存器的数据传送
  • MRC   协处理器寄存器到ARM寄存器的数据传送

MCR指令和MRC指令只能在处理器模式为系统模式时执行,在用户模式下执行MCR指令和MRC指令将会触发未定义指令的异常中断。code

①MCR指令教程

MCR指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中。若是协处理器不能成功地执行该操做,将产生未定义的指令异常中断。ci

指令语法格式:文件上传

MCR{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}
MCR{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}

其中,<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。it

< opcode_1>为协处理器将执行的操做的操做码。对于CP15协处理器来讲,< opcode_1>永远为0b000,当< opcode_1>不为0b000时,该指令操做结果不可预知。io

<Rd>做为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中。

<CRn>做为目标寄存器的协处理器寄存器,其编号多是C0,C1,…,C15。

<CRm>和<opcode_2>二者组合决定对协处理器寄存器进行所须要的操做,若是没有指定,则将为<CRm>为C0,opcode_2为0,不然可能致使不可预知的结果。

The CRm field and opcode_2 field are used to specify a particular action when addressing registers.The opcode_1, opcode_2 and CRm fields should be zero, except when the values specified are used to select the desired operations, in all instructions which access CP15. Using other values will result in unpredictable behavior. Attempting to read from a non-readable register, or writing to a non-writable register will cause unpredictable results.

使用示例:

下面的指令从ARM寄存器R4中中将数据传送到协处理器CP15的寄存器C1中。其中R4为ARM寄存器,存放源操做数,C一、C0为协处理器寄存器,为目标寄存器,opcode_1为0,opcode_2为0。

MCR  p15,  0,  R4,  C1,  C0,  0

②MRC指令

MRC指令将协处理器的寄存器中的数值传送到ARM处理器的寄存器中、若是协处理器不能成功地执行该操做,将产生未定义的指令异常中断。

指令语法格式:

MRC{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}
MRC{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}

参数用法同MCR指令

先介绍到这里,等着开一篇文章专门介绍CP15协处理器的寄存器

3、程序说明

从这一小节开始,咱们加入本身关闭看门狗的代码,尽管IROM已经这样作了:

// 关闭看门狗
ldr r0, =0x10060000
mov r1, #0
str r1, [r0]

基于上一个实验的程序,其余文件不动,咱们只改变start.S文件,增长以下代码:

mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #0x00001000
mcr p15, 0, r0, c1, c0, 0

这样就打开了ICache。

4、程序编译及烧写

1.编译

经过FTP或者其余工具将文件上传到服务器上去,输入make命令进行编译将获得open_ichche.bin文件。

2.烧写

将SD卡插入电脑,并让VmWare里的Ubuntu识别出来,而后执行以下命令:

sudo ./sd_fusing.sh /dev/sdb ../7_open_icache/open_icache.bin

5、上电实验

你会发现LED闪动的频率和上一个实验彻底相同,为何呢?由于IROM的固化代码已经帮咱们启动了icache,若是咱们要想体验icache 的威力,只需修改start.S文件为如下便可:

// 打开icache可提升运行速度
mrc p15, 0, r0, c1, c0, 0
//orr r0, r0, #0x00001000 //打开ICache
bic r0, r0, #0x00001000 //关闭ICache
mcr p15, 0, r0, c1, c0, 0

而后从新编译、烧写、上电运行,你会发现LED的闪动频率慢了不少不少,由此就能够看到ICache的强大威力!!

相关文章
相关标签/搜索