wanstrive 发表于 2014-6-18 10:33:40

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

本帖最后由 FSL_TICS_ZP 于 2014-7-8 14:47 编辑

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

浪里白条 发表于 2014-6-18 10:53:13

这个,编译器不能自动的去用硬件乘法器吗?

wanstrive 发表于 2014-6-18 11:18:28

浪里白条 发表于 2014-6-18 10:53
这个,编译器不能自动的去用硬件乘法器吗?

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

wanstrive 发表于 2014-6-18 14:57:02

怎么又没得个FSL的人来回答下

浪里白条 发表于 2014-6-18 15:11:32

wanstrive 发表于 2014-6-18 14:57
怎么又没得个FSL的人来回答下

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

wanstrive 发表于 2014-6-18 15:21:04

浪里白条 发表于 2014-6-18 15:11
这个问题太专业了大哥,耐心等待

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

FSL_TICS_ZP 发表于 2014-6-18 16:31:01

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

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

wanstrive 发表于 2014-6-18 16:32:32

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

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

wangpengcheng 发表于 2014-6-18 17:03:40

有这个必要吗?C编译器要管指令吗?

wanstrive 发表于 2014-6-18 20:05:49

wangpengcheng 发表于 2014-6-18 17:03
有这个必要吗?C编译器要管指令吗?

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

wanstrive 发表于 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的话,基本上做不了啥运算或控制了。如果你不了解这一块的话,能不能帮我咨询下别人呢,谢谢!

wangpengcheng 发表于 2014-6-18 23:35:51

wanstrive 发表于 2014-6-18 20:05
这语气...你去看看CMSIS-DSP是干嘛的吧。

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

wanstrive 发表于 2014-6-18 23:39:53

wangpengcheng 发表于 2014-6-18 23:35
不是有函数吗?
调用函数不是可以吗?
没用过啊,只是看过一点资料!

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

wangpengcheng 发表于 2014-6-18 23:42:56

哥们,太佩服你了,现在还在线!
我只是看过一些应用,没用过DSC,但是我觉得48M做FTF两MS的时候不应该有你说的这样的啊,可能我理解错误!但是做FTF48M真的只有2MS,这个我是测试过的!

wanstrive 发表于 2014-6-18 23:48:23

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

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

wangpengcheng 发表于 2014-6-19 00:11:58

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

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

error_dan 发表于 2014-6-19 01:11:31

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

FSL_TICS_ZP 发表于 2014-6-19 09:10:08

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

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

wanstrive 发表于 2014-6-19 10:10:43

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

谢谢支持!

wanstrive 发表于 2014-6-19 10:11:27

FSL_TICS_ZP 发表于 2014-6-19 09:10
能简单介绍一下你的测试步骤吗?

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

FSL_TICS_ZJJ 发表于 2014-6-19 10:20:10

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

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

浪里白条 发表于 2014-6-19 10:23:39

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

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

wanstrive 发表于 2014-6-19 10:25:47

浪里白条 发表于 2014-6-19 10:23
同问,你这个是如何测试出来的

GPIO置位清位~

浪里白条 发表于 2014-6-19 10:48:54

wanstrive 发表于 2014-6-19 10:25
GPIO置位清位~

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

wanstrive 发表于 2014-6-19 10:51:54

浪里白条 发表于 2014-6-19 10:48
然后用示波器测量出来 是吗

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

wanstrive 发表于 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啊!希望帮我咨询一下那边的工程师那个怎么用吧,还是本身就没有单周期乘法...谢谢!

FSL_TICS_ZJJ 发表于 2014-6-19 13:41:10

用GPIO的测试方法不准,你可以用systemtick的方式测试,在我们的BME代码中有测试一条指令执行多少个systemtick的counter,你可以试试那种方法。
另外,你测试的乘法代码是什么?请贴出来给我们看看。

FSL_TICS_ZJJ 发表于 2014-6-19 14:22:45

另外,楼主看看你乘法指令对应的汇编代码是什么? 是一句还是多句?

wanstrive 发表于 2014-6-19 14:37:24

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

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

FSL_FAE_River 发表于 2014-6-19 15:24:43

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

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

