查看: 12738|回复: 12

[已解决] CORTEX m0+ 单周期乘法指令问题(已解决)

[复制链接]

该用户从未签到

5

主题

32

帖子

0

注册会员

Rank: 2

积分
99
最后登录
1970-1-1
发表于 2014-6-23 16:14:55 | 显示全部楼层 |阅读模式
您好!目前我在调试贵公司的MKE02Z64VLC2芯片,它是一款cortex m0+内核的芯片,支持单周期乘法指令MULS,但是目前我在调试实用汇编asm("muls  R1,R2,R1"),code warrior 10.6报错,说不支持thunm mode 指令,我写了了函数 int16 mult_r(int16 a,int16 b)
{
int32 m=0;
m=(a*b)>>15;
return m;
}
运行时间竟然2us,我是配置的总线时钟是20MHZ,但是单独运行m=(a*b)>>15;大概是550ns,运行
 m=(16384*16384)>>15;大概是300ns,我查看反汇编指令,前者mult_r(int16 a,int16 b)指令最多,m=(a*b)>>15;居中,m=(16384*16384)>>15;最短。而且反汇编中都有MULS 指令出现,但是不知道我直接编写汇编指令为什么不能编译?还有单周期乘法指令应该是50ns,那怎么编写才能实现时间最短?或者有什么手册能提供帮助?还望指点!谢谢!
我知道答案 目前已有11人回答
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-23 17:32:00 | 显示全部楼层

RE:CORTEX m0+ 单周期乘法指令问题

楼主你好!
感谢你在我们论坛发帖。
我想问下,你说的运行时间2us是整个函数的时间吗?
m=(16384*16384)>>15;
这句的运行时间肯定短,因为它会直接将16384*16384算好后放在一个寄存器里,然后你运行这句的时候,就直接取结果了。
m=(a*b)>>15这个时间稍长,是因为要先取数放在a和b中,然后再进行乘法指令(一个机器周期)。而每个取数据的时间,都会占用2个机器周期,再加放结果,所以时间会比较长点。
另外,这里我问下,你的测试时间方法是用什么测的?
关于汇编插入的问题,我会自己建工程,查看之后再给你回复。
其实,如果C对应的汇编就是最精简的,也没有必要一定用混合汇编的方式。
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

32

帖子

0

注册会员

Rank: 2

积分
99
最后登录
1970-1-1
 楼主| 发表于 2014-6-23 17:49:57 | 显示全部楼层

回复:CORTEX m0+ 单周期乘法指令问题

回复第 2 楼 于2014-06-23 17:32:00发表:
楼主你好!
感谢你在我们论坛发帖。
我想问下,你说的运行时间2us是整个函数的时间吗?
m=(16384*16384)>>15;
这句的运行时间肯定短,因为它会直接将16384*16384算好后放在一个寄存器里,然后你运行这句的时候,就直接取结果了。
m=(a*b)>>15这个时间稍长,是因为要先取数放在a和b中,然后再进行乘法指令(一个机器周期)。而每个取数据的时间,都会占用2个机器周期,再加放结果,所以时间会比较长点。
另外,这里我问下,你的测试时间方法是用什么测的?
关于汇编插入的问题,我会自己建工程,查看之后再给你回复。
其实,如果C对应的汇编就是最精简的,也没有必要一定用混合汇编的方式。
 

嗯嗯是整个函数的时间,只要把乘法封装成一个函数来调用,时间就变得很长了,大概是2us,用示波器测得,不是很准。非常感谢大神指点。那为什么混合汇编调用MULS指令,总是报错,说不支持THUNM 16指令,但是手册上,我理解应该是支持的,还是我调用方式不对?谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-24 13:54:57 | 显示全部楼层

回复:CORTEX m0+ 单周期乘法指令问题

楼主你好,下面来回答你的几个问题
1:关于为什么封装成函数时间就会变长的问题,下面我用汇编的形式来讲解下这个原因。
例如,我做一个乘法:
uint32 test1, test2,test_r=0;   
test1=0x11;
   test2=0x22;
   test_r=test1*test2;
如果直接调用,那么汇编的情况如下:
28.jpg
你可以看到,test_r=test1*test2;这句也就对应了4条汇编语句。
其中,ldr 2个机器周期,muls对应1个机器周期,str对应两个机器周期。
下面再看看,如果封装成函数的时候,对应的汇编情况又如何:
29.jpg
可以看到,这个时候需要进入函数,再返回函数等操作,这时候同样功能的st_r=test1*test2;已经变成了9条汇编语句,而每条汇编都是占用一定机器周期的,执行时间可想而知。
所以,这个就解释了为什么封装函数的执行时间就会变长。
 关于,每条汇编语句执行的时间,你可以参考这个帖子:
