查看: 4110|回复: 18

[分享] 【经验分享】KL25在MDK中将函数指定到flash地址

[复制链接]

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-8-19 14:48:56 | 显示全部楼层 |阅读模式
 
【经验分享】KL25MDK中将函数指定到flash地址
一, 经验分享描述
          在之前的经验分享中写了些在KE02下,CWIAR以及keil的编译环境中,如何定义constant到指定的flash地址。但是实际上,大家在使用我们kinetis的过程中,可能也希望能够灵活的将某个函数直接定义到指定的flash地址,这样,如果改变这个函数,实际上,只需要改变函数所在的flash,而不需要更新所有的flash。所以,为了方便大家操作,我们论坛里已经推出了在CW以及IAR下,如何指定函数到具体的flash地址,本文就讲解下,在MDK的环境下如何实现指定函数到具体的flash地址。
二, 经验分享在MDK环境下实现
         该经验分享要在MDK中实现函数的绝对地址指定,一共有两点需要注意:scatter文件中函数绝对地址的开辟以及程序中将函数定义到定义的绝对地址处。
下面来仔细讲解这两点
1.在.sct文件中定义函数要存放的地址
.sct文件可以在工程的UV4Build文件夹中找到,找到后可以拖进MDK界面中即可以打开,可以使用如下格式定义这个地址:
 ER_IROM2 绝对地址 FIXED
 {
            *.o (段地址名)
              }
例如,在本次试验中,希望将函数定义到flash地址:0x0001E000这个地址,靠近flash空间的尾部。实际我们的定义如下图:
1.jpg
另外,每次编译之后,编译器都会重新生成.sct文件,所以为了避免写的代码被刷掉,需要做一些配置,禁止使用编译器每次生成的.sct文件,而是使用指定的.sct文件。修改方法:project->options for target->linker, 不勾选use memory layout from target dialog. 如下图所示:
2.jpg
这样,你每次修改后的platinum_flash.sct在编译之后就不会被改变掉了。
2.   在主函数中定义函数
接下来要做的就是将所定义的函数放到1里面所定义的flash地址段中。
举例定义如下:
char funcInROM(int flag)__attribute__((section("funflash")));
char funcInROM(int flag)
{
                if (flag > 0)
                {
                    return 1;
                }
                return 0;
}
此时,这个函数就直接放到了0x001e000地址。
3,测试结果
        本次试验的平台是FRDM_KL25,所使用的MDK平台版本为:V5.10.0.2。代码修改是基于KL25_SCplatinum工程上修改的。
测试结果分两部分进行,第一部分是在进入debug的状态下,查看memory
第二部分是在生成的hex文件中查看。
        在测试之前,首先讲一下MDK hex文件生成配置,以及hex文件格式。
1MDK环境下hex生成配置
           在工程中选择project->options for target->output,勾选Create HEX file,点击ok。如下图:
3.jpg
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
 楼主| 发表于 2014-8-19 14:50:00 | 显示全部楼层

