tiny4412开发板icache操作程序

2020-03-25来源: eefocus关键字:tiny4412  开发板  icache  操作程序

首先,来介绍关于cache的概念。


cache的作用:


基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,这对提高程序的运行速度有很大的作用。这个介于主存和CPU之间的高速小容量存储器称作高速缓存存储器(Cache)。


启用Cache后,CPU读取数据时,如果Cache中有这个数据的复本则直接返回,否则从主存中读入数据,并存入Cache中,下次再使用(读/写)这个数据时,可以直接使用Cache中的复本。


启用Cache后,CPU写数据时有写穿式和回写式两种方式。


(1)写穿式(Write Through)

任一从CPU发出的写信号送到Cache的同时,也写入主存,可以保证主存的数据能同步地更新。它的优点是操作简单,但由于主存的慢速,降低了系统的写速度并占用了总线的时间。


(2)回写式(Write Back)

为了克服贯穿式中每次数据写入时都要访问主存,从而导致系统写速度降低并占用总线时间,尽量减少对主存的访问次数,又有了回写式。


它是这样工作的:数据一般只写到Cache,这样有可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。但此时可在Cache中设一标志地址及数据陈旧的信息,只有当Cache中的数据被换出或强制进行清空操作时,才能将更新的数据写入主存相应的单元中。这样保证了Cache和主存中的数据一致。


先介绍Cache的两个操作。

(1)清空:把Cache或Write buffer中已经脏的(修改过,但未写入主存)数据写入主存。

(2)使无效:使之不能再用,并不将脏的数据写入主存。


ICache的使用比较简单。系统刚上电或复位时,ICache中的内容是无效的,并且ICache功能是关闭着的。往Icr(CP15协处理器中寄存器1的第12位)写1可以启动ICache,写0可以停止ICache。


ICache一般在MMU开启之后被使用,此时页表中描述符的C位用来表示一段内存是否可以被ICache。若Ctt=1,则允许ICache,否则不允许被ICache。但是,即使MMU没有开启,ICache也可以被使用的,这时CPU读取指令时所涉及的内存都被当做是允许ICache的。


ICache被关闭时,CPU每次读取指令都读取主存,性能非常低。所以,通常尽早启动ICache。


ICache被开启后,CPU每次读取指令时都会先在ICache中查看是否能找到所要的指令,而不管Ctt是0还是1。如果找到了,称为Cache命中,如果找不到,称为Cache缺失。ICache被开启后,CPU的取指分为如下3种情况。


(1)Cache命中且Ctt为1时,从ICache中取出指令,返回给CPU。

(2)Cache缺失且Ctt为1时,CPU从主存中读出指令。同时,一个被称为"8-word linefill"的动作将发生,这个动作把该指令所处区域8个word写进ICache的某个条目中。这有可能会覆盖某个条目,可以使用Pseudo-random算法或round-robin算法在ICahe中选出某个没有被锁定的条目。可以通过CP15协处理器中寄存器1的第14位来选择使用哪种算法。

(3)Ctt为0时,CPU从主存中读取指令。


OK,关于Cache的基本知识已经介绍完毕了。要开启DCache需要先开启MMU,所以这里我们只讲解关于ICache的操作。


在上面已经介绍了,如果要开启ICache,需要操作CP15协处理的寄存器1的bit12,写入1表示开启,写入0表示关闭。


先来看两条操作CP15协处理器的指令:MCR和MRC指令。


MCR:


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

指令的语法格式:


MCR{} p15, {opcode_1} , , , {,}

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


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


作为源寄存器的ARM寄存器,其值被传送到得协处理器寄存器中。不能为PC,当其为PC时,指令操作结果不可预知。


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


附加的目标寄存器或者原操作数寄存器,用于区分同一个编号的不同物理寄存器。当指令中不需要提供附加信息时,将C0指定为,否则指令操作结果不可预知。


提供附加信息,用于区别同一个编号的不同物理寄存器。当指令中指定附加信息时,省略或者将其指定为0,否则指令操作结果不可预知。否则指令操作结果不可预知。


MRC:


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

指令的语法格式:


MRC{} p15, {opcode_2}, , , {,}


操作ICache程序示例;


我们使用前面操作LED循环点亮的程序。首先,不开启ICache,查看LED的亮灭时间间隔。然后开启ICache,查看LED的亮灭时间间隔。


start.S文件内容如下:


.text

.global _start

_start:

