当前位置: 首页 > news >正文

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, #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

四、程序编译及烧写

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, 0, r0, c1, c0, 0
//orr r0, r0, #0x00001000 //打开ICache
bic r0, r0, #0x00001000 //关闭ICache
mcr p15, 0, r0, c1, c0, 0

 

然后重新编译、烧写、上电运行,你会发现LED的闪动频率慢了很多很多,由此就可以看到ICache的强大威力!!

 

完整的程序下载地址(解压密码:WWW.techbulo.Com):

 

 

 

 

 

 

 

 

----

 

转载于:https://www.cnblogs.com/Ph-one/p/4546861.html

相关文章:

  • Tiny4412汇编流水灯代码,Tiny4412裸机LED操作[1]
  • Exynos 4412的启动过程分析[2]
  • Tiny4412之C语言实现流水灯,Tiny4412裸机程序[3]
  • sudo: ./sd_fusing.sh:找不到命令
  • 2.2linux内核移植简介
  • linux0.11文件分析
  • Linux内核3.0移植并基于Initramfs根文件系统启动
  • linux系统灵活运用灯[android课程3]
  • linux ramdisk
  • fork()和vfork()区别
  • linux上进程状态查询
  • LINUX进程优先级实现
  • linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?
  • Linux上程序执行的入口--Main
  • minitools
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • canvas绘制圆角头像
  • CSS 提示工具(Tooltip)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • LeetCode29.两数相除 JavaScript
  • Less 日常用法
  • Mac转Windows的拯救指南
  • PAT A1017 优先队列
  • Python利用正则抓取网页内容保存到本地
  • session共享问题解决方案
  • web标准化(下)
  • Web设计流程优化:网页效果图设计新思路
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 一道闭包题引发的思考
  • 转载:[译] 内容加速黑科技趣谈
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (十)c52学习之旅-定时器实验
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)大型网站的系统架构
  • (转载)利用webkit抓取动态网页和链接
  • .cfg\.dat\.mak(持续补充)
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .libPaths()设置包加载目录
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net各种迷惑命名解释
  • :中兴通讯为何成功
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [BZOJ3223]文艺平衡树
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件