|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
一个关于MAM的莱鸟问题 |
作者:zy315 栏目:ARM技术 |
LPC213x系列ARM的MAMTIM寄存器那个CCLK数目设置是越大加速越快还是越小加速越快?设成7快还是设成1快?为什么20MHZ以下设成1,20-40MHZ设成2,40MHZ以上设成3?这么设定有什么科学根据吗? |
2楼: | >>参与讨论 |
作者: zy315 于 2005/12/13 10:03:00 发布:
怎么没人回答? 怎么没人回答?昨天晚上我5点发的帖子,到晚上也没人回答以为是ZLG公司下班了,但是今天上午已经开始看见ZLGARM给别人解答问题了,于是自己给自己顶一下,盼能给RE一下~~ |
3楼: | >>参与讨论 |
作者: zlgarm 于 2005/12/13 11:27:00 发布:
re 存储器加速模块的作用是匹配CPU和FLASH存储器访问速度,使CPU的效率更高,并不是说MAMTIM设置的值越大就越快。 至于模板中加速模块的设置,是按照PHILIPS的推荐值。 * - 本贴最后修改时间:2005-12-13 13:52:13 修改者:zlgarm |
4楼: | >>参与讨论 |
作者: zy315 于 2005/12/14 11:51:00 发布:
收到,多谢~ |
5楼: | >>参与讨论 |
作者: zy315 于 2006/1/6 9:12:00 发布:
今天读书发现问题,重新定起半个月前的帖子 今天读《深入浅出ARM7》上册,第410页上数第10行写到:“在同一cclk下,MAMTIM的值越大,速度越快(有效值有限度)”。 而上面三楼的zlgarm提到:“并不是说MAMTIM设置的值越大就越快。”也就是说其技术支持人员的解答和写书的人解答的有矛盾,请问是怎么回事?我该听哪位的? |
6楼: | >>参与讨论 |
作者: zlgarm 于 2006/1/6 10:29:00 发布:
re 请注意(有效值有限度)这个描述,意思是在同一cclk下,逐渐增大MAMTIM的值会使FLASH的访问速度加快,当超过这个限定值后MAMTIM的值越大,反而FLASH的访问速度会变慢。 * - 本贴最后修改时间:2006-1-6 10:32:22 修改者:zlgarm |
7楼: | >>参与讨论 |
作者: qwernet 于 2006/1/6 11:47:00 发布:
zlgarm的解释不对吧? MAMTIM存放的是FLASH的访问时钟数,应该是越大越慢!1是最快的,单周期访问。但是由于FLASH的访问周期需要在50ns以上,所以,当主频大于20MHZ时,如果仍然把MAMTIM设1的话,那么FLASH的访问周期将小于50ns,可能导致数据读取出错,因此,需要把MAMTIM设为2,以符合FLASH访问周期的要求。同理,40MHZ以上要设成3。 不过,如果打开了MAM加速功能,由于FLASH每次读取的4条指令ARM至少需要用4个周期才能执行完(ARM模式下),所以在缓存命中的条件下,MAMTIM无论是设1、2还是3,对运行速度没有影响。但是假如没有命中需要启动FLASH取指的话,那就需要额外花多MAMTIM个周期数。 |
8楼: | >>参与讨论 |
作者: zy315 于 2006/1/7 9:27:00 发布:
谢过 qwernet解释的有道理,MAMTIM越大应该是越慢!这个我在一个月前读到《深入浅出ARM7》上册的P100的时候就是这么认为的!P100有个表格,里面列出数字后面的解释表明MAMTIM的值就是MAM取值占用多少个处理器时钟,按照常理,当然是时钟数越多就越慢了!!!但该页上数第3行说:“单个时钟的FLASH访问实际上关闭了MAM。”。MAM是加速模块,关闭了MAM就意味着不加速了,也就是单个周期反倒不加速,时钟越多反倒加速越快,只能这么理解!然而这种理解和表格的说明恰恰相反!有些矛盾!于是当时我就发了这个帖子问了一问。 然而昨天上午我读到本书410页的时候发现写到:“可见,在同一cclk下,MAMTIM的值越大,速度越快(有效值有限度)。”再次产生疑惑,于是重新顶起本贴。按照410页实验1,将MAMTIM设为7就比设为2快了!怎么使用时钟数越多反而又快了呢?请qwernet和zlgarm再次做解!而按照P410实验2的测量结果的表格(在411页上面),发现第二行和第三行和实验1又有矛盾,第二行的MAMTIM=2,第三行的MAMTIM=3,而第二行680ms,第三行脉冲宽度1.012s,和实验1结论又正好相反,这次是MAMTIM越大越慢了!而第二行和第三行的MAMCR都是0,并未启动加速,应该和第一行没有初始化的时间(2.37s)相同啊!怎么MAM没有初始化和初始化但不启用还不是一样吗?这些都没想明白!!! |
9楼: | >>参与讨论 |
作者: qwernet 于 2006/1/7 11:32:00 发布:
re “单个时钟的FLASH访问实际上关闭了MAM。” 把FLASH设成了单个周期访问,加速模块当然没用了。你仔细想想,一个周期就能取1条指令,流水线不会被打断,还要加速模块来干什么呢?只有在流水线经常由于取指缓慢而打断的情况下,加速模块才能发挥作用。这并不等于MAMTIM越大,加速越多。它只有加速与不加速之分。 你举的例子,我没有书哦,不知道具体情况,不好解释。 不过你的第二个例子也很好解释,MAMTIM是FLASH访问周期数,与开不开启加速模块无关。MAM没有初始化的时候,MAMTIM默认为7,当然最慢了。在没有开启加速模块的时候,执行时间基本上与FLASH的访问周期数成正比(因为这时候每条指令的实际执行时间基本上就是FLASH的访问周期数),所以你给出的时间也很正常。 |
10楼: | >>参与讨论 |
作者: zy315 于 2006/1/7 14:32:00 发布:
再问 按照您的说法单个时钟的FLASH.html">FLASH访问就是说一个周期就能取1条指令吗?如果这样的话7个时钟的FLASH访问就是一次性取7条指令吗?显然不是!它是128位宽度的,一次取4条ARM指令或者取8条Thumb指令,MAMTIM是说用多长时间来取这4条ARM指令(或8条Thumb指令)。我的理解好像就是:让一个裁缝去缝100件衣服,衣服肯定是100件,关键时她能用多长时间干完,是用一天还是两天还是七天的问题。用一天缝完的是最快的裁缝,应该是工资最高的!如此看来,“单个时钟的FLASH.html">FLASH访问实际上关闭了MAM。”实在是不好理解! “MAMTIM是FLASH.html">FLASH访问周期数,与开不开启加速模块无关。”这句话我理解了,411页的那个表格的实测数字我也彻底理解了,谢谢! 还有就是他书上410页有个实验,是用软件延时的方式控制LED的闪烁,当MAMTIM=2的时候闪的很慢,当MAMTIM=7的时候闪的很快。这个客观事实和我们的理论分析所认知的结论有差别! |
11楼: | >>参与讨论 |
作者: qwernet 于 2006/1/7 19:53:00 发布:
re 我没有说过7个时钟的FLASH访问就是一次性取7条指令啊。 一次FLASH访问取多少条指令,只取决于是否开启MAM加速模块,开启了,就是4条(ARM指令),没开启,就是1条。 |
12楼: | >>参与讨论 |
作者: qwernet 于 2006/1/7 20:11:00 发布:
re “单个时钟的FLASH访问实际上关闭了MAM”意思是,如果你把FLASH设为单周期访问,那么开不开MAM效果都是一样。仔细想想,为什么要用MAM?因为一般情况下,主频比FLASH的访问快得多,如果没有MAM,每次取指都要N个周期的话,后面的译码、执行流水线肯定要停下来等待取指的完成,这样性能大打折扣。用了MAM,每次取指仍要N个周期,但是可以取得4条指令,这样,只要N<=4,后面的流水线就不会被取指打断(顺序执行的情况下),充分发挥CPU的性能。 如果你把FLASH访问周期设为1(当然,要求主频小于20MHZ),那么,本身就具备了单周期取指的能力了,还要MAM来干什么呢? 书上的程序能否发上来看看?你的主频是多少? |
13楼: | >>参与讨论 |
作者: qwernet 于 2006/1/7 20:37:00 发布:
reply 补充一句,MAM模块其实可以看作是一个32字节的指令缓存(其中16字节用于顺序执行,16字节用于简单的分支预测),从FLASH中读取的指令都放在缓存,ARM核从缓存中取指,FLASH和缓存之间是128位,缓存与CPU之间是32或16位,这样应该好理解一些。 |
14楼: | >>参与讨论 |
作者: zy315 于 2006/1/9 9:05:00 发布:
re 谢谢qwernet的热心帮助,这回我是彻底明白了。 我系统的晶振是11.0592,主频是44.2368,外频是11.0592! 书上的程序如下: #include "config.h" const uint32 LED1 = (1 << 18); // P1.18控制LED1,低电平点亮 void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++); } int main (void) { PINSEL1 = 0x00000000; // 设置管脚连接GPIO IO1DIR = LED1; // 设置LED1控制口为输出 while (1) { IO1SET = LED1; // LED1熄灭 DelayNS(50); IO1CLR = LED1; // LED1点亮 DelayNS(50); } return 0; } 但这只是主程序文件main.c,要改变MAMTIM的值需要改变它的工程模板里的文件target.c,这个文件很长,需要改动的部分如下: /* 设置存储器加速模块 */ /* Set MEMORY accelerater MODULE*/ MAMCR = 0; #if Fcclk < 20000000 MAMTIM = 1; #else #if Fcclk < 40000000 MAMTIM = 2; #else MAMTIM = 3; #endif #endif MAMCR = 2; 您方便留下E_mail吗?我将把这个程序的整个ADS工程给您发过去! |
15楼: | >>参与讨论 |
作者: qwernet 于 2006/1/10 12:58:00 发布:
我不用ADS哦 我一般用Keil 你设置MAMTIM的时候,MAM是开还是关? |
16楼: | >>参与讨论 |
作者: zy315 于 2006/1/10 15:13:00 发布:
re 我设置MAMTIM的时候先关MAM,也就是MAMCR=0;然后设置MAMTIM,最后全速运行MAM,也即MAMCR=2;上面发言的程序写了,就是这段: MAMCR = 0; #if Fcclk < 20000000 MAMTIM = 1; #else #if Fcclk < 40000000 MAMTIM = 2; #else MAMTIM = 3; #endif #endif MAMCR = 2; |
|
|
Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号 |