http://blog.csdn.net/nolatin/article/details/8159551
 
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-24 13:57:42 | 显示全部楼层

RE:CORTEX m0+ 单周期乘法指令问题

2:关于测试代码执行时间的方法
   前不久有一位网友采用翻IO看示波器的方法测量,这个肯定是不准的。你如果想要比较准确的测量,建议使用systick的方法测试,具体情况可以参考官方例程BME的测试方法,下面链接是KL25的测试BME代码的时间方法,你可以参考:
https://www.nxpic.org.cn/bbs/article_1280_566162.html
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-24 14:01:33 | 显示全部楼层

RE:CORTEX m0+ 单周期乘法指令问题

3:关于直接嵌入汇编的问题。
我试了下,的确也遇到和你一样的问题,这个问题我需要问一下CW的专家,鉴于专家目前不在,所以可能会迟点回复你。
但是,我认为,如果生成的C代码本来就比较精简,就没有必要一定使用嵌入汇编的方法,你可以看看C代码对应的汇编,比如4楼直接调用,已经比较精简了,如果你用嵌入的话,asm("muls  R1,R2"),你同样需要先把值放到R1,R2中,其实这样生成的汇编和直接C的汇编还是一样的,所以,我认为没有必要嵌入。
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

32

帖子

0

注册会员

Rank: 2

积分
99
最后登录
1970-1-1
 楼主| 发表于 2014-6-24 17:37:52 | 显示全部楼层

回复:CORTEX m0+ 单周期乘法指令问题

回复第 6 楼 于2014-06-24 14:01:33发表:
3:关于直接嵌入汇编的问题。
我试了下,的确也遇到和你一样的问题,这个问题我需要问一下CW的专家,鉴于专家目前不在,所以可能会迟点回复你。
但是,我认为,如果生成的C代码本来就比较精简,就没有必要一定使用嵌入汇编的方法,你可以看看C代码对应的汇编,比如4楼直接调用,已经比较精简了,如果你用嵌入的话,asm("muls R1,R2"),你同样需要先把值放到R1,R2中,其实这样生成的汇编和直接C的汇编还是一样的,所以,我认为没有必要嵌入。 

好滴,非常感谢,讲解的相当详细,至于为什么调用汇编asm("muls R1,R2")报错,还望有时间再给解释一下,谢过
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-25 09:33:02 | 显示全部楼层

回复:CORTEX m0+ 单周期乘法指令问题

回复第 7 楼 于2014-06-24 17:37:52发表:
回复第 6 楼 于2014-06-24 14:01:33发表:
3:关于直接嵌入汇编的问题。
我试了下,的确也遇到和你一样的问题,这个问题我需要问一下CW的专家,鉴于专家目前不在,所以可能会迟点回复你。
但是,我认为,如果生成的C代码本来就比较精简,就没有必要一定使用嵌入汇编的方法,你可以看看C代码对应的汇编,比如4楼直接调用,已经比较精简了,如果你用嵌入的话,asm("muls R1,R2"),你同样需要先把值放到R1,R2中,其实这样生成的汇编和直接C的汇编还是一样的,所以,我认为没有必要嵌入。 

好滴,非常感谢,讲解的相当详细,至于为什么调用汇编asm("muls R1,R2")报错,还望有时间再给解释一下,谢过
 

嗯啊,这个为什么报错我也不会,我要帮你问下我们的CW工程师,他暂时不在,如果我有答案一定告诉你,我会在这里跟贴的。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-26 15:39:15 | 显示全部楼层

回复:CORTEX m0+ 单周期乘法指令问题

楼主你好,经过和我们CW工程师的交流,他认为,CW中识别的可能是默认的那种乘法指令。
即 asm("mul  R1,R2");
经过这样写后,然后反汇编:
33.jpg
发现识别出来的同样是muls,所以应该就是写mul,写法不同导致报错的。
这样看,你会发现,生成的汇编和你之前写的几乎还是一样,所以我认为你没有必要一定插入汇编,因为就算你写了这一条,你还是要在前面加放入R2,R1,的汇编操作,结果还是一样的。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

147

帖子

0

中级会员

Rank: 3Rank: 3

积分
343
最后登录
1970-1-1
发表于 2014-6-26 16:50:15 | 显示全部楼层

RE:CORTEX m0+ 单周期乘法指令问题

版主回答的很好,学习到了!
如果能有用systick测试这种代码的例子就更好了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-21 21:41 , Processed in 0.113359 second(s), 31 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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