历史上的今天
今天是:2024年12月21日(星期六)
2021年12月21日 | Tiny4412裸机程序之操作ICache
2021-12-21 来源:eefocus
一、首先普及一下什么是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{ 其中, < opcode_1>为协处理器将执行的操作的操作码。对于CP15协处理器来说,< opcode_1>永远为0b000,当< opcode_1>不为0b000时,该指令操作结果不可预知。 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{ 参数用法同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的强大威力!!
史海拾趣
|
据国外媒体报道,众所周知,从5月1日开始,欧洲芯片巨头德国英飞凌的内存业务将分拆为一个独立的公司。而在\"自立门户\"之前,内存业务的表现也十分不俗。据半导体行业市场调研公司iSuppli的报告,今年第一季度,英飞凌内存业务力压韩国现代和美国 ...… 查看全部问答> |
|
自动目标识别(ATR)算法通常包括自动地对目标进行检测、跟踪、识别和选择攻击点等算法。战场环境的复杂性和目标类型的不断增长使ATR算法的运算量越来越大,因此ATR算法对微处理器的处理能力提出了更高的要求。由于通用数字信号处理芯片能够通过编 ...… 查看全部问答> |
|
AVR USART0的一个接收中断程序想不明白?求高手指教!!! 我想写的程序,用串口调试助手通信,发送以*S开头的数据,例如:*S123. 单片机返回是step:123 。如果不是以*S开头,就输出空格。我用的是CVAVR的 这个编译器的生产代码好难看懂,我的想法是将接收的数据URD放 ...… 查看全部问答> |
|
最近台式电脑使用wifi上网,网速很不稳定,于是自己动手改造一下天线,增强接收信号,方法很简单,在原来的天线末端,焊上一条天线上去,我比较懒,直接那一段锡焊了上去,长度与原来电路板上的天线差不多就行,因为天线的长度为接收信号波长的整数 ...… 查看全部问答> |
|
项目名称:单相交流电压、电流表 功能描述:测量某一相交流支路的电压、电流、频率、功率因数 实施方案描述:互感器采样信号,经运放调理进AD,通过算法(fft或者均方根)计算交流电压、电流、频率、功率因数。 预期测量范围:电压0~300V,电流0 ...… 查看全部问答> |
|
/*********************************************************************** 火牛开发板基础实验 &n ...… 查看全部问答> |




