Tiny4412裸机程序之操作ICache

发布者:独享留白1028最新更新时间:2022-01-13 来源: eefocus关键字:Tiny4412  裸机程序 手机看文章 扫描二维码
随时随地手机看文章

一、首先普及一下什么是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{}

,< opcode_1>,,,{,}

MCR{} p15,0,,,{,}


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

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

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

作为目标寄存器的协处理器寄存器,其编号可能是C0,C1,…,C15。

两者组合决定对协处理器寄存器进行所需要的操作,如果没有指定,则将为为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{}

,< opcode_1>,,,{,}

MRC{} p15,0,,,{,}


参数用法同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的强大威力!!

关键字:Tiny4412  裸机程序 引用地址:Tiny4412裸机程序之操作ICache

上一篇:Tiny4412裸机程序,时钟操作
下一篇:Exynos4412 裸机开发 —— IIC总线

推荐阅读最新更新时间:2024-11-12 12:19

基于tiny4412的Linux内核移植(支持device tree)(一)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 概述 由于目前友善之臂提供的u-boot不支持uImage的引导方式,默认的配置也不支持
[单片机]
tiny4412学习(二)之移植linux-4.x支持设备树
硬件平台:tiny4412 系统:linux-4.4 文件系统:busybox-1.25 编译器: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320) uboot:友善自带uboot,见上节 实验参考摩斯电码的博客: http://www.cnblogs.com/pengdonglin137/p/5137941.html http://www.cnblogs.com/pengdonglin137/p/5143516.html 一、u-boot修改 1、更新交叉工具链 到:http://www.veryarm.com/arm-none-linux-gnueabi-gcc 下
[单片机]
搭建Tiny4412的Qt交叉开发调试环境
前言 最近在学习Tiny4412下的Qt编程。第一步,首先得搭建好交叉开发调试环境。几经折腾之后,总算基本完成。兹整理一下期间的笔记,发到博客上,作为总结。也希望我入过的坑,其他人避免再入 。 另外提一点(也是事后查网才了解到的),目前业界流行Yocto/OpenEmbedded框架,很多厂商使用这个框架来构建分发开发板的BSP(包括kernel,rootfs,toolchain、gdb、库以及qt的库等),用户可以直接基于该BSP来搭建Qt交叉开发环境,从而免去自己搭建环境时所遇到的诸如依赖库缺失、toolchain版本不匹配等问题,节约了不必要的时间成本。相关案例非常多,“参考资料2~5”里列了几个例子(都未经验证,仅供参考)
[单片机]
搭建<font color='red'>Tiny4412</font>的Qt交叉开发调试环境
Eclipse开发调试ARM裸机程序(五)MMU调试
代码如下: @* @ File:head.S @ 功能:设置SDRAM,将第二部分代码到SDRAM,设置页表,启动MMU, @ 然后跳到SDRAM继续执行 @* @head.S .text .global _start _start: ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈 bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启 bl memsetup @ 设置存储控制器以使用SDRAM bl copy_2th_to_sdram @ 将第二部分代码到SDRA
[单片机]
Eclipse开发调试ARM<font color='red'>裸机</font><font color='red'>程序</font>(五)MMU调试
51单片机程序深入编写裸机代码有助于了解硬件的特性
单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。 若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。为何要加一句while死循环让程序停留在main函数中呢。将while(1);语句去掉有什么影响么? 写一个很简单的程序试一下。 执行以上程序,由P1端口控制的流水灯闪了一下。程序最终进入while(1);里纠缠去了,这个到好解释。 现将while(1);语句屏蔽掉。我还以为程序不能被正确执行了呢,因为退出了main主函数,就像Rende
[单片机]
51单片机<font color='red'>程序</font>深入编写<font color='red'>裸机</font>代码有助于了解硬件的特性
Exynos4412裸机程序,时钟操作
有了上一节《 Exynos4412时钟体系分析 》的基础,这一节我们来做几个和时钟有关的实验。 其实,Exynos 4412的 IROM代码已经设置了PLL,我们可以通过串口把IROM设置的PLL寄存器值打印出来,这些值打印出来是这样的(摘自韦东山老师的《嵌入式Linux系统开发完全手册_基于4412__上册》): CLK_SRC_CPU = 0x01000001 CLK_DIV_DMC0 = 0x00111713 CLK_DIV_DMC1 = 0x01011171 CLK_SRC_TOP0 = 0x01110000 CLK_SRC_TOP1 = 0x00001000 CLK_DIV_TOP = 0x00015470 CLK_SR
[单片机]
Exynos4412<font color='red'>裸机</font><font color='red'>程序</font>,时钟<font color='red'>操作</font>
三星6410裸机程序开发1:tiny6410开发板和裸机开发环境
目前,在帮别人开发一个短距离通信的无线接收模块,需求很简单,本来用简单的51单片机就可以搞定。可是人家偏偏指定要使用500MHz以上的CPU,而且采用裸奔的方式。 当时面对这种奇葩的要求,瞬间无语。幸好,对方允许使用友善之臂的tiny6410核心板。这样下来,开发这个收发器模块也就变得简单了。就权当自己练习吧! tiny6410开发板 硬件上,收发器模块使用tiny6410核心板(如下图所示),底板根据需求自行设计。这不仅可以缩短开发时间,降低开发难度,而且大大节省开发成本。 tiny6410核心板 由于硬件底板没有这么快设计出来,开发时间又短,因此考虑购买现成的6410开发板来开展前期的程序开发及调试工作。所以选择
[单片机]
ARM裸机程序开发——按键控制LED灯
这几天将TQ2440上的IO控制引脚学习了一下,了解了一下关于引脚的一些寄存器的配置,熟悉了一下写ARM裸机程序的流程,写一下自己学到的东西。 ★程序启动初始化 ◇关闭看门狗 有一个专门的寄存器来控制看门狗,看门狗的作用就是在一定的时间内会重新启动系统,这里我们只是写一个简单的逻辑程序用不到看门狗 ,将其关掉。设置WTCON寄存器,将其第5位置0,就可以禁用看门狗 ◇设置栈指针 C语言中设置的变量,以及调用的函数等信息都会被存放在栈中,因此栈指针必须要设置 ◇调用main函数 main函数中设置了关于IO寄存器的一些设置操作 ★TQ2440硬件相关 硬件主要涉及到LED灯与GPIO,按键与GPIO之间的连接 ◇LED灯硬件
[单片机]

