历史上的今天
返回首页

历史上的今天

今天是:2024年12月18日(星期三)

正在发生

2018年12月18日 | 基于S3C6410的ARM11学习(七) 核心初始化之关闭MMU和CACHE

2018-12-18 来源:eefocus

在关闭了所有中断后,就要关闭MMU和CACHE了。因为这个时候,还在初始化环境,这两个东西是用不到的。所以就需要把他们都关闭,免得影响我们的初始化。

    

MMU是Memory Management Unit的缩写,中文名是存储器管理单元。主要是两个功能:


1、虚拟地址转换为物理地址


2、实现内存的保护


至于具体的MMU的一些知识,等后面用到了在说明了。目前,只需要将MMU给关掉即可。


这个时候,我们需要查看S3C6410的核ARM1176JZFS手册。在这里,我们要接触到一个系统控制处理器,CP15。也叫做协处理器。


clip_image002


手册中说明了,CP15系统控制处理器的作用,主要是6个:


1、整个系统的控制和配置


2、CACHE的配置和管理


3、TCM控制和管理


4、MMU控制和管理


5、DMA控制


6、系统运行监控


CP15共有16组寄存器。每一组寄存器有不同的功能。每一组寄存器下又有若干个寄存器。


至于这些寄存器的功能,在手册中有说明。不过手册是以功能划分寄存器的。如对应MMU功能。


clip_image004

图中,就列出了MMU功能对应的寄存器组。总共用到了c0,c2,c3,c5,c6,c8,c10,c13,c15这9组寄存器。但是也不是每一组寄存器组的所有寄存器都需要到,所有后面通过Opcode_1,CRm,Opcode_2来标识是对哪一个寄存器。


下面是对协处理器访问的用法


clip_image006


MCR指令是对协处理对应的寄存器下的某个寄存器写数据,写的数据放在Rd寄存器中。


MRC指令是对协处理对应的寄存器下的某个寄存器读数据,读的数据放在Rd寄存器中。


说明各个参数意义:


Opcode_1: 操作符1,协处理器行为操作码,对于 CP15 来说, 


 CRn:协处理器的寄存器组编号,编号从c0-c10。


 Rd: 寄存器编号,r0-r14.


 Opcode_2: 访问寄存器组下的寄存器提供附加信息


       CRm: 寄存器组下的寄存器编号。


上面参数,在对应功能的图中都有说明。例如:


我们要写TLB type Register,写的值存在r0寄存器中。


clip_image008


那么从图中,对应


参数

Opcode_1

0

CRn

c0

Rd

r0

Opcode_2

3

CRm

c0


在使用MCR指令。


mcr p15,0,r0,c0,c0,3  


这样,就将r0的值写入到TLB type Register中去了。


CACHE是高速缓冲存储器。CPU工作速度是很快的,而外部内存是工作很慢的,所以当CPU对内存访问的时候,是要等待内存访问结束的。所以中间CPU就在等待,这就浪费了时间。所以在CPU和内存之间加一个CACHE,当CPU写数据到内存中的时候,就先写入到CACHE中,然后CACHE再写入到内存中。CPU写CACHE是很快的,所以就提高了写数据的效率。读数据的话,CPU先在CACHE中去找数据,没有找到的话,CACHE将数据从内存中取出来,再给CPU,同时把这个数据存起来。当CPU在CACHE中找到数据的话,就直接使用这个数据,就不用再去内存中取数据了。


clip_image010

上面两个图就说明了有CACHE和没有CACHE的区别。


在初始化阶段,我们是不是用这CACHE的。


CACHE在ARM11中是分类两种的。一种是存储指令的,一种是存储数据的。


clip_image012


这个在S3C6410的数据手册中有说明。看出来,I/DCACHE大小是16KB。所以以下的操作要分开对ICACHE和DCACHE操作。


我们要对MMU,CACHE控制,所以这里就对CP15的MMU,CACHE功能进行配置。我们知道在ARM中,对任何功能配置都是通过寄存器配置的,所以就需要去配置CP15的MMU,CACHE功能开启和关闭的寄存器。


注意,这个时候,这个寄存器就不能去MMU,CACHE功能部分去找了。而要去找系统控制和配置里面去找了


这个寄存器就是c1寄存器组下的控制寄存器。


clip_image014


直接看这个寄存器的各个位的功能。


这里就截取图中一部分,因为这部分中和MMU,CACHE有关。


clip_image016

clip_image018


最后1位,就是MMU的开启和关闭了。当为0的时候,MMU是关闭的,为1的话,MMU就是打开的。所以这里我们要写入0.将MMU关掉。


该寄存器的第2位,是控制DCACHE的。0关掉。所以这里我们要写入0.将DCACHE关掉。


该寄存器的第12位,是控制ICACHE的。0关掉。所以这里我们要写入0,将ICACHE关掉。


在关闭CACHE之前,还要做一件事,就是要将CACHE的原有的数据给清掉。因为有可能之前,里面就有一些数据了。这个操作也是由CP15下的一个寄存器控制的。


clip_image020


首先找到CACHE相关的寄存器组。看出是c7.


clip_image022


在去看CP15的各个寄存器组的功能。


得知c7组下的c7寄存器是对CACHE数据无效操作的。


clip_image024


再在c7组下的c7寄存器中去找,有上面这张表。


表中都给了汇编指令,怎么对两个CACHE都无效掉。所以,在程序中就直接使用该汇编指令即可。这里Rd可以是任意,因为这里什么值对该命令是没有影响的。


下面就可以开始编写代码了


clip_image026


1、先对两个CACHE中的数据无效掉。使用手册中的汇编,这里Rd使用r0。


2、将CP15的控制寄存器的数据先读出来存在r0中。


3、对r0寄存器数据中第0位,第2为清零。


4、在将r0数据写入到控制寄存器中,这样,就实现了控制寄存器的MMU关闭和DCACHE关闭


5、程序返回。


这里,只是对DCACHE对应的位清零了,使DCACHE关闭,而没有使ICACHE对应的位清零,关闭ICACHE。对于这里,国嵌解释说,在初始化的时候,对ICACHE的要求没有DCACHE那么严格,可以不用关闭,也可以关闭,而DCACHE就必须关闭。至于为什么,目前也不清楚,因为现在也才是初学,等以后学习深了应该就知道了。现在学习,就先跟着前辈们的路走。


对比STM32,这两步就简单了,因为根本就不用做。为什么了,因为STM32中就没有两个东西。都没有了,你怎么操作他。


STM32没有MMU,所以,你在STM32上面就跑不出LINUX系统,因为不能将虚拟内存转换为物理内存。STM32对地址操作都是操作的物理地址。这样,就有很大的局限性。


就这样,我们就完成了核心初始化之关闭MMU和CACHE了。

 

文中若有什么错误,麻烦各位指出,我会虚心的更改的。以免误人学习。也欢迎各位与我交流。


推荐阅读

史海拾趣

Digital Core Design公司的发展小趣事

然而,随着《古墓丽影》系列的不断发展,Core Design也面临了一些挑战。其中最为严重的是版权问题。由于Core Design在后续的一些作品中可能违背了“古墓”的本源,享有Lara Croft和《古墓丽影》版权的游戏发行商Eidos作出了剥夺Core Design《古墓丽影》系列开发权的决定。这一决定对Core Design来说无疑是一个巨大的打击,但也促使其开始寻找新的发展机遇。

Digilent公司的发展小趣事

作为电子行业的领军企业之一,DIALIGHT始终将技术创新作为公司发展的核心驱动力。公司拥有一支高素质的研发团队和先进的研发设施,不断推出具有创新性和竞争力的LED产品。同时,DIALIGHT还积极与高校、科研机构等合作,共同推动LED照明技术的进步和应用。

创世(CS)公司的发展小趣事

随着产品的不断创新和技术的不断突破,创世公司的市场份额逐渐扩大。公司的SD NAND产品已经广泛应用于医疗设备、工业控制、轨道交通、安防、网络设备等多个领域。这一市场布局的成功,不仅提升了创世公司的品牌影响力,也为其在电子行业树立了良好的口碑。同时,创世公司还积极参与各种行业展会和交流活动,与国内外客户建立了广泛的合作关系,进一步拓展了市场。

Crocus Technology公司的发展小趣事

随着技术的不断成熟和市场需求的变化,Crocus Technology开始拓展其产品线。2015年,公司成功推出了首款磁开关产品,这标志着公司在磁传感器领域迈出了重要的一步。随后,公司又陆续推出了位置传感和2D传感器产品,进一步巩固了其在磁传感器市场的地位。

E-Switch公司的发展小趣事

E-Switch公司始终坚持以客户为中心的经营理念,致力于为客户提供优质的服务和产品。公司建立了完善的客户服务体系,及时解决客户在使用过程中遇到的问题。同时,E-Switch还积极与客户保持沟通交流,了解市场需求变化,以便及时调整产品策略和生产计划。正是这种以客户至上的经营理念和持续发展的战略眼光,让E-Switch在电子行业中不断发展壮大。

Epitex Inc公司的发展小趣事

随着全球环保意识的不断提高,Epitex也积极响应环保号召,将环保理念融入到公司的生产经营中。他们采用环保材料和生产工艺,减少对环境的影响。同时,Epitex还积极参与环保公益活动,推动电子行业的绿色发展。

在可持续发展方面,Epitex也做出了积极努力。他们通过技术创新和产业升级,不断提高资源利用效率和产品附加值。同时,Epitex还注重与供应商和客户的合作,共同推动产业链的可持续发展。

问答坊 | AI 解惑

某机载三相交流稳压电源的研制

  摘要:介绍了某机载三相交流稳压电源的研制情况。对电源电路进行了分析、计算和计算机仿真。应用高频脉宽调制斩波调感技术,以MOS场效应管取代了传统的双向晶闸管,用脉宽调制取代了相控技术。通过对电路的优化设计,降低了输入谐波电流。 ...…

查看全部问答>

wince6.0 RIL 打开串口失败

请教各位:         我在wince6.0下面 在打开com口的时候(CreateFile())提示失败.我用的是ENFORA的例子.在BIB和REG文件里面都已经添加了模拟器对应文件下面的一些命令.但是在烧完OS后正常加载RIL的过程中,从TRACE信 ...…

查看全部问答>

有关对BGA check的问题

最近遇到一个疑惑的问题:、 在我做的东东里有一步是对硬件及其相关进行检测,可是在对芯片的BGA信号(不知道这样说行不行) 进行检测的时候却老是不通过,下面是出错的地方: BOOL DrvExioBitTstGpio(EXIO_PORTMAP io) {       ...…

查看全部问答>

oledb 问题,急!

各位大哥,为什么我调用IDBInitialize::Uninitialize函数时,程序会死在里面,不完成函数呢?根据MSDN的说明,我将所有的指针全部都release了,但还是死在那函数里面!搞不明白。…

查看全部问答>

串口终端为何看不到RETAILMSG输出消息?

我用的是友善之臂的mini2440,我在OAL中使用了RETAILMSG返回一些调试信息,可是在板子上跑起来以后,在串口超级终端上除了一开始EBOOT有信息输出外,然后就看不到有任何信息输出了(我能肯定这些RETAILMSG语句是执行了的),请问这是怎么回事啊?望有高人指 ...…

查看全部问答>

怎样将-39.3作为两个字节来存储?

怎样将-39.3作为两个字节来存储? 例如:将-39.3编码为0xFE77(我随便说的),那么高字节=FE,底字节=77。…

查看全部问答>

还是关于u盘驱动的事

谁能告诉我,往U盘里面写一个文件,全过程是怎样的呢,驱动软件收发了哪些消息,在U盘里面创建文件的时候目录怎么弄,文件名怎么弄,怎样找到的这个文件? 头疼一大堆…

查看全部问答>