搜索
bottom↓
回复: 57

MKE系列用CW开发时单周期乘法指令是啥?(已解决)

[复制链接]

出0入0汤圆

发表于 2014-6-18 10:33:40 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZP 于 2014-7-8 14:47 编辑

以前用56F800E时,用的是mult_r函数,不知道还有没有?

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-6-18 10:53:13 | 显示全部楼层
这个,编译器不能自动的去用硬件乘法器吗?

出0入0汤圆

 楼主| 发表于 2014-6-18 11:18:28 | 显示全部楼层
浪里白条 发表于 2014-6-18 10:53
这个,编译器不能自动的去用硬件乘法器吗?

don't know 啊,之前一直用的mult_r系列指令......

出0入0汤圆

 楼主| 发表于 2014-6-18 14:57:02 | 显示全部楼层
怎么又没得个FSL的人来回答下

出0入0汤圆

发表于 2014-6-18 15:11:32 | 显示全部楼层
wanstrive 发表于 2014-6-18 14:57
怎么又没得个FSL的人来回答下

这个问题太专业了大哥,耐心等待

出0入0汤圆

 楼主| 发表于 2014-6-18 15:21:04 | 显示全部楼层
浪里白条 发表于 2014-6-18 15:11
这个问题太专业了大哥,耐心等待

唉,给我个回复也好哇~~其实就是怎么在ARM中使用它的DSP增强指令....唉,老板要用MKE02做电机控制....没办法,一路ADC采样就好几微秒了,实在受不了。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-6-18 16:31:01 | 显示全部楼层
wanstrive 发表于 2014-6-18 15:21
唉,给我个回复也好哇~~其实就是怎么在ARM中使用它的DSP增强指令....唉,老板要用MKE02做电机控制....没 ...

你好,楼主!
这个指令我也不是很清楚,我想你需要查找Thumb-2指令集吧!

出0入0汤圆

 楼主| 发表于 2014-6-18 16:32:32 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-6-18 16:31
你好,楼主!
这个指令我也不是很清楚,我想你需要查找Thumb-2指令集吧! ...

我在网上找着答案了....囧....CMSIS。。。

出0入0汤圆

发表于 2014-6-18 17:03:40 | 显示全部楼层
有这个必要吗?C编译器要管指令吗?

出0入0汤圆

 楼主| 发表于 2014-6-18 20:05:49 | 显示全部楼层
wangpengcheng 发表于 2014-6-18 17:03
有这个必要吗?C编译器要管指令吗?

这语气...你去看看CMSIS-DSP是干嘛的吧。

出0入0汤圆

 楼主| 发表于 2014-6-18 23:18:15 | 显示全部楼层
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的话,基本上做不了啥运算或控制了。如果你不了解这一块的话,能不能帮我咨询下别人呢,谢谢!

出0入0汤圆

发表于 2014-6-18 23:35:51 | 显示全部楼层
wanstrive 发表于 2014-6-18 20:05
这语气...你去看看CMSIS-DSP是干嘛的吧。

不是有函数吗?
调用函数不是可以吗?
没用过啊,只是看过一点资料!

出0入0汤圆

 楼主| 发表于 2014-6-18 23:39:53 | 显示全部楼层
wangpengcheng 发表于 2014-6-18 23:35
不是有函数吗?
调用函数不是可以吗?
没用过啊,只是看过一点资料!

用过飞思卡尔的DSC么?主要是如果没有单周期乘法器的话,乘除法特别耗时,基本上就做不了啥应用了。。

出0入0汤圆

发表于 2014-6-18 23:42:56 | 显示全部楼层
哥们,太佩服你了,现在还在线!
我只是看过一些应用,没用过DSC,但是我觉得48M做FTF两MS的时候不应该有你说的这样的啊,可能我理解错误!但是做FTF48M真的只有2MS,这个我是测试过的!

出0入0汤圆

 楼主| 发表于 2014-6-18 23:48:23 | 显示全部楼层
