注册 登录
查看: 8245|回复: 48

[K60] 【K60F系列开启硬件浮点方法】K60的FX/FN浮点性能是DN的 5倍多

[复制链接]
发表于 2014-11-7 21:48:25 | 显示全部楼层 |阅读模式
因为K60的FX代码,调了几天就发布,太匆忙,没认真看手册。

K60的FX ,开启硬件浮点,需要在工程选项里选择:


除了工程选项设置外,还需要加入开启硬件浮点的代码:(放入 start 函数 的 mian函数之前即可!!!)
  1. #if   MK60F15

  2.     SCB->CPACR |=((3UL << 10*2)|(3UL << 11*2));     /* set CP10 and CP11 Full Access */

  3. #endif


IAR 6.3 是不支持硬件浮点的,需要用高版本的,最起码是 IAR 6.5。

之前失策的地方是,没看手册,不知道代码里也需要开启寄存器。

测试的代码如下:
  1. volatile float x=0.42;
  2. volatile float y=0.875;

  3. /*!
  4. *  @brief      main函数
  5. *  @since      v5.0
  6. *  @note       山外 PIT 计时 浮点测试实验
  7. */
  8. void main()
  9. {
  10.     uint32 timevar;
  11. #if   MK60F15       //这里仅仅是展示,最好放入start函数执行main函数之前

  12.     SCB->CPACR |=((3UL << 10*2)|(3UL << 11*2));     /* set CP10 and CP11 Full Access */

  13. #endif

  14.     while(1)
  15.     {
  16.         pit_time_start  (PIT0);                 //开始计时

  17.         for(i=0;i<TIME;i++)
  18.         {
  19.             x=x*y;
  20.         }

  21.         timevar = pit_time_get_us    (PIT0);    //获取计时时间

  22.         pit_time_close  (PIT0);

  23.         printf("\n\n计时时间为:%dus",timevar); //打印延时时间

  24.         DELAY_MS(1000);
  25.     }
  26. }


都是在相同频率下:core 200M,bus 100M的情况下 测的
DN 用了 :7601us

FX 不开硬件浮点:6170us
FX 开启硬件浮点:1450us


可以看到,开了硬件浮点后,FX的浮点性能比DN 高 (5.24 -1)倍。FX比不开启硬件浮点时高 (4.25 -1)倍




测试中,发现一个有趣的结果:
float x=0.42,y=0.875;
x= x*y;  的效率 要比x= x* 0.875  高 (9.38 -1)倍。



提示,如果把开启代码放在main函数,有可能出现这情况:


本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2014-11-7 22:18:21 | 显示全部楼层
这也算是一个bug了吧,我替大伙原谅你了辛苦了
回复 支持 反对

使用道具 举报

发表于 2014-11-7 23:21:27 | 显示全部楼层
顶山外,忙着考试,两天没来了

这种bug,不认真百度搜索 或者 看手册,没发现,很正常。
回复 支持 反对

使用道具 举报

发表于 2014-11-8 14:36:16 | 显示全部楼层
火哥你好,代码中第十四行:SCB->CPACR |=((3UL << 10*2)|(3UL << 11*2));     /* set CP10 and CP11 Full Access */是什么意思能具体讲一下吗?
我的是FX芯片,在工程选项里只要勾选使用浮点单元,(一个点亮小灯的程序)就会出错,不勾选就正常,
回复 支持 反对

使用道具 举报

