A9裸机
Tiny4412裸机程序之操作ICache
一、首先普及一下什么是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。
二、再介绍一下ARM协处理器CP15及MCR和MRC指令
在基于ARM的嵌入式应用系统中,【存储系统】 通常是通过 ‘系统控制协处理器’ :CP15 完成的。CP15包含16个32位的寄存器,其编号为0~15。
访问CP15寄存器的指令
MCR ARM寄存器到协处理器寄存器的数据传送
MRC 协处理器寄存器到ARM寄存器的数据传送
MCR指令和MRC指令只能在处理器模式为系统模式时执行,在用户模式下执行MCR指令和MRC指令将会触发未定义指令的异常中断。
①MCR指令
MCR指令将 ARM处理器的寄存器中的数据 传送到 协处理器寄存器 中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
指令语法格式
MCR{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}
MCR{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}
其中,<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。
< opcode_1>为协处理器将执行的操作的操作码。对于CP15协处理器来说,< opcode_1>永远为0b000,当< opcode_1>不为0b000时,该指令操作结果不可预知。
<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寄存器,存放源操作数,C1、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协处理器的寄存器
三、程序说明
从这一小节开始,我们加入自己关闭看门狗的代码,尽管IROM已经这样做了:
- // 关闭看门狗
- ldr r0, =0x10060000
- mov r1, #
- str r1, [r0]
基于上一个实验的程序,其他文件不动,我们只改变start.S文件,增加如下代码:
- mrc p15, , r0, c1, c0,
- orr r0, r0, #0x00001000
- mcr p15, , r0, c1, c0,
这样就打开了ICache
四、程序编译及烧写
1.编译
通过FTP或者其他工具将文件上传到服务器上去,输入make命令进行编译将得到open_ichche.bin文件。
2.烧写
将SD卡插入电脑,并让VmWare里的Ubuntu识别出来,然后执行如下命令:
- sudo ./sd_fusing.sh /dev/sdb ../7_open_icache/open_icache.bin
如下图所示:
四、上电实验
你会发现LED闪动的频率和上一个实验完全相同,为什么呢?因为IROM的固化代码已经帮我们启动了icache,如果我们要想体验icache 的威力,只需修改start.S文件为以下即可:
- // 打开icache可提高运行速度
- mrc p15, , r0, c1, c0,
- //orr r0, r0, #0x00001000 //打开ICache
- bic r0, r0, #0x00001000 //关闭ICache
- mcr p15, , r0, c1, c0,
然后重新编译、烧写、上电运行,你会发现LED的闪动频率慢了很多很多,由此就可以看到ICache的强大威力!!
完整的程序下载地址(解压密码:WWW.techbulo.Com):
----
A9裸机的更多相关文章
- S03_CH13_ZYNQ A9 TCP UART双核AMP例程
S03_CH13_ZYNQ A9 TCP UART双核AMP例程 13.1概述 ZYNQ中存在两个独立的ARM核,在很多应用场景中往往只需使用其中的1个核心即可.然而,对于复杂的设计,例如多任务,并行 ...
- 基于KEIL4开发ARM9(S3C2440)的裸机程序
本文主要介绍如何使用Keil4开发ARM9(S3C2440)裸机程序. 说明: 一.平台: 操作系统:Windows XP系统 KEIL版本:4.73 开发板:ARM9(S3C2440) 二.建立工程 ...
- tiny4412学习一:编译uboot,体验裸机
首先,我们在ubuntu建立一个自己的文件夹,我的是: /home/wang/tiny_4412下有 datasheet shc(原理图PCB文件夹) src tools src下有 codes ...
- ubuntu15.10跑裸机程序跑.bin文件
1:安装tftp:#apt-get update#apt-get install tftp-hpa tftpd-hpa xinetd2:#cd /srv#mkdir tftp#chmod 777 tf ...
- Cubieboard2裸机开发之(四)定时器操作
前言 在Cubieboard2裸机开发之(三)里用到了一个延时函数delay,它的延时时间是不精确的,因此为了能够精确延时,就需要定时器的配合.定时器可以精确延时的一个重要原因是它的计时时钟(或者说频 ...
- Cubieboard2裸机开发之(二)板载LED交替闪烁
前言 电路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已经说明,两个LED的原理图是一样的.要使两个LED交替闪烁,只需要在点亮蓝色LED,熄灭 ...
- Cubieboard2裸机开发之(一)点亮板载LED
前言 CUbieboard2板载两个LED,一个绿色的,一个蓝色的,其中绿色LED通过三极管与PH20管脚连接,蓝色LED通过三极管与PH21管脚连接,这里只以蓝色LED为例,电路原理图如图1和图2所 ...
- EB-SAM9G45裸机程序下载方法
开发板:EB-SAM9G45 这里提供一种裸程序下载的方法. 在官方提供的下载方法中有手动下载和自动下载,它们都离不开SAM-BA软件,而该软件使用比较麻烦,而且操作不当很容易导致电脑蓝屏,还有一个很 ...
- nrf51822裸机教程-RTC
RTC0被协议栈使用了.所以在跑蓝牙程序的情况下.RTC0不能使用. RTC相关寄存器如下: EVTEN,EVTENSET,EVTENCLR. 这三个寄存器用来设置是否使能某个事件.(TICK,OVR ...
随机推荐
- JS滑动门,JQuery滑动门
<a href="#" id="one1" onmouseover="setTab('one',1,2)" class="h ...
- memcached 使用积累
1.memcahed在windows上的安装 . 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached . 在终端(也即cmd命令界面)下输入 ‘c:\memc ...
- Js popup position which right under target item
<div style="margin-left:600px;"> <div id="Span1" style="color:#eee ...
- chorme模拟微信浏览器
chorme模拟微信浏览器 1.代码填入到图中2出 Mozilla/5.0 (Linux; Android 4.4.4; HM NOTE 1LTEW Build/KTU84P) AppleWebKit ...
- 【Delphi】窗体阴影
procedure TForm1.FormCreate(Sender: TObject); begin SetClassLong(Handle, GCL_STYLE, GetClassLong(Han ...
- CorelDRAW 插件的安装和使用
CorelDRAW 是一款在中国非常受欢迎的图形软件,开放的界面和编程技术,能够对它进行二次开发制作插件,插件大抵有三种gms.cpg.exe格式,下面介绍一下这三种插件的安装和使用方法. 一.gms ...
- Python字符串内建处理函数
#coding=utf-8 __author__ = 'Administrator' # 字符串处理函数 s1 = "study python string function , I lov ...
- xml学习总结(一)
xml DTD 定义元素<!ELEMENT 元素名 元素类型描述 > (1)元素类型描述:任意类型,字符串型,空元素,包含子元素,混合类型 任意类型: <?xml version=& ...
- Pandas之容易让人混淆的行选择和列选择
在刚学Pandas时,行选择和列选择非常容易混淆,在这里进行一下讨论和归纳 本文的数据来源:https://github.com/fivethirtyeight/data/tree/master/fa ...
- ubuntu下Django的下载与安装(三种方法)
方法一: 1下载: 1 安装python,Linux系统下,一般是安装好的,可以输入如下命令查看 python -V 如果没有安装,则需要安装,安装方法如下,首先从官网下载源码,然后: (1) $ t ...