wangpengcheng 发表于 2014-6-18 23:42
哥们,太佩服你了,现在还在线!
我只是看过一些应用,没用过DSC,但是我觉得48M做FTF两MS的时候不应该有你 ...

哈哈,你这不也在线么,FTF指的是啥,FFT么?用的是哪款片子呀?我这电机控制....必须us级,一个5k的pwm中断总共才200us

出0入0汤圆

发表于 2014-6-19 00:11:58 | 显示全部楼层
wanstrive 发表于 2014-6-18 23:48
哈哈,你这不也在线么,FTF指的是啥,FFT么?用的是哪款片子呀?我这电机控制....必须us级,一个5k的pwm中 ...

回来没关电脑,上来看一下!

出0入0汤圆

发表于 2014-6-19 01:11:31 | 显示全部楼层
M0+的处理器,目标就是逻辑控制,运算性能还不如CM3,小负荷的数学运算还能用时间补回来,重负载肯定吃不住的。
而且M0内核标配是没有乘法器的,FSL有没有额外的放一个IP进去要看DS。
如果有的话,一般都会给操作的方法,方便的直接在IDE里面就做了,麻烦点的,就要自己写寄存器了。
呼叫FSL的技术支持,给力啊同志们。

出0入0汤圆

发表于 2014-6-19 09:10:08 | 显示全部楼层
wanstrive 发表于 2014-6-18 23:18
唉,还是没有搞定~继续求助啊,我测试了一下,我用的是MKE02Z16VLC2,用的最高频率20MHz,然后开发环境是C ...

能简单介绍一下你的测试步骤吗?

出0入0汤圆

 楼主| 发表于 2014-6-19 10:10:43 | 显示全部楼层
error_dan 发表于 2014-6-19 01:11
M0+的处理器,目标就是逻辑控制,运算性能还不如CM3,小负荷的数学运算还能用时间补回来,重负载肯定吃不住 ...

谢谢支持!

出0入0汤圆

 楼主| 发表于 2014-6-19 10:11:27 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-6-19 09:10
能简单介绍一下你的测试步骤吗?

一个*一个/测时间....我觉得总该有特别的指令吧,要不然datasheet上号称的单周期乘法哪去了。。。

出0入0汤圆

发表于 2014-6-19 10:20:10 | 显示全部楼层
wanstrive 发表于 2014-6-19 10:11
一个*一个/测时间....我觉得总该有特别的指令吧,要不然datasheet上号称的单周期乘法哪去了。。。 ...

你int32*int32的10us是怎么测出来的?看到你在与非也问了。
测试方法准不准呢?

出0入0汤圆

发表于 2014-6-19 10:23:39 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-6-19 10:20
你int32*int32的10us是怎么测出来的?看到你在与非也问了。
测试方法准不准呢? ...

同问,你这个是如何测试出来的

出0入0汤圆

 楼主| 发表于 2014-6-19 10:25:47 | 显示全部楼层
浪里白条 发表于 2014-6-19 10:23
同问,你这个是如何测试出来的

GPIO置位清位~

出0入0汤圆

发表于 2014-6-19 10:48:54 | 显示全部楼层

然后用示波器测量出来 是吗

出0入0汤圆

 楼主| 发表于 2014-6-19 10:51:54 | 显示全部楼层
浪里白条 发表于 2014-6-19 10:48
然后用示波器测量出来 是吗

是这样的,我刚修改了一下codewarrior的优化选项,发现现在一个乘法用了1.6us,刚好是20Mhz下的32个周期,然后一个除法4.4us,88个周期.....求单周期乘法啊。。。

出0入0汤圆

 楼主| 发表于 2014-6-19 10:55:01 | 显示全部楼层
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啊!希望帮我咨询一下那边的工程师那个怎么用吧,还是本身就没有单周期乘法...谢谢!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-6-19 13:41:10 | 显示全部楼层
用GPIO的测试方法不准,你可以用systemtick的方式测试,在我们的BME代码中有测试一条指令执行多少个systemtick的counter,你可以试试那种方法。
另外,你测试的乘法代码是什么?请贴出来给我们看看。