回复:【经验分享】KL25在MDK中将函数指定到flash地址

 
2hex文件格式
文件格式为:
            起始符“:
            
            数据长度(1B
            
            存储地址(2B
            
            数据类型(1B
            
            数据(16B
            
            校验码(1B
            

 
这里举个例子:
        :1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:表示一行的开始
10表示这一行包含的数据长度,一个字节
00C0表示存储的地址,两个字节,这里是在flash的地址0x000000c0.
00表示数据类型,一个字节,00为数据记录;01文件结束记录;02扩展段地址记录;04扩展线性地址记录。
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:代表具体的数据,这里数据都是FF16个字节。数据的存储是高位地址在前,低位地址在后。
40表示校验码,一个字节。校验码是0x100-这一行数据总和的低字节,然后取低一个字节。
3debug memory查看测试
编译后,进入debug,调出memory窗口,方法为:view->memory windows->memory 1, 然后在address中输入要查询的flash地址:0x0001e000,然后按下enter键。结果如下:
4.jpg
     可以看到在0x0001e000这个地址的数据为:
29004601 2001DD01 20004770 0000E7FC
 
4)查看对应的hex文件。
编译工程之后,Hex文件在工程的build\keil\platinum\UV4Build中,打开后可以看到具体的hex内容,找到地址为E000的地方,可以看到结果如下:
5.jpg
即结果为:
01460029 01DD0120 70470020 FCE70000
和窗口memory中的数据:
29004601 2001DD01 20004770 0000E7FC
相比hex的数据正好是高位地址在前,低位地址在后。
其实这一串数据就是上面定义的char funcInROM(int flag)的十六进制码,可以看到确实是在我们指定的flash地址中,实现了IAR环境下,函数的flash地址指定。
如果屏蔽掉主函数的地址指定:
char funcInROM(int flag)__attribute__((section("funflash")));
会发现,实际上这个函数会被编译器分配到hex0x0424处,而0XE000处没有相关的函数代码。
6.jpg
 
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
 楼主| 发表于 2014-8-19 14:50:44 | 显示全部楼层

回复:【经验分享】KL25在MDK中将函数指定到flash地址

 
三, 附件
附件提供了本文的PDF,以及测试代码。

【经验分享】KL25在MDK中将函数指定到flash地址.pdf

322.07 KB, 下载次数: 64, 下载积分: 威望 1

KL25_MDK_funflash.rar

1.29 MB, 下载次数: 211, 下载积分: 威望 1

回复 支持 反对

使用道具 举报

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

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    11126
    最后登录
    2019-1-27
    发表于 2014-8-19 14:56:02 | 显示全部楼层

    RE:【经验分享】KL25在MDK中将函数指定到flash地址

    棒 ~ 支持楼主 ~ 正在使用K25 的小伙伴不妨看看哦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
     楼主| 发表于 2014-8-19 15:01:57 | 显示全部楼层

    回复:【经验分享】KL25在MDK中将函数指定到flash地址

    回复第 4 楼 于2014-08-19 14:56:02发表:
    棒 ~ 支持楼主 ~ 正在使用K25 的小伙伴不妨看看哦 

    其实不仅仅是KL25,其他的kinetis芯片也是适用的,我只是以KL25为例。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    21

    帖子

    0

    注册会员

    Rank: 2

    积分
    55
    最后登录
    1970-1-1
    发表于 2014-8-19 15:23:47 | 显示全部楼层

    RE:【经验分享】KL25在MDK中将函数指定到flash地址

    会电子的女生格外有魅力,求楼主联系方式,求交往
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-2-11 10:31
  • 签到天数: 1 天

    [LV.1]初来乍到

    10

    主题

    67

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    232
    最后登录
    1970-1-1
    发表于 2014-10-23 10:48:28 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2014-8-19 15:01
    回复第 4 楼 于2014-08-19 14:56:02发表:
    棒 ~ 支持楼主 ~ 正在使用K25 的小伙伴不妨看看哦 

    楼主,我想写两个字节到flash中,上电读取这两个字节,外部特定条件变化的话,要重新写入两个不同的字节到flash中,有没有方法啊?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-2-11 10:31
  • 签到天数: 1 天

    [LV.1]初来乍到

    10

    主题

    67

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    232
    最后登录
    1970-1-1
    发表于 2014-10-24 08:34:59 | 显示全部楼层
    楼主,我现在用KL05芯片,想指定变量到flash地址用,有没有什么方法啊?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-2-11 10:31
  • 签到天数: 1 天

    [LV.1]初来乍到

    10

    主题

    67

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    232
    最后登录
    1970-1-1
    发表于 2014-10-24 08:35:55 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2014-8-19 14:50
     
    三, 附件
    附件提供了本文的PDF,以及测试代码。

    楼主,我想写两个字节到flash中,上电读取这两个字节,外部特定条件变化的话,要重新写入两个不同的字节到flash中,有没有方法啊?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
     楼主| 发表于 2014-10-29 13:51:45 | 显示全部楼层
    wcxfairy 发表于 2014-10-23 10:48
    楼主,我想写两个字节到flash中,上电读取这两个字节,外部特定条件变化的话,要重新写入两个不同的字节 ...

    可以,那么就是正常操作flash的方法。
    你可以先把数据定义到具体的flash,如果需要修改,就需要先读取你那两个字节所在的sector,然后擦除sector,再修改需要修改的两个字节之后,再把整个sector写入到原来的地方。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-2 14:16 , Processed in 0.163396 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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