wanstrive 发表于 2014-6-19 15:30:33

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

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

FSL_TICS_ZJJ 发表于 2014-6-19 16:37:12

wanstrive 发表于 2014-6-19 14:37
就是想问汇编代码的事...没有用汇编代码,因为不知道怎么用

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

wanstrive 发表于 2014-6-19 16:41:00

FSL_TICS_ZJJ 发表于 2014-6-19 16:37
你先告诉我写乘法的代码,我用和你一模一样的,我这边测试下。

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

FSL_TICS_ZP 发表于 2014-6-19 16:59:45

wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~

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

浪里白条 发表于 2014-6-19 17:00:32

wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~





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

浪里白条 发表于 2014-6-19 17:14:36

wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~

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

FSL_TICS_ZJJ 发表于 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是一个机器周期,而且我们的手册上都讲了,是一个机器周期。
希望能帮到你;

浪里白条 发表于 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

FSL_TICS_ZJJ 发表于 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*/



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

浪里白条 发表于 2014-6-19 17:29:09

wanstrive 发表于 2014-6-19 16:41
就是一个*,一个/,请问你会不会用它的汇编指令呢~

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

浪里白条 发表于 2014-6-19 17:29:43

FSL_TICS_ZJJ 发表于 2014-6-19 17:28
这个你要看看相应的编译器的混合编程是怎么弄的。

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

FSL_TICS_ZJJ 发表于 2014-6-19 17:34:51

浪里白条 发表于 2014-6-19 17:29
嗯 我研究了一阵了,下班了
有空了再研究

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

wanstrive 发表于 2014-6-19 19:25:19

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

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

FSL_TICS_ZP 发表于 2014-6-20 14:43:52

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

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

ln08136207 发表于 2014-6-20 14:50:32

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

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

FSL_TICS_ZP 发表于 2014-6-20 15:04:52

ln08136207 发表于 2014-6-20 14:50
楼主,为什么我的帖子没人回,我急用啊

那个帖子,链接拿来!

ln08136207 发表于 2014-6-20 15:10:41

FSL_TICS_ZP 发表于 2014-6-20 15:04
那个帖子,链接拿来!

http://www.amobbs.com/forum.php?mod=viewthread&tid=5585234&page=1#pid7628277

FSL_TICS_ZJJ 发表于 2014-6-23 15:11:38

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

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

wanstrive 发表于 2014-6-24 09:55:56

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

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

FSL_TICS_ZP 发表于 2014-6-24 11:28:56

wanstrive 发表于 2014-6-24 09:55
如果不进行优化,就不调用MULS

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

wanstrive 发表于 2014-6-24 12:55:07

FSL_TICS_ZP 发表于 2014-6-24 11:28
为什么这么说呢,你可以在CW截张图出来看看!

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

FSL_TICS_ZJJ 发表于 2014-6-24 13:24:51

wanstrive 发表于 2014-6-24 09:55
如果不进行优化,就不调用MULS

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

wanstrive 发表于 2014-6-24 14:41:31

FSL_TICS_ZJJ 发表于 2014-6-24 13:24
你的优化登记是多少?
我优化等级跳到None,还是条用muls的,你不调用应该是你语句的写法问题。 ...

能看一下你写的语句么?

FSL_TICS_ZJJ 发表于 2014-6-24 14:45:45

wanstrive 发表于 2014-6-24 14:41
能看一下你写的语句么?

当然:

wanstrive 发表于 2014-6-24 15:20:16

FSL_TICS_ZJJ 发表于 2014-6-24 14:45
当然:

图片一直刷不出来,囧

FSL_TICS_ZJJ 发表于 2014-6-26 22:57:21

wanstrive 发表于 2014-6-24 15:20
图片一直刷不出来,囧

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

FSL_TICS_Robin 发表于 2014-7-1 09:57:37

楼主你好
ZJJ昨天发了一篇经验分享帖讲解你这问题,有空你可以关注一下:【经验分享】KE02单条乘法指令为一个周期的测试方法讲解

jiang887786 发表于 2014-9-3 11:26:41

谢谢57楼给答案,去看看。
页: [1]
查看完整版本: MKE系列用CW开发时单周期乘法指令是啥?(已解决)