推荐帖子

ZigBee规范(一)
TheZigBeeSpecificationisavailabletoindividuals,companiesandinstitutionsfreeofchargeforallnon-commercialpurposes(includinguniversityresearch,technicalevalua-tion,anddevelopmentofnon-commercialsoftware,tools,ordocumentatio
frozenviolet RF/无线
CCS5.3关于MSP430程序的请教!!!
本人用CCS5.3对MSP430F149的例程进行编译,怎么都会出现如图中的错误~~~~急求解答,急求!!!!CCS5.3关于MSP430程序的请教!!!贴源码吧,看起来是没有写P1的中断服务函数我从CC5.3软件上下了很多149的例程,结果编译的时候都会出现那些警告。上面那个是我随便找的一个
zpf10906101 TI技术论坛
TI 狂欢+ simplelink CC2640R2开箱点灯
这次TIsimplelink优惠活动力度不如以前大,但是CC2640R2作为首款BLE5开发板还是非常值得一试的,相对于以前Launchpad经黄黑色包装,新出的CC2640R2包装显然用料就用心多了,盒子也比以前的高上那么一个档次了,如图:Simplelink作为TI大力推广的高度代码复用平台,CC2640R2是也是首个得到支持的BLE无线MCU目测以后TISimplelink平台将会是形成一个很强大的复用体系,最新的无线芯片全都进了simplelink平台
strong161 无线连接
EEWORLD大学堂----2015 TI 音频创新日 (7) 高保真度 (HIFI) 音频产品介绍
2015TI音频创新日(7)高保真度(HIFI)音频产品介绍:https://training.eeworld.com.cn/course/2234EEWORLD大学堂----2015TI音频创新日(7)高保真度(HIFI)音频产品介绍
hi5 模拟电子
AVR的RAM扩展方法
AVR的RAM扩展方法AVR的RAM扩展方法
lorant 嵌入式系统
瑞芯微RK3566开发板OpenHarmony标准系统应用兼容性测试指导触觉智能Purple Pi OH演示
本文OpenHarmony标准系统应用兼容性测试指导,适用鸿蒙系统软件开发测试的新手入门学习课程。设备为触觉智能的瑞芯微RK3566开发板,型号PurplePiOH。是Laval官方社区主荐的一款鸿蒙开发主板。支持Openharmony、安卓Android、Linux的Debian、Ubuntu系统。一、编译兼容性套件举例:以Purple-Pi-OH为例: 首先需要把SDK编译一遍,参考文章: http://www.industio.cn/product-item
Industio_触觉智能 Linux与安卓
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved