历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

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

2021-02-20 来源: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 来说,  永远为 0b000 。


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了。

推荐阅读

史海拾趣

HellermannTyton公司的发展小趣事

Heimann Optoelectronics Gmbh深知人才是企业发展的核心动力。公司建立了完善的人才培养体系,通过内部培训、外部交流等多种方式提升员工的专业技能和综合素质。同时,公司还注重营造开放、包容的企业文化,鼓励员工创新思维和团队合作。这种良好的企业文化氛围吸引了大量优秀人才加入公司,为公司的持续发展提供了有力的人才保障。

以上五个故事虽然基于虚构的“Heimann Optoelectronics Gmbh”公司构建,但反映了电子行业中企业发展的一般规律和趋势。

ASM公司的发展小趣事

进入21世纪,ASM公司开始关注中国市场的潜力。随着中国经济的快速增长和半导体产业的蓬勃发展,ASM公司看到了巨大的商机。公司加大了对中国市场的投入,与中国半导体代工厂建立了紧密的合作关系,为中国市场提供了高质量的产品和服务。这一举措不仅促进了ASM公司在中国市场的快速发展,也为中国半导体产业的进步做出了贡献。

南京国博公司的发展小趣事

2022年7月22日,国博电子在上海证券交易所科创板成功上市,标志着公司进入了一个新的发展阶段。上市不仅为公司带来了更多的资金支持和市场关注,也为其未来的发展提供了更广阔的空间。作为中国电子科技集团有限公司(简称“中国电科”)的首家科创板上市公司,国博电子承载着推动中国电子信息产业高质量发展的重任。上市以来,公司继续加大研发投入,拓展产品线,致力于成为全球射频电子领域的行业领导者。

Beck IPC GmbH公司的发展小趣事

Beck IPC GmbH,一家在嵌入式通讯市场享有盛誉的公司,以其创新的IPC@CHIP技术为核心,为工业OEM提供了强大的支持。在某一时期,公司研发团队经过长时间的努力,成功开发出一款具有划时代意义的嵌入式控制模块。这款模块不仅性能卓越,而且稳定性极高,迅速获得了市场的广泛认可。多家知名工业设备制造商纷纷与Beck IPC建立合作关系,将其产品应用于各种高端设备中,从而推动了公司的快速发展。

Daniels Manufacturing公司的发展小趣事

自1946年成立以来,Daniels Manufacturing Corporation一直致力于为军事和电信行业提供高质量的工具系统和技术。在20世纪70年代,DMC经历了一次重大的技术突破,成功研发出一种新型的手动压接工具,该工具能够精确、高效地处理各种电子连接器。这一技术的突破为DMC赢得了市场的认可,也为其后续的产品线扩展奠定了基础。在接下来的几十年里,DMC不断投入研发,推出了包括电动、气动、液压压接工具在内的多种产品,广泛应用于通信、光纤、激光等领域。

Elpress AB公司的发展小趣事

Elpress AB公司成立于1959年,由一群具有前瞻性和创新精神的工程师在瑞典的克拉姆福什市创立。公司从成立之初就专注于电气连接系统的研发和生产,致力于为电力行业提供高效、可靠的解决方案。在初期,Elpress AB凭借其专业的技术能力和对质量的严格把控,逐渐在市场上赢得了客户的信赖。

问答坊 | AI 解惑

在平时我们常用的电烙铁上面做点小文章

电烙铁暂时不用时也是满功率在加热,大家发发自己是如何避免,烙铁暂时不用但想用时立即能加热起来的方法,不用在等待长久的预热!再不用时,还能防止长期满功率加热造成烙铁头烧死,以及降低消耗电能的方法! [ 本帖最后由 DIAG 于 2010-8-21 17:3 ...…

查看全部问答>

为什么我的nk.bin文件烧不进去

按照smdk2400的使用手册做的,但是最后生成的nk.bin文件确烧不进去,显示说 BIN Image type unkonw,这是为什么啊,急求解决…

查看全部问答>

KEIL下程序运行问题

我在KEIL下仿真一程序,断点跟踪时程序可以正常按照预定的想法运行,可是不断点让它自己跑程序却不能,有没有哪位高人了解的?…

查看全部问答>

Qt程序如何在WinCE下编译??

前两天费了九牛二虎之力将Qt的开发环境安装成功,即将qt-embedded-wince-opensource-src-4.5.2.zip集成到了VS2005中,nmake过程用了将近3个小时。下一步想编译能在WInCE下运行的程序,但一直编译不成功,有没有哪位高手做过类似工作,指点一下??…

查看全部问答>

求解:coldfire怎么进行uart和cdc之间数据传输

我有英文的资料文档,但是我看不懂。 请高手教教。 谢谢…

查看全部问答>

50人接入蓝牙服务器的问题

如果设置一个蓝牙服务器,由客户端通过蓝牙与服务器进行交互. 一台蓝牙设备好象只能和7台作交互,那么这个蓝牙服务器应该是怎么样个配置呢?用USB接入多个蓝牙适配器吗?支持吗?…

查看全部问答>

一步一步教你使用uCOS-II 资料整理,欢迎下载

我把版主wstrom的帖子,一步一步教你使用uCOS-II,整理了一下,希望对大家学习ucos有所帮助......…

查看全部问答>

codewarrior v7.1 使用ucos v2.86版本的问题

ucos-ii v2.86 在coldfire v2上的移植问题? codewarrior v7.1 使用ucos v2.86版本的问题    各位大侠。我再ucos官网上下载了MCF5235的移植代码。我用到了MCF52110上,我只建立了一个任务,这个任务和空闲任务之间切换几次后出现 ...…

查看全部问答>

求助关于8051与 RS485 多机通讯开发

您好~目前我正在設計一個有關RS485多機通訊的工程,這是一個簡單的系統這系統的MCU適用8051 並且使用 MAX488這個IC將 UART轉換成 全雙工的485線路則是利用網路線 網路線也是雙絞線 因此覺得這樣可行連接方式為:主機 --> 子機1-->子機2-->子機 ...…

查看全部问答>