查看: 5362|回复: 5

[分享] 使用Keil仿真K60系列浮点运算单元(转)

[复制链接]

该用户从未签到

16

主题

705

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1745
最后登录
1970-1-1
发表于 2014-6-6 13:39:10 | 显示全部楼层 |阅读模式
 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
回复

使用道具 举报

该用户从未签到

16

主题

705

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1745
最后登录
1970-1-1
 楼主| 发表于 2014-6-6 13:39:53 | 显示全部楼层

RE:使用Keil仿真K60系列浮点运算单元(转)

看着比较好,所以分享到这边来,希望对大家有帮助。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

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

RE:使用Keil仿真K60系列浮点运算单元(转)

感谢楼主的好贴分享!
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13136
    最后登录
    2019-1-27
    发表于 2014-6-6 17:55:23 | 显示全部楼层

    RE:使用Keil仿真K60系列浮点运算单元(转)

    赞一个
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    33
    最后登录
    2017-5-11
    发表于 2015-5-19 19:25:34 | 显示全部楼层
    IAR的怎么改?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    35

    帖子

    0

    注册会员

    Rank: 2

    积分
    138
    最后登录
    2015-11-10
    发表于 2015-5-19 20:05:29 | 显示全部楼层
    有没有cw版本的?
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-26 19:10 , Processed in 0.091283 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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