//注意:在芯片的iROM中已经开启了ICache;即使这里开启也观察不到什么变化;

//所以这里将ICache关闭,观察LED的亮灭情况;可以和原来的对比发现,速度慢了很多

//将CP15协处理器的C1寄存器的值保存到R0寄存器中

mrc p15, 0, r0, c1, c0, 0

//将R0中的数据的BIT12置0

bic r0, r0, #0x00001000

//将R0中的数据写回CP15协处理器的C1寄存器中

mcr p15, 0, r0, c1, c0, 0

ldr sp, =0x02027400 //设置栈

bl main //跳转到mian函数开始执行

halt_loop: //死循环

b halt_loop

上面的程序中已经做了详细的注释,将ICache禁止了。可以将程序编译并烧写。查看LED的闪亮时间间隔。发现和原来的程序相比LED闪亮周期大了很多。


本文完毕!

关键字:tiny4412  开发板  icache  操作程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492500.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:tiny4412开发板的串口介绍与操作
下一篇:tiny4412开发板时钟操作示例

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

tiny4412内核自带led驱动分析
内核版本:linux-3.5 平台:tiny4412一、关于混杂设备此版本内核led驱动使用的是混杂设备misc,具体misc.c的实现路径:linux-3.5/drivers/char/misc.c这就很大程度简化了我们的驱动代码,没有发现ldd3中提到的各种字符设备注册函数,而是发现了一个misc_register函数(共用的注册函数),这说明led设备是作为杂项设备出现在内核中的,在内核中,misc杂项设备驱动接口是对一些字符设备的简单封装,他们共享一个主设备号,有不同的次设备号,共享一个open调用,其他的操作函数在打开后运用linux驱动程序的方法重载进行装载。二、关于gpio:查找tiny4412
发表于 2020-03-10
tiny4412内核自带led驱动分析
Tiny6410 简单的LED字符设备驱动
首先分析原来:1.查看用户手册led1、led2、led3、led4 连接的分别是 GPK4、GPK5、GPK6、GPK72、查询6410芯片手册下面还需要3个步骤:1、设置GPIO为OUTPUT。   将GPK4、GPK5、GPK6、GPK7设置为输出output=0001   即GPKCON0的19:28都配置为00012、设置GPIO的数据。   将GPKDATA的4:7位赋值为03、设置GPKUP为上拉。   将GPKUP的4:7位设置为103、代码led_driver.c#include <linux/module.h> 
发表于 2020-03-10
Tiny6410 简单的LED字符设备驱动
tiny6410 linux混杂设备 led驱动
#include <linux/miscdevice.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/device.h>#include <linu
发表于 2020-03-09
基於tiny4412的Linux內核移植--- 中斷和GPIO學習(1)
平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動概述這篇博客以一個簡單的按鍵中斷來演示一下有了設備樹後的中斷的使用,其中涉及到新版kernel的pinctrl和gpio子系統。在tiny4412的底板上有四個key,如下:上圖中,在沒有按鍵的時候,對應的GPIO是被拉高的,當按下鍵的時候,對應的GPIO被拉低,從而產生一個下降沿中斷。有了上面的準備,首先我們需要修改設備樹,添加相應的節點和相關的屬性: 1 diff --git a/arch/arm/boot/dts/exynos4412-tiny4412.dts b
发表于 2020-02-17
基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)
平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動我們以控制tiny4412上的LED1和LED2爲例,使用的GPIO是GPM4_0和GPM4_1對應的原理圖如下:datasheet如下:在samsung的pinctrl驅動中加一些調試用的log: 1 diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio
发表于 2020-02-16
Dialog DA14531 SmartBond TINY开发套件,打造低成本物联网系统
专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起备货Dialog Semiconductor的DA14531 SmartBond TINY™开发套件。这是一款用于功率测量和应用开发的全新开发套件,基于DA14531 SmartBond TINY片上系统 (SoC)。该SoC是一款微型超低功耗蓝牙5.1 SoC,具有低功耗、高性价比的特性,可以应用于各种新型物联网 (IoT) 设备,包括不断增长的互联医疗产品市场。 贸泽电子分销Dialog DA14531 SmartBond TINY开发套件的Pro和USB版本。DA14531开发套件Pro版包含一块蓝牙低功耗主板
发表于 2020-02-11
Dialog DA14531 SmartBond TINY开发套件,打造低成本物联网系统
何立民专栏 单片机及嵌入式宝典

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

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