智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3963|回复: 6
打印 上一主题 下一主题

使用Keil仿真K60系列浮点运算单元

[复制链接]

24

主题

603

帖子

1

精华

跨届大侠

西点君

Rank: 10Rank: 10Rank: 10

积分
8838

活跃会员奖章优秀会员奖章论坛元老奖章在线王奖章资源大师奖章

威望
3135
贡献
3875
兑换币
1580
注册时间
2011-5-9
在线时间
914 小时
跳转到指定楼层
1#
发表于 2012-12-12 12:44:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
K60的浮点运算单元是个可选的部件,由于我拿到的K60还不支持FPU,所以下面涉及到的浮点调试只能用仿真的方式进行。
一、不使用K60的浮点运算单元。
在默认情况下,K60的浮点单元并没有被打开,一切浮点运算还是软件浮点。
①打开Keil uVision4,新建工程,选择保存路径,选择器件,找到Freescale Semiconductor,展开,在最下面选择MK60X256VMD100。程序问你是否添加这个系列的启动代码到工程中,选择 是(如果没有出现这个选项,可以自己在Keil的安装目录里找,自己添加,其路径为C:\Keil\ARM\Startup\Freescale\K60)。这时一个新的工程就建好了,默认增加了startup_MK60N512MD100.s这个启动文件。
②测试浮点运算。我们可以新建一个C文件,用来测试浮点运算使用的是软浮点还是硬浮点。新建c文件里的代码可以如下:

int main(void)
{
    float a=3.14259265357,b=12.98635463738,result;
    result=a*b*b;
    return result;
        }

extern void SystemInit(void)
{
    int a=1;
    while(a) a--;
}


其中void SystemInit(void)这个函数是为了满足启动文件startup_MK60N512MD100.s中对SystemInit的调用,本来是对器件的初始化,这里只是做测试用,没有实际内容。(如果要得到完整的系统初始化函数,可以到Keil路径C:\Keil\ARM\Startup\Freescale\K60下找到system_MK60N512MD100.c,K60的头文件可以去Keil官方下载:http://www.keil.com/dd/chip/5359.htm)。  然后全部编译,进入调试状态,这里默认进入的是仿真调试。
在生成的汇编代码中我们可以看到以下内容:

0x000002B0 E92D41F0  PUSH          {r4-r8,lr}
     3:         float a=3.14259265357,b=12.98635463738,result;
0x000002B4 480D      LDR           r0,[pc,#52]  ; @0x000002EC
0x000002B6 4604      MOV           r4,r0
0x000002B8 480D      LDR           r0,[pc,#52]  ; @0x000002F0
0x000002BA 4605      MOV           r5,r0
     4:         result=a*b*b;
0x000002BC 4629      MOV           r1,r5
0x000002BE 4620      MOV           r0,r4
0x000002C0 F000F8A6  BL.W          _fmul (0x00000410)


可以看到,生成的汇编代码并没有使用浮点指令(一般是以V打头),进行乘法运算是调用在0x00000410处的_fmul函数来实现的,找到_fmul这个函数,可以发现进行浮点运算是用软件模拟的方式。

二、使用K60的浮点运算单元。
对于内部有浮点运算单元的K60,不使用FPU就是一种资源浪费,所以要开启它。由于默认并没有开启FPU运算,所以这里还有点小小的麻烦。
退出调试状态,在菜单中选择file--Device Database...,打开器件数据库,找到 Freescale Semiconductor--MK60X256VMD100 双击,在Options:中第一行后面添加空格,后面加入FPU2,这一行的最后变为CPUTYPE("Cortex-M4") ESEL ELITTLE FPU2,点击Update,再点击close关闭。 这样这个器件就修改好了。(注:为了防止把数据库中的器件搞乱,可以自己新建一个分类,增加一个器件,把K60这个器件的内容统统拷进这个新建的器件里,再在这个器件里面修改其属性)
器件修改完以后,可以再新建一个Keil工程,跟前面一样,选择被修改过的K60,添加启动代码,添加上面的main函数。这时我们可以打开工程属性窗口,看里面的设置:
Project--Options for Target 'Target1'...(或者直接按Alt+F7),在Target选项卡中,在Code Generation区域可以找到Floating Point Hardware下拉框,默认选择了Use FPU.
工作还没有完成,cortex-m4在默认状态下寄存器并没有打开浮点运算,还要修改启动代码。在Reset_Handler函数中,找到 LDR     R0, =__main 这个代码,在前面加入这几行:
; CPACR is located at address 0xE000ED88LDR.W R0, =0xE000ED88; Read CPACRLDR R1, [R0]; Set bits 20-23 to enable CP10 and CP11 coprocessorsORR R1, R1, #(0xF << 20); Write back the modified value to the CPACRSTR R1, [R0]
上面这段代码设定寄存器开启了浮点运算单元,否则在执行浮点运算代码时会发生HardFault。
重新编译,进入调试状态,这时可以发现生成的汇编代码跟原来的不一样了:


     3:         float a=3.14259265357,b=12.98635463738,result;
0x000002B0 EDDF1A0E  VLDR          s3,[pc,#0x38]
0x000002B4 EEF00A61  VMOV.F32      s1,s3
0x000002B8 EDDF1A0D  VLDR          s3,[pc,#0x34]
0x000002BC EEB00A61  VMOV.F32      s0,s3
     4:         result=a*b*b;
0x000002C0 EE601A80  VMUL.F32      s3,s1,s0
0x000002C4 EE611A80  VMUL.F32      s3,s3,s0
0x000002C8 EEB01A61  VMOV.F32      s2,s3


所有的浮点运算都是调用的硬件浮点运算指令,在Register观察窗口中也多了个FPU寄存器列表。



17

主题

671

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6187
QQ
威望
3024
贡献
1755
兑换币
1315
注册时间
2012-2-4
在线时间
704 小时
2#
发表于 2012-12-12 13:35:21 | 只看该作者
向楼主学习!
回复 支持 反对

使用道具 举报

59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15175

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11098
贡献
1417
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
3#
发表于 2012-12-12 16:06:19 | 只看该作者
貌似是一篇很早的文章了,内容不错,值得学习,但是楼主最好写个【转】。
回复 支持 反对

使用道具 举报

53

主题

2469

帖子

0

精华

跨届大侠

狙击手

Rank: 10Rank: 10Rank: 10

积分
11290

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章论坛骨干奖章资源大师奖章

威望
4701
贡献
3671
兑换币
2368
注册时间
2012-3-12
在线时间
1459 小时
4#
发表于 2012-12-12 16:37:19 | 只看该作者
:):)
回复 支持 反对

使用道具 举报

0

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
威望
137
贡献
61
兑换币
42
注册时间
2012-10-27
在线时间
31 小时
5#
发表于 2012-12-13 21:39:01 | 只看该作者
:lol:lol
回复 支持 反对

使用道具 举报

32

主题

978

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2834
QQ
威望
1620
贡献
482
兑换币
1009
注册时间
2012-11-29
在线时间
366 小时
6#
发表于 2013-4-17 13:53:08 | 只看该作者
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
威望
99
贡献
56
兑换币
61
注册时间
2013-9-16
在线时间
23 小时
毕业学校
重庆交通大学
7#
发表于 2013-10-13 17:41:47 | 只看该作者
在iar中该怎么改启动代码呢
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 19:49 , Processed in 0.052363 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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