出0入0汤圆

发表于 2014-6-19 14:22:45 | 显示全部楼层
另外,楼主看看你乘法指令对应的汇编代码是什么? 是一句还是多句?

出0入0汤圆

 楼主| 发表于 2014-6-19 14:37:24 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-6-19 14:22
另外,楼主看看你乘法指令对应的汇编代码是什么? 是一句还是多句?

就是想问汇编代码的事...没有用汇编代码,因为不知道怎么用

出0入0汤圆

发表于 2014-6-19 15:24:43 | 显示全部楼层
wanstrive 发表于 2014-6-18 23:48
哈哈,你这不也在线么,FTF指的是啥,FFT么?用的是哪款片子呀?我这电机控制....必须us级,一个5k的pwm中 ...

楼主做电机控制不妨在官网搜FSLESL,有我们的库可以用,clark变换和park变换。
也有你需要的数学函数库啊

出0入0汤圆

 楼主| 发表于 2014-6-19 15:30:33 | 显示全部楼层
FSL_FAE_River 发表于 2014-6-19 15:24
楼主做电机控制不妨在官网搜FSLESL,有我们的库可以用,clark变换和park变换。
也有你需要的数学函数库啊 ...

这个是后话,现在做电流电压量化,普通的乘除法耗时太长,需要单周期乘法...

出0入0汤圆

发表于 2014-6-19 16:37:12 | 显示全部楼层
wanstrive 发表于 2014-6-19 14:37
就是想问汇编代码的事...没有用汇编代码,因为不知道怎么用

你先告诉我写乘法的代码,我用和你一模一样的,我这边测试下。

出0入0汤圆

 楼主| 发表于 2014-6-19 16:41:00 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-6-19 16:37
你先告诉我写乘法的代码,我用和你一模一样的,我这边测试下。

就是一个*,一个/,请问你会不会用它的汇编指令呢~

出0入0汤圆

发表于 2014-6-19 16:59:45 | 显示全部楼层
wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~

楼上的工程师是要你把你的测试代码填上来,我们复现一下,然后找出问题所在。

出0入0汤圆

发表于 2014-6-19 17:00:32 | 显示全部楼层
wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~





我去下载了ARM CORTEX-M0的的指令集,在第49页发现了这个指令,应该是做乘法的

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-6-19 17:14:36 | 显示全部楼层
wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~

你知道怎么在codeworrior中 C嵌入汇编不,知道的话我们可以尝试下

出0入0汤圆

发表于 2014-6-19 17:27:13 | 显示全部楼层
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是一个机器周期,而且我们的手册上都讲了,是一个机器周期。
希望能帮到你;

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-6-19 17:27:52 | 显示全部楼层
我尝试在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

出0入0汤圆

发表于 2014-6-19 17:28:42 | 显示全部楼层
浪里白条 发表于 2014-6-19 17:27
我尝试在C语言中插入了这句
  asm("MULS R0,R2,R0\n");  /*Multiply with flag update, R0 = R0 x R2*/

这个你要看看相应的编译器的混合编程是怎么弄的。

出0入0汤圆

发表于 2014-6-19 17:29:09 | 显示全部楼层
wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~

我在code worrior的帮助文档中 找到了这个用法 不知道这样用对不对

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-6-19 17:29:43 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-6-19 17:28
这个你要看看相应的编译器的混合编程是怎么弄的。

嗯 我研究了一阵了,下班了
有空了再研究

出0入0汤圆

发表于 2014-6-19 17:34:51 | 显示全部楼层
浪里白条 发表于 2014-6-19 17:29
嗯 我研究了一阵了,下班了
有空了再研究

感兴趣,可以自己用systick的方法测一下,注意还要减掉两条systick读值的时间,不然不准。
具体方法就如我上面讲的。测试思想很简单。
如果你验证之后,可以发出你的结果。

出0入0汤圆

 楼主| 发表于 2014-6-19 19:25:19 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-6-19 17:34
