DB RM .

DB = Datasheet Book

RM = Reference Manual 

如果要成为一个工程师的话,拿到任何一款IC,大概最先读的就应该是这两个了。

在做智能车之前,由于不了解套路,没有预先看DB和RM,算是个失误吧。虽然看了都不一定懂,Freescale公司的K60-family's DB有79页(全英),RM有1817页(全英),说实话,我能完全读完的概率在0.048%左右。

但是还是必须要看的,遇到不能解决的问题,查RM是最可靠的解决办法。

说点题外话,在一开始弄智能车的时候,我负责程序的编写,可是一点没有头绪,只好借很多例程来看,逐渐舵机、摄像头也就能动弹了。可是看他们的例程和库,发现底层的东西还是一窍不通,如何驱动,为什么能驱动,只是知道1 + 1 = 2,但至于为什么,哥德巴赫咯。现在静下心来,倒是能慢慢研究了,越来越有种「初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田美池桑竹之属。」的感觉啦。

回归到正题,今天解决了什么问题:

我参加的是智能车比赛摄像头组,需要处理大量由摄像头传回的图像数据,目前来看这方面的问题,一个是如何传输这些数据不占大量的CPU资源(DMA解决),另一个是如何更快处理已存到RAM中的数据(OC)。今天下午研究了下第二个问题。

OC = Overclock 超频,让CPU工作在超负荷状态下,一个人顶两个人用,当然处理东西更快啦!但是同样的,风险也会加大,轻则罢工撂挑子(程序跑飞),重则直接猝死(烧掉)。

在21ic还是Freescale社区查到了关于这方面的知识,看到以后收益匪浅,誊抄过来:

在超频之前首先需要澄清几个概念,我们通常所说的主频一般是指内核时钟或者系统时钟(即core_clk或system_clk)。而对K60来说,其内部还有总线时钟(Bus_clk)、外部总线时钟(FlexBus_clk)、flash时钟(Flash_clk),而这几个时钟互相关联且每个都是有其频率限制的(如下图1所示),所以当我们要超频内核时钟的时候还不得不考虑其他时钟承受极限(姑且用这个词吧)。在我们用MCG模块内部的PLL将输入时钟超频到200MHz作为MCGOUTCLK输出的时候还需要一道关卡(如下图2),也就是说虽然这几个时钟属于同宗(都来自MCGOUTCLK),但是也可以通过不同的分频器(OUTDIV[1:4])约束不同的时钟范围,这里想起一个形象的例子。MCGOUTCLK就类似以前的官家大老爷,娶了四房姨太太(OUTDIV[1:4]),分别生了四个少爷(即core_clk、Bus_clk、FlexBus_clk和Flash_clk),每个少爷都是老爷的儿子,不过在家中地位却是由姨太太的排序决定的,其中大房的大少爷(core_clk)地位最高(频率范围最大),四房的小少爷(flash_clk)地位最低(频率范围最小),不过他们的地位最高也不会超过老爷(其他clk<=MCGOUTCLK),呵呵,有点意思~

DB RM ._第1张图片
图一

在图一里可以看到,MK60DN512ZVLQ10这款飞思卡尔的单片机默认主频是100 MHz,在下面的超频里经常让K60工作在200MHz的频率上!

DB RM ._第2张图片
图二

由于了解的MCU不多,不知道是不是别的MCU也是同样是这样的四分频,但是Intel超频的话,似乎只有一个倍频和外频,大概没有这么多内部时钟。

在野火(现山外)提供的一个例程里,我们可以看到:

DB RM ._第3张图片
图三
DB RM ._第4张图片
图四
图五
图六

在这次编辑的过程中,又学习到了子函数、枚举、循环函数的一些知识……果然是知识越学越多……在图四中传递的形参是clk_option opt ,而opt是图三中宏定义的MCG_CLK_MHZ,又受到图五中枚举定义的限制……Gosh,有点绕口。并且Bus_clock应该是<=1/2Core_clock(?)。

