MKE系列用CW开发时单周期乘法指令是啥?(已解决)
本帖最后由 FSL_TICS_ZP 于 2014-7-8 14:47 编辑以前用56F800E时,用的是mult_r函数,不知道还有没有? 这个,编译器不能自动的去用硬件乘法器吗? 浪里白条 发表于 2014-6-18 10:53
这个,编译器不能自动的去用硬件乘法器吗?
don't know 啊,之前一直用的mult_r系列指令...... 怎么又没得个FSL的人来回答下 wanstrive 发表于 2014-6-18 14:57
怎么又没得个FSL的人来回答下
这个问题太专业了大哥,耐心等待 浪里白条 发表于 2014-6-18 15:11
这个问题太专业了大哥,耐心等待
唉,给我个回复也好哇~~其实就是怎么在ARM中使用它的DSP增强指令....唉,老板要用MKE02做电机控制....没办法,一路ADC采样就好几微秒了,实在受不了。 wanstrive 发表于 2014-6-18 15:21
唉,给我个回复也好哇~~其实就是怎么在ARM中使用它的DSP增强指令....唉,老板要用MKE02做电机控制....没 ...
你好,楼主!
这个指令我也不是很清楚,我想你需要查找Thumb-2指令集吧! FSL_TICS_ZP 发表于 2014-6-18 16:31
你好,楼主!
这个指令我也不是很清楚,我想你需要查找Thumb-2指令集吧! ...
我在网上找着答案了....囧....CMSIS。。。 有这个必要吗?C编译器要管指令吗? wangpengcheng 发表于 2014-6-18 17:03
有这个必要吗?C编译器要管指令吗?
这语气...你去看看CMSIS-DSP是干嘛的吧。 FSL_TICS_ZP 发表于 2014-6-18 16:31
你好,楼主!
这个指令我也不是很清楚,我想你需要查找Thumb-2指令集吧! ...
唉,还是没有搞定~继续求助啊,我测试了一下,我用的是MKE02Z16VLC2,用的最高频率20MHz,然后开发环境是CW10.6,我测了一下两个32位数的乘法花了10us,一个32位除16位数的操作花了14us,
int32Xint32------>10us
int32/int16------->14us
我觉得这个运算速度跟它datasheet上说的有support single cycle 32x32 multiplier不符合啊,还是我理解有误,抑或是使用不当,有特别的方法才能使用单周期乘法么?
如果是一个乘法耗时10us的话,基本上做不了啥运算或控制了。如果你不了解这一块的话,能不能帮我咨询下别人呢,谢谢! wanstrive 发表于 2014-6-18 20:05
这语气...你去看看CMSIS-DSP是干嘛的吧。
不是有函数吗?
调用函数不是可以吗?
没用过啊,只是看过一点资料! wangpengcheng 发表于 2014-6-18 23:35
不是有函数吗?
调用函数不是可以吗?
没用过啊,只是看过一点资料!
用过飞思卡尔的DSC么?主要是如果没有单周期乘法器的话,乘除法特别耗时,基本上就做不了啥应用了。。 哥们,太佩服你了,现在还在线!
我只是看过一些应用,没用过DSC,但是我觉得48M做FTF两MS的时候不应该有你说的这样的啊,可能我理解错误!但是做FTF48M真的只有2MS,这个我是测试过的!
wangpengcheng 发表于 2014-6-18 23:42
哥们,太佩服你了,现在还在线!
我只是看过一些应用,没用过DSC,但是我觉得48M做FTF两MS的时候不应该有你 ...
哈哈,你这不也在线么,FTF指的是啥,FFT么?用的是哪款片子呀?我这电机控制....必须us级,一个5k的pwm中断总共才200us wanstrive 发表于 2014-6-18 23:48
哈哈,你这不也在线么,FTF指的是啥,FFT么?用的是哪款片子呀?我这电机控制....必须us级,一个5k的pwm中 ...
回来没关电脑,上来看一下! M0+的处理器,目标就是逻辑控制,运算性能还不如CM3,小负荷的数学运算还能用时间补回来,重负载肯定吃不住的。
而且M0内核标配是没有乘法器的,FSL有没有额外的放一个IP进去要看DS。
如果有的话,一般都会给操作的方法,方便的直接在IDE里面就做了,麻烦点的,就要自己写寄存器了。
呼叫FSL的技术支持,给力啊同志们。 wanstrive 发表于 2014-6-18 23:18
唉,还是没有搞定~继续求助啊,我测试了一下,我用的是MKE02Z16VLC2,用的最高频率20MHz,然后开发环境是C ...
能简单介绍一下你的测试步骤吗? error_dan 发表于 2014-6-19 01:11
M0+的处理器,目标就是逻辑控制,运算性能还不如CM3,小负荷的数学运算还能用时间补回来,重负载肯定吃不住 ...
谢谢支持! FSL_TICS_ZP 发表于 2014-6-19 09:10
能简单介绍一下你的测试步骤吗?
一个*一个/测时间....我觉得总该有特别的指令吧,要不然datasheet上号称的单周期乘法哪去了。。。 wanstrive 发表于 2014-6-19 10:11
一个*一个/测时间....我觉得总该有特别的指令吧,要不然datasheet上号称的单周期乘法哪去了。。。 ...
你int32*int32的10us是怎么测出来的?看到你在与非也问了。
测试方法准不准呢? FSL_TICS_ZJJ 发表于 2014-6-19 10:20
你int32*int32的10us是怎么测出来的?看到你在与非也问了。
测试方法准不准呢? ...
同问,你这个是如何测试出来的 浪里白条 发表于 2014-6-19 10:23
同问,你这个是如何测试出来的
GPIO置位清位~ wanstrive 发表于 2014-6-19 10:25
GPIO置位清位~
然后用示波器测量出来 是吗 浪里白条 发表于 2014-6-19 10:48
然后用示波器测量出来 是吗
是这样的,我刚修改了一下codewarrior的优化选项,发现现在一个乘法用了1.6us,刚好是20Mhz下的32个周期,然后一个除法4.4us,88个周期.....求单周期乘法啊。。。 FSL_TICS_ZJJ 发表于 2014-6-19 10:20
你int32*int32的10us是怎么测出来的?看到你在与非也问了。
测试方法准不准呢? ...
我昨晚上在Freescale community上看到有人说需要把CW中的优化选项修改一下,于是我把之前的不优化改成了优化等级为level 2,现在的乘法一个耗时1.6us,除法一个耗时4.4us,这样的话20MHz下,乘法正好是32个周期,除法88个周期,还是没有one cycle啊!希望帮我咨询一下那边的工程师那个怎么用吧,还是本身就没有单周期乘法...谢谢! 用GPIO的测试方法不准,你可以用systemtick的方式测试,在我们的BME代码中有测试一条指令执行多少个systemtick的counter,你可以试试那种方法。
另外,你测试的乘法代码是什么?请贴出来给我们看看。 另外,楼主看看你乘法指令对应的汇编代码是什么? 是一句还是多句? FSL_TICS_ZJJ 发表于 2014-6-19 14:22
另外,楼主看看你乘法指令对应的汇编代码是什么? 是一句还是多句?
就是想问汇编代码的事...没有用汇编代码,因为不知道怎么用 wanstrive 发表于 2014-6-18 23:48
哈哈,你这不也在线么,FTF指的是啥,FFT么?用的是哪款片子呀?我这电机控制....必须us级,一个5k的pwm中 ...
楼主做电机控制不妨在官网搜FSLESL,有我们的库可以用,clark变换和park变换。
也有你需要的数学函数库啊
FSL_FAE_River 发表于 2014-6-19 15:24
楼主做电机控制不妨在官网搜FSLESL,有我们的库可以用,clark变换和park变换。
也有你需要的数学函数库啊 ...
这个是后话,现在做电流电压量化,普通的乘除法耗时太长,需要单周期乘法... wanstrive 发表于 2014-6-19 14:37
就是想问汇编代码的事...没有用汇编代码,因为不知道怎么用
你先告诉我写乘法的代码,我用和你一模一样的,我这边测试下。 FSL_TICS_ZJJ 发表于 2014-6-19 16:37
你先告诉我写乘法的代码,我用和你一模一样的,我这边测试下。
就是一个*,一个/,请问你会不会用它的汇编指令呢~ wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~
楼上的工程师是要你把你的测试代码填上来,我们复现一下,然后找出问题所在。 wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~
我去下载了ARM CORTEX-M0的的指令集,在第49页发现了这个指令,应该是做乘法的 wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~
你知道怎么在codeworrior中 C嵌入汇编不,知道的话我们可以尝试下 wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~
看这个链接:http://blog.csdn.net/nolatin/article/details/8159551
MULS Rd,Rm,Rd
这就是汇编指令,执行时间是一个周期。
但是把,你首先要把值放到RM,Rd中把,这些也是占用汇编的啊。
我用C写的,你看到它测试的时候对应的汇编,里面有乘法指令,但是你要先把值放到你做乘法的寄存器中,所以会有取寄存器的时间损耗,这个LDR的时间是2个机器周期,计算完了,你要把计算好的值再放到另外一个地方吧,那个也是要机器周期的,STR也是2个机器周期,这样加起来也有个13个机器周期,大概0.65us。
而且你的测试方法不准确,GPIO的汇编也有好多个机器周期,加起来也差不多是你测的时间一个多微秒。
如果要精确测试,需要使用systick的方式,去读,然后减掉读取systick损耗的时间,就是你单条C乘法的时间,然后你再减掉汇编的取值时间,就是你乘法指令的时间。
方法就是这样,你可以自行测试,从你最后一次结果看,基本验证我们的MULS是一个机器周期,而且我们的手册上都讲了,是一个机器周期。
希望能帮到你; 我尝试在C语言中插入了这句
asm("MULS R0,R2,R0\n");/*Multiply with flag update, R0 = R0 x R2*/
然后编译器提示
Description Resource Path Location Type
C:\Users\JACK\AppData\Local\Temp\ccee8Kkg.s instruction not supported in Thumb16 mode -- `muls R0,R2,R0' BEMS_McuPrj_V10 line 398, external location: C:\Users\JACK\AppData\Local\Temp\ccee8Kkg.s C/C++ Problem
浪里白条 发表于 2014-6-19 17:27
我尝试在C语言中插入了这句
asm("MULS R0,R2,R0\n");/*Multiply with flag update, R0 = R0 x R2*/
这个你要看看相应的编译器的混合编程是怎么弄的。 wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~
我在code worrior的帮助文档中 找到了这个用法 不知道这样用对不对
FSL_TICS_ZJJ 发表于 2014-6-19 17:28
这个你要看看相应的编译器的混合编程是怎么弄的。
嗯 我研究了一阵了,下班了
有空了再研究 浪里白条 发表于 2014-6-19 17:29
嗯 我研究了一阵了,下班了
有空了再研究
感兴趣,可以自己用systick的方法测一下,注意还要减掉两条systick读值的时间,不然不准。
具体方法就如我上面讲的。测试思想很简单。
如果你验证之后,可以发出你的结果。 FSL_TICS_ZJJ 发表于 2014-6-19 17:34
感兴趣,可以自己用systick的方法测一下,注意还要减掉两条systick读值的时间,不然不准。
具体方法就如 ...
好的,真是谢谢了,问题应该是解决了,再问一句,如果不用汇编的话,是不是得把优化等级配置到level 2? wanstrive 发表于 2014-6-19 19:25
好的,真是谢谢了,问题应该是解决了,再问一句,如果不用汇编的话,是不是得把优化等级配置到level 2? ...
不建议这样做,其实编译已经对代码的优化程度已经很高啊,再增加的可能会出现代码实现的功能与你期望不同的问题。 FSL_TICS_ZP 发表于 2014-6-20 14:43
不建议这样做,其实编译已经对代码的优化程度已经很高啊,再增加的可能会出现代码实现的功能与你期望不同 ...
楼主,为什么我的帖子没人回,我急用啊{:cry:} ln08136207 发表于 2014-6-20 14:50
楼主,为什么我的帖子没人回,我急用啊
那个帖子,链接拿来! FSL_TICS_ZP 发表于 2014-6-20 15:04
那个帖子,链接拿来!
http://www.amobbs.com/forum.php?mod=viewthread&tid=5585234&page=1#pid7628277 wanstrive 发表于 2014-6-19 19:25
好的,真是谢谢了,问题应该是解决了,再问一句,如果不用汇编的话,是不是得把优化等级配置到level 2? ...
我个人认为,你看看你在仿真的时候,C对应的汇编情况,如果优化后并没有影响到这句C的对应汇编代码量,就无所谓优化等级。 FSL_TICS_ZJJ 发表于 2014-6-23 15:11
我个人认为,你看看你在仿真的时候,C对应的汇编情况,如果优化后并没有影响到这句C的对应汇编代码量,就 ...
如果不进行优化,就不调用MULS wanstrive 发表于 2014-6-24 09:55
如果不进行优化,就不调用MULS
为什么这么说呢,你可以在CW截张图出来看看! FSL_TICS_ZP 发表于 2014-6-24 11:28
为什么这么说呢,你可以在CW截张图出来看看!
我是在FreeScale Community上看到的一个帖子说的,而且我也试过,如果不把优化级别提升至level 2,运算时间会加长。 wanstrive 发表于 2014-6-24 09:55
如果不进行优化,就不调用MULS
你的优化登记是多少?
我优化等级跳到None,还是条用muls的,你不调用应该是你语句的写法问题。 FSL_TICS_ZJJ 发表于 2014-6-24 13:24
你的优化登记是多少?
我优化等级跳到None,还是条用muls的,你不调用应该是你语句的写法问题。 ...
能看一下你写的语句么? wanstrive 发表于 2014-6-24 14:41
能看一下你写的语句么?
当然:
FSL_TICS_ZJJ 发表于 2014-6-24 14:45
当然:
图片一直刷不出来,囧 wanstrive 发表于 2014-6-24 15:20
图片一直刷不出来,囧
现在图能看见了,这几天阿莫一直在更新服务器,老是出现不稳定现象呢。 楼主你好
ZJJ昨天发了一篇经验分享帖讲解你这问题,有空你可以关注一下:【经验分享】KE02单条乘法指令为一个周期的测试方法讲解 谢谢57楼给答案,去看看。
页:
[1]