感兴趣,可以自己用systick的方法测一下,注意还要减掉两条systick读值的时间,不然不准。
具体方法就如 ...

好的,真是谢谢了,问题应该是解决了,再问一句,如果不用汇编的话,是不是得把优化等级配置到level 2?

出0入0汤圆

发表于 2014-6-20 14:43:52 | 显示全部楼层
wanstrive 发表于 2014-6-19 19:25
好的,真是谢谢了,问题应该是解决了,再问一句,如果不用汇编的话,是不是得把优化等级配置到level 2? ...

不建议这样做,其实编译已经对代码的优化程度已经很高啊,再增加的可能会出现代码实现的功能与你期望不同的问题。

出0入0汤圆

发表于 2014-6-20 14:50:32 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-6-20 14:43
不建议这样做,其实编译已经对代码的优化程度已经很高啊,再增加的可能会出现代码实现的功能与你期望不同 ...

楼主,为什么我的帖子没人回,我急用啊

出0入0汤圆

发表于 2014-6-20 15:04:52 | 显示全部楼层
ln08136207 发表于 2014-6-20 14:50
楼主,为什么我的帖子没人回,我急用啊

那个帖子,链接拿来!

出0入0汤圆

发表于 2014-6-20 15:10:41 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-6-20 15:04
那个帖子,链接拿来!

http://www.amobbs.com/forum.php? ... p;page=1#pid7628277

出0入0汤圆

发表于 2014-6-23 15:11:38 | 显示全部楼层
wanstrive 发表于 2014-6-19 19:25
好的,真是谢谢了,问题应该是解决了,再问一句,如果不用汇编的话,是不是得把优化等级配置到level 2? ...

我个人认为,你看看你在仿真的时候,C对应的汇编情况,如果优化后并没有影响到这句C的对应汇编代码量,就无所谓优化等级。

出0入0汤圆

 楼主| 发表于 2014-6-24 09:55:56 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-6-23 15:11
我个人认为,你看看你在仿真的时候,C对应的汇编情况,如果优化后并没有影响到这句C的对应汇编代码量,就 ...

如果不进行优化,就不调用MULS

出0入0汤圆

发表于 2014-6-24 11:28:56 | 显示全部楼层
wanstrive 发表于 2014-6-24 09:55
如果不进行优化,就不调用MULS

为什么这么说呢,你可以在CW截张图出来看看!

出0入0汤圆

 楼主| 发表于 2014-6-24 12:55:07 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-6-24 11:28
为什么这么说呢,你可以在CW截张图出来看看!

我是在FreeScale Community上看到的一个帖子说的,而且我也试过,如果不把优化级别提升至level 2,运算时间会加长。

出0入0汤圆

发表于 2014-6-24 13:24:51 | 显示全部楼层
wanstrive 发表于 2014-6-24 09:55
如果不进行优化,就不调用MULS

你的优化登记是多少?
我优化等级跳到None,还是条用muls的,你不调用应该是你语句的写法问题。

出0入0汤圆

 楼主| 发表于 2014-6-24 14:41:31 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-6-24 13:24
你的优化登记是多少?
我优化等级跳到None,还是条用muls的,你不调用应该是你语句的写法问题。 ...

能看一下你写的语句么?

出0入0汤圆

发表于 2014-6-24 14:45:45 | 显示全部楼层
wanstrive 发表于 2014-6-24 14:41
能看一下你写的语句么?

当然:

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-6-24 15:20:16 | 显示全部楼层

图片一直刷不出来,囧

出0入0汤圆

发表于 2014-6-26 22:57:21 | 显示全部楼层
wanstrive 发表于 2014-6-24 15:20
图片一直刷不出来,囧

现在图能看见了,这几天阿莫一直在更新服务器,老是出现不稳定现象呢。

出0入0汤圆

发表于 2014-7-1 09:57:37 | 显示全部楼层
楼主你好
ZJJ昨天发了一篇经验分享帖讲解你这问题,有空你可以关注一下:【经验分享】KE02单条乘法指令为一个周期的测试方法讲解

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-16 09:29

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

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