在PLL初始化的过程中也就设置了 ''mcg_div.prdiv ; mcg_div.vdiv ''(分频因数?)

DB RM ._第5张图片
图七

图七中这就是后续如何根据PLL来设置每个需要时序的模块来工作的code,当然我目前还是,很不明白……

所以PLL的存在是非常重要的,总不能所有的工人都在一个节奏上吧,总会有人干的快,有人干的慢。

MCG是K60提供的一个Function,在RM里查询,也就引出了PLL和FLL的定义。(见图八)

DB RM ._第6张图片
图八

FLL =  锁频环 PLL = 锁相环

有高手的总结:

PLL锁相环,可以将晶振输出频率Fosc,倍增几倍,以满足高速运算需要。

在不连接PLL时,CPU时钟和晶振时钟相同,即CCLK = Fosc。

当使能PLL并连接,则CCLK = Fosc * M,M为倍频数。

看起来PLL更重要一些啊!那么再看RM,

DB RM ._第7张图片
图九

最后一条就是我们要的目的了,不同的peripherals能在不同时钟下工作,正合我意!

那么到这里基本就说完了OC、PLL是怎么一回事,那么回到一开始的问题上,OC以后能更快的处理速度吗,RAM速度不是被限制住了吗?之前那位大牛也给出了他的看法,

说到这里,可能有些人会质疑,把主频超的那么高,但取指令的速度上不去有个啥用,岂不是颇有些大马拉小车的感觉吗,其实不然,这里我说两点。一个是通过RAM调试或者将函数声明成RAM执行函数的时候是可以加快执行速度的,另一个就是当做一些数学运算的时候作用就很明显了,因为一般可能会单纯用到CPU内部的ALU和寄存器组,后者数据访问多一些(注意Cortex-M4是哈佛结构,数据与指令总线独立的),自然其运算速度就上去了,所以还是好处多多的。

这样,不就能够提高我们的读取速度以及处理图像的速度了吗?诶,好像落下点什么,突然出现个莫名奇妙的词,“哈佛结构”,是什么东西?

百度一下!

我们现在用的PC(IBM兼容机)绝大部分都是由冯诺依曼的思想设计而来,实现简单,成本低廉。但是又有瓶颈在,

在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯·诺依曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,指令1至指令3均为存、取数指令,对冯·诺曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。

DB RM ._第8张图片
冯诺依曼结构

所以对于超频来说,假如MCU采用的是冯诺依曼结构,那么根据木桶原理来说,超频就变的事倍功半!而哈佛架构,正可以在MCU这个集成度比较高的IC上大施拳脚!来看哈佛结构的介绍:

DB RM ._第9张图片
不同之处

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度。

哈佛结构是指程序和数据空间独立的体系结构,目的是为了减轻程序运行时的访存瓶颈。例如最常见的卷积运算中,一条指令同时取两个操作数,在流水线处理时,同时还有一个取指操作,如果程序和数据通过一条总线访问,取指和取数必会产生冲突,而这对大运算量的循环的执行效率是很不利的。哈佛结构能基本上解决取指和取数的冲突问题。

改进的哈佛结构,其结构特点为:使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存,以便实现并行处理;具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输。

正巧,哈佛结构!之前对哈佛结构一无所知,以为全世界的电脑都是由冯诺依曼思想指导构成的,原来天天把玩的这块MCU,就用的是闻所未闻的哈佛结构啊~嗯,这个世界……

总结:我们一开始遇到的问题,如何更快的处理数据,到此算是在硬件上得到一定的解决,就是提高CPU的工作速度(时钟频率),并且通过配置参数来降低因主频提高带来其他部件可能会出现的问题。但在另一方面,积极的优化代码,使代码合理化、精简化、简单化,也会在很大程度上提高工作效率!

The end.


参考资料:

http://bbs.21ic.com/forum.php?mod=viewthread&tid=831312

https://community.freescale.com/docs/DOC-95555

百度文库:普林斯顿体系和哈佛结构联系与区别.doc

你可能感兴趣的:(DB RM .)