发表于 2014-11-8 14:37:28 | 显示全部楼层
xkwy 发表于 2014-11-8 14:36
火哥你好,代码中第十四行:SCB->CPACR |=((3UL

这里是山外论坛,应该叫山外哥。

你有没有加入相应的代码?
回复 支持 反对

使用道具 举报

发表于 2014-11-8 14:50:21 | 显示全部楼层
仰逸致 发表于 2014-11-8 14:37
这里是山外论坛,应该叫山外哥。

你有没有加入相应的代码?

他俩人啥关系?新人不懂,,,


我的工程是一个最小工程,没有用库,在工程里添加了system_MK60F15.c和startup_MK60F15.s,
然后只添加了main.c

  1. # include "MK60F15.h"

  2. void delay(void)
  3. {
  4.     uint32_t i;
  5.     for (i = 0; i < 0x200000UL; i++);
  6. }

  7. int main(void)
  8. {
  9.     SIM->SCGC5 |= SIM_SCGC5_PORTB_MASK;
  10.    
  11.     PORTB->PCR[20] &= ~PORT_PCR_MUX_MASK;
  12.     PORTB->PCR[20] |= PORT_PCR_MUX(1);
  13.    
  14.     PTB->PDDR |= (1<<20);
  15.    
  16.     PTB->PCOR |= (1<<20);
  17.    
  18.     while (1)
  19.     {
  20.         PTB->PTOR |= (1<<20);
  21.         delay();
  22.     }
  23. }

回复 支持 反对

使用道具 举报

发表于 2014-11-8 14:53:42 | 显示全部楼层
xkwy 发表于 2014-11-8 14:50
他俩人啥关系?新人不懂,,,

需要加入这代码啊:
SCB->CPACR |=((3UL << 10*2)|(3UL << 11*2));     /* set CP10 and CP11 Full Access */

如果不加,那就关闭了硬件浮点。
回复 支持 反对

使用道具 举报

发表于 2014-11-8 14:53:43 | 显示全部楼层
xkwy 发表于 2014-11-8 14:50
他俩人啥关系?新人不懂,,,

需要加入这代码啊:
SCB->CPACR |=((3UL << 10*2)|(3UL << 11*2));     /* set CP10 and CP11 Full Access */

如果不加,那就关闭了硬件浮点。
回复 支持 反对

使用道具 举报

发表于 2014-11-8 15:00:10 | 显示全部楼层
仰逸致 发表于 2014-11-8 14:53
需要加入这代码啊:
SCB->CPACR |=((3UL

FX 代码哪里有。。。
回复 支持 反对

使用道具 举报

发表于 2014-11-8 15:05:09 | 显示全部楼层
IAR 7.3已试过   不支持  开FPU直接跑飞   连调试都不能
回复 支持 反对

使用道具 举报

发表于 2014-11-8 15:05:49 | 显示全部楼层
gxx9203 发表于 2014-11-8 15:00
FX 代码哪里有。。。

K60 的代码就是了,5.1 版本
回复 支持 反对

使用道具 举报

发表于 2014-11-8 15:09:58 | 显示全部楼层
不行啊,在main函数的一开始就加了那行代码,,,,问题依旧



是不是还需要哪些设置?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2014-11-8 15:15:01 | 显示全部楼层
xkwy 发表于 2014-11-8 15:09
不行啊,在main函数的一开始就加了那行代码,,,,问题依旧

你用 的是 keil 啊,应该在进入main函数前就加入。

汇编命令,先执行一个函数,忘了是什么名字了,然后再跳到 __main执行的。要在进入main前加入。
回复 支持 反对

使用道具 举报

发表于 2014-11-8 18:29:51 | 显示全部楼层
这样算出来的时间准吗?感觉那个for(i=0;i<TIME;i++)语句,让i加10000次也会浪费不少时间的吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-8 21:33:16 | 显示全部楼层
707859338 发表于 2014-11-8 18:29
这样算出来的时间准吗?感觉那个for(i=0;i

是会浪费时间的,我这里仅仅是进行简单的测试。

你可以 复制一大堆代码,都是浮点运算来测一下。
回复 支持 反对

使用道具 举报

发表于 2014-11-9 09:41:30 | 显示全部楼层
对了,山外哥,DN的是在哪儿开启啊
回复 支持 反对

使用道具 举报

发表于 2014-11-9 10:27:23 | 显示全部楼层
CP19940613 发表于 2014-11-9 09:41
对了,山外哥,DN的是在哪儿开启啊

dn没硬件浮点
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-10 11:36:18 | 显示全部楼层
山外大神好吊!
回复 支持 反对

使用道具 举报

发表于 2014-11-10 20:46:55 | 显示全部楼层
哎  本来我都打算用FX的  可惜了   只能用KL26了
回复 支持 反对

使用道具 举报

发表于 2014-11-16 18:31:26 | 显示全部楼层
MK60DN512ZVLQ10支持硬件浮点吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-16 18:34:12 | 显示全部楼层
693618760 发表于 2014-11-16 18:31
MK60DN512ZVLQ10支持硬件浮点吗?

不支持,只有fx才支持。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-18 21:17:02 | 显示全部楼层
你好楼主,我按照你的方法设定之后编译出来的代码还是没有任何不同请问是不是我根本就没有启动fpu成功?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-18 23:21:27 | 显示全部楼层
黑暗骑士寒心雨 发表于 2014-11-18 21:17
你好楼主,我按照你的方法设定之后编译出来的代码还是没有任何不同请问是不是我根本就没有启动fpu成功?

看汇编代码,会有所不同的。另外,iar高版本才支持硬件浮点。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-20 10:33:45 | 显示全部楼层
山外哥,我用FX15,IAR7.2编译,在main()里加了
#if   MK60F15

    SCB->CPACR |=((3UL << 10*2)|(3UL << 11*2));     /* set CP10 and CP11 Full Access */

#endif

但是printf返回
****default_isr entered on vector 3*****

HardFault Interrupt

怎么办?
回复 支持 反对

使用道具 举报

发表于 2014-11-20 10:38:13 | 显示全部楼层
ustcer 发表于 2014-11-20 10:33
山外哥,我用FX15,IAR7.2编译,在main()里加了
#if   MK60F15

IAR 的 printf 函数打印浮点是有问题的。
多搜索一下论坛帖子吧。
IAR 输出浮点失败的解决方法 - 智能车资料区 - 山外论坛 http://www.vcan123.com/forum.php ... tid=2878&ctid=1

回复 支持 反对

使用道具 举报

发表于 2014-11-20 10:42:32 | 显示全部楼层
不是呀,这明显是硬件没打开
回复 支持 反对

使用道具 举报

发表于 2014-11-20 10:44:42 | 显示全部楼层
哦,是我蠢了
回复 支持 反对

使用道具 举报

发表于 2014-11-20 10:45:23 | 显示全部楼层
不是浮点运算没打开,是printf没选择输出浮点
回复 支持 反对

使用道具 举报

发表于 2014-12-19 11:44:15 | 显示全部楼层
suqiang1271 发表于 2014-11-10 20:46
哎  本来我都打算用FX的  可惜了   只能用KL26了

有同感的说。。
回复 支持 反对

使用道具 举报

发表于 2015-1-28 19:07:30 | 显示全部楼层
顶一下!
回复 支持 反对

使用道具 举报

发表于 2015-1-31 12:32:41 | 显示全部楼层
开了硬件浮点之后编译就出错了,我看山外哥有另一个帖子也说了编译出错这个问题,到底是开还是不开?开的话正确的方法是什么?求教山外哥。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-31 12:39:56 | 显示全部楼层
D12350 发表于 1422678761
开了硬件浮点之后编译就出错了,我看山外哥有另一个帖子也说了编译出错这个问题,到底是开还是不开?开的话正确的方法是什么?求教山外哥。
编译提示什么出错?

开的话,楼主贴有说明的啊。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2015-1-31 21:58:38 | 显示全部楼层
山外哥,我在start函数main()之前加了那句话,也在工程配置里开启了FPU,的确可以运算浮点数。但是发现一个现象,如果我在开启FPU的情况下把采集的图像写入SD卡,程序就会卡死,而且没有跳到硬件中断,串口没有东西;如果不写入SD卡,那么就不会卡死。
这种情况你遇到过吗?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2015-1-31 21:59:12 | 显示全部楼层
接上,如果不开fpu,写sd卡是不会卡死的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-31 22:04:03 | 显示全部楼层
路易十三四五六 发表于 1422712752
接上,如果不开fpu,写sd卡是不会卡死的
没留意到这问题。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2015-2-2 16:00:38 | 显示全部楼层
求助:我用山外哥说的方法,在options开了FPU,然后在system_MK60DN.c加了那句话,复制了上面的代码,可是一旦执行到x=x*y时,就硬件上访,板上的D2灯就亮
回复 支持 反对

使用道具 举报

发表于 2015-2-4 01:11:23 | 显示全部楼层
山外メ雲ジ 发表于 2015-1-31 12:39
编译提示什么出错?

开的话,楼主贴有说明的啊。

好了,谢谢山外哥。不知道上一次怎么搞的就是不行,还是懂得太少了。
回复 支持 反对

使用道具 举报

发表于 2015-3-15 21:35:03 | 显示全部楼层
707859338 发表于 2014-11-8 15:05
IAR 7.3已试过   不支持  开FPU直接跑飞   连调试都不能

求教7.3版本的最后成功了吗?
回复 支持 反对

使用道具 举报

发表于 2015-3-27 17:35:17 | 显示全部楼层
我把代码放在  main()里,while(1) 的前面行不
?   start 函数是什么,我没有啊
回复 支持 反对

使用道具 举报

发表于 2015-4-21 12:59:54 | 显示全部楼层

我把代码放在  main()里,while(1) 的前面行不
?   start 函数是什么,我没有啊

回复 支持 反对

使用道具 举报

发表于 2015-5-4 10:07:02 | 显示全部楼层
顶山哥,完美解决
回复 支持 反对

使用道具 举报

发表于 2015-7-17 16:15:06 | 显示全部楼层
山外哥,我用k60FX为什么把浮点强制转成整型就跑飞,感觉都不符合C语言标准了,这是为什么?还有”硬件浮点“不懂,能给解释下吗
回复 支持 反对

使用道具 举报

发表于 2016-1-13 20:59:07 | 显示全部楼层
感谢火哥帮我解决问题
回复 支持 反对

使用道具 举报

发表于 2016-1-13 21:00:26 | 显示全部楼层
请问火哥 这个东西在手册的哪一页?我想看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-13 21:09:55 | 显示全部楼层
静心潜力 发表于 2016-1-13 21:00
请问火哥 这个东西在手册的哪一页?我想看看

ARM的内核手册,不是k60手册
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2016-1-14 13:04:51 | 显示全部楼层

应该是这个了吧

本帖最后由 静心潜力 于 2016-1-14 13:06 编辑

C:\Users\kevin\Desktop\1.png

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2016-3-4 12:03:02 | 显示全部楼层
山外哥,我按你说的配置了  也在start函数中加入了开启代码,IAR是7.0版,每次运算float都跑飞了    怎么解决?
回复 支持 反对

使用道具 举报

发表于 2016-7-27 02:59:37 | 显示全部楼层
DN不支持浮点运算= =  我的电子秤不会做了  求思路 啊   啊啊啊啊啊啊啊   大神们
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 10:51:40 | 显示全部楼层
游学者周卓233 发表于 2016-7-27 02:59
DN不支持浮点运算= =  我的电子秤不会做了  求思路 啊   啊啊啊啊啊啊啊   大神们

支持,只不过是软件浮点运算,运行速度不如fn
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

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

本版积分规则

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