PLC解密网-PLC培训学习-工控自动化人才技术交流

超级管理员

453

帖子

1378

回复

3110

积分

楼主
发表于 2020-10-20 16:02:02 | 查看: 2635 | 回复: 3

1.5.4.汇编写启动代码之开iCache

1.5.4.1、什么是cache,有什么用

cache是一种内存,叫高速缓存。

从容量来说:CPU < 寄存器 < cache < DDR

从速度来说:CPU >  寄存器 > cache > DDR

cache的存在,是因为寄存器和ddr之间速度差异太大,ddr的速度远不能满足寄存器的需要(不能满足cpu的需要,所以没有cache会拉低整个系统的整体速度)

整个系统中CPU的供应链由:寄存器+cache+DDR+硬盘/flash四阶组成,这是综合考虑了性能、成本后得到的妥协的结果。

210内部有32KB icache和32kb dcache。icache是用来缓存指令的;dcache是用来缓存数据的。


cache的意义:指令平时是放在硬盘/flash中的,运行时读取到DDR中,再从DDR中读给寄存器,再由寄存器送给cpu。但是DDR的速度和寄存器(代表的就是CPU)相差太大,如果CPU运行完一句再去DDR读取下一句,那么CPU的速度完全就被DDR给拖慢了。解决方案就是icache。

icache工作时,会把我们CPU正在运行的指令的旁边几句指令事先给读取到icache中(CPU设计有一个基本原理:代码执行时,下一句执行当前一句代码旁边代码的可能性要大很多)。当下一句CPU要指令时,cache首先检查自己事先准备的缓存指令中有没这句,如果有就直接拿给CPU,如果没有则需要从DDR中重新去读取拿给CPU,并同时做一系列的动作:清缓存、重新缓存。


1.5.4.2、iROM中BL0对cache的操作

首先,icache的一切动作都是自动的,不需人为干预。我们所需要做的就是打开/关闭icache。

其次,在210的iROM中BL0已经打开了icache。所以之前看到的现象都是icache打开时的现象。

1.5.4.3、汇编代码读写cp15以开关icache

mrc p15,0,r0,c1,c0,0; // 读出cp15的c1到r0中

bic r0, r0, #(1<<12) // bit12 置0  关icache

orr r0, r0, #(1<<12) // bit12 置1  开icache

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

1.5.4.4、实验验证

我们来看三种情况下的实验现象:

1 直接使用BL0中对icache的操作

2 关icache

3 开icache

实验结果分析:

结论1:irom中确实是打开了icache的。

结论2:icache关闭确实比icache打开时led闪烁变慢,说明指令执行速度变慢。



超级管理员

453

帖子

1378

回复

3110

积分
沙发
发表于 2020-10-20 16:05:14

image.png

超级管理员

453

帖子

1378

回复

3110

积分
板凳
发表于 2020-10-20 16:23:08

arm汇编 bic和orr指令

1. bic BIC指令的格式为: BIC{条件}{S}  目的寄存器,操作数1,操作数2

BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。

操作数1应是一个寄存器, 操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。

操作数2为32位的掩码,如果在 掩码中置了某一位1,则清除这一位。未设置的掩码位保持不变。

 

bic r0,r0,#0x1f

0x1f=11111b

其含义:清除r0的bit[4:0]位。

 

2. orr ORR指令的格式为: ORR{条件}{S}  目的寄存器,操作数1,操作数2

ORR指令用于在两个操作数上进行逻辑戒运算,并把结果放置到目的寄存器中。

操作数1应该是一 个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

该指令常用于设置操 作数1的某些位。

指令示例: ORR R0,R0,#3          ;  

该指令设置R0的0、1位,其余位保持不变。  

orr r0,r0,#0xd3    

0xd3=1101 0111    

将r0与0xd3作算数或运算,然后将结果返还给r0,即把r0的bit[7:6]和bit[4]和bit[2:0]置为1。


超级管理员

453

帖子

1378

回复

3110

积分
地板
发表于 2020-10-20 16:35:50

start.S:


#define WTCON   0XE2700000

#define SVC_STACK 0XD0037D80


.global _start // 把_start链接属性改为外部,这样其他文件就可以看见_start了

_start:

//第1步关看门狗

ldr r0, =WTCON

ldr r1, =(0<<5)

str r1, [r0]


//第2步:设置栈

ldr sp, =SVC_STACK

//第3步:初始化icache

mrc p15,0,r0,c1,c0,0; //读出cp15的c1到r0中

//bic r0, r0, #(1<<12); //bit12 置0 关icache

orr r0, r0, #(1<<12); //默认是打开的 bit12 置1 开icache

mcr p15,0,r0,c1,c0,0; //把r0写入到cp15的c1中

//从这之后就可以开始调用c程序了


您需要登录后才可以回帖 登录 | 立即注册

技术支持 KZYPLC V2.1 © 2020-2027

欢迎光临昆山中宇工控PLC论坛!您是第 6432798 位访问者, 日访问量: 15531 总访问量: 15893528,当前 2024-04-18 14:54:32 在线人数:57

ICP备案证书号: 苏ICP备14003016-2号