搜索
bottom↓
回复: 12

【经验分享】KE02单条乘法指令为一个周期的测试方法讲解

[复制链接]

出0入0汤圆

发表于 2014-6-30 17:38:39 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_Robin 于 2014-7-18 14:27 编辑

【经验分享】KE02单条乘法指令为一个周期的测试方法讲解
一, 问题描述
        前不久,在我们飞思卡尔的外部坛子有几位网友提出我们Coretex M0+内核芯片的乘法指令运行周期的问题。通过cortex M0+内核相关文档,我们知道乘法指令MULS Rd, Rm, Rd 占用的机器周期是1或者是32, 那么到底是1还是32呢?网友为了验证,就采用KE02作为平台自己测试了,很多人都是采用在乘法指令前后翻转IO的方式,然后通过示波器去测试IO之间的时间来确定乘法指令的运行时间,这样测下来,时间还是比较长的,有些网友甚至测出来有好几个us,甚至十几个us, 这么长的时间对于20M的主频(一个机器周期只有0.05us)来说真是长的有些不可思议。那么到底是什么原因导致测试结果这么长呢,IO口翻转的方法测试单指令的乘法指令靠谱吗?答案是No。
        为什么不行呢?因为测试的时候如果使用IO翻转,本身IO翻转就占用一定的机器周期,另外对于C语言写的乘法指令,比如如下定义:
uint32_t test1, test2;
uint32_t result;
    test1=0x11;
    test2=0x22;
   result= test1*test2;
result= test1*test2;对应的汇编并不只是一条乘法指令,而是包含了取值到test1,test2,然后在做乘法,最后还要将乘法指令放到result中去(请查看图1),其实这些取值,存储指令占用的机器周期还是比较长的,通过手册可知是2个机器周期,而如果乘法指令只有1个机器周期,这样测试明显是不正确的。
  

图1
   可能还有人想,那么如果我直接用result= 0x11*0x22;这样是否就能比较快的测试乘法指令呢?这个也是不可以的,因为如果这样做,编译器会先把0x11*0x22计算好后放在一个地方,然后运行到这句乘法语句的时候,直接掉值,大家如果查看它对应的汇编语句,是看不到muls这条指令的,只有一些取值存值的过程,如图2。

图2
那么究竟怎样测试才能准确的测出单条muls的运行时间呢?下面章节2将详细讲解。
二, 测试方法讲解
        大家从上面的图1可以看到,其实一条C的乘法指令对应了包含乘法指令muls,LDR,STR等多条指令,如何才能准确测试呢?
        我们可以使用芯片的systick来测试,因为systick的counter是可以配置为core clock(CLKSOURCE=1)或者core clock/16(CLKSOURCE=0)的,如果我们选择counter为core clock,而运行指令的机器周期也是按照core时钟来的,所以就能比较准确的测试单条指令的运行时间。另外,在我们KE02的驱动库中,是有关于systick的驱动代码的,如果大家使用的是KL系列,相关例程中也是有systick的驱动的,测试方法类同。
     具体的测试思想就是,初始化好systick后,在result= test1*test2;前面使能读取当前的systick值,并且存起来,运行完乘法语句之后再次读当前的systick值,然后再存起来,紧接着做一个减法,就知道乘法语句result= test1*test2;和第二次取systick值一共运行了多少个内核时钟,最后再减去减去乘法语句中除了乘法指令之外的语句以及第二次取systick值的时间,就是我们需要的muls指令的时间。
      下面再结合测试结果讲解。
三,测试结果
      整个语句对应的汇编情况如图3所示,其中execution_cycle是测试乘法C语句的时间,而实际上,由于读取第二次systick的VAL也是经过一些汇编才将值放到cnt_end_value中的,所以execution_cycle包含了乘法C语句和cnt_end_value = SysTick->VAL;语句的执行时间。大家可以看到在图3右边有个红框,整个红框内对应的就是execution_cycle的时间。通过文档Cortex™-M0+ Technical Reference Manual.pdf的26页

Table 3-1 Cortex-M0+ instruction summary (该文档以及在附件中) 可以知道:
Ldr,str指令都是2个机器周期,而红框中除了muls之外,一共有10条指令,即一共20个机器周期。下面就可以使用execution_cycle减去20个机器周期就能得到muls的机器周期。

图3
下图就是图3测试的打印结果,可以知道红框中对应的测试周期一共为0X15即21个机器周期。 由此可知,减去之前取值存值的20个机器周期,muls指令只有1个机器周期,即0.05us。

图4
四,参考手册即参考测试代码
需要的网友可以下载查看,如果在测试的过程中遇到任何问题,欢迎一起交流讨论。









PS:本帖可从飞思卡尔版块置顶帖:飞思卡尔Kinetis资料大本营飞思卡尔论坛支持小组【经验分享】帖汇总链接进入。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-6-30 17:38:59 | 显示全部楼层
不足之处,欢迎指正,同时也欢迎大家分享自己的经验!

出0入0汤圆

发表于 2014-7-1 09:59:20 | 显示全部楼层
版主讲得很仔细
现在的编译器还是有这么智能,很多问题不用我们去考虑

出0入0汤圆

发表于 2014-7-8 17:16:09 | 显示全部楼层
很细致的经验分享!
我也来学习一下systick以便测试其他模块。

出0入0汤圆

发表于 2014-7-9 17:16:44 | 显示全部楼层
分析很详细,不错的

出0入0汤圆

发表于 2014-7-9 17:29:00 | 显示全部楼层
这类帖子比较好,应该大力发扬
偶是精神上支持,顶起

出0入0汤圆

发表于 2014-8-6 10:10:18 | 显示全部楼层
不错

分析方法对资源紧张的项目很有用

顶起

出0入0汤圆

 楼主| 发表于 2014-8-6 11:36:47 | 显示全部楼层
alanse 发表于 2014-8-6 10:10
不错

分析方法对资源紧张的项目很有用

对的,还有可以用来测试你的代码占用CPU的情况。

出0入0汤圆

发表于 2014-8-6 12:03:47 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-8-6 11:36
对的,还有可以用来测试你的代码占用CPU的情况。

不过现在MCU都蛮快的

一般编辑Ç时就应注意有没有多余且重复的就行了吧

这个分析的效用应该说是可以知道自己写的ç在编译后的语句

进而避免未来在编辑Ç的时候写出那些会造成多余的句子

算是学习用的吧

不然一个项目要这样去逐条查看也是挺累的

出0入0汤圆

 楼主| 发表于 2014-8-6 12:56:19 | 显示全部楼层
alanse 发表于 2014-8-6 12:03
不过现在MCU都蛮快的

一般编辑Ç时就应注意有没有多余且重复的就行了吧

那是当然了, 只是在你自己关心的地方测试。
没有必要都去测试的。

出0入0汤圆

发表于 2014-8-25 10:19:13 | 显示全部楼层
讲的好,对理解这款单片机大有帮助。

出0入0汤圆

发表于 2014-9-3 11:27:25 | 显示全部楼层
好贴果断收藏下载!

出0入0汤圆

发表于 2014-9-3 11:49:10 来自手机 | 显示全部楼层
讲解的很详细
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 18:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表