查看: 5126|回复: 4

[已解决] IAR调试KE02,如何将函数放到flash中的指定地址?(已解决)

[复制链接]

该用户从未签到

196

主题

495

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1482
最后登录
2020-12-3
发表于 2014-3-12 10:44:08 | 显示全部楼层 |阅读模式
IAR调试KE02,如何将函数放到flash中的指定地址?
 
我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2014-3-12 13:03:20 | 显示全部楼层

RE:IAR调试KE02,如何将函数放到flash中的指定地址?(已解决)

恭喜楼主问题解决啊!!
回复 支持 反对

使用道具 举报

该用户从未签到

196

主题

495

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1482
最后登录
2020-12-3
 楼主| 发表于 2014-3-13 10:54:58 | 显示全部楼层

回复:IAR调试KE02,如何将函数放到flash中的指定地址?(已解决)

 借用一篇别人的博文,虽然不是专门为kinetis写的,但是经过实践证明,kinetis同样适用。下面贴出来,供大家使用。
 
昨天我突然冒出个想法,能否利用函数和变量的绝对定位,实现程序的模块化更新。

  也就是说,如果我要改变某个函数,只需要更新flash里面一个局部,也许只需要更新几百个字节,而无须重新下载整个上百K的程序。

  经过查找资料和反复实验,终于实现了,现总结如下:

  1 把函数定位在FLASH高端的指定位置,以后更新,只更新那小块地方就可以了。

  方法一:

    IAR里面进行函数定位, 必须要在.icf里面,进行定义。

   void sendstr(unsigned *buf,unsigned short  len) @".sendstr"
   {
    ....
   }

   .icf文件,加入这样一句:
  place at address mem:0x08017000 { readonly section .sendstr};

  方法二)  把要更新的函数,单独放在一个.c文件中,然后再.icf文件里面,对该文件进行定位:
  test.c

  int f1(int a,int b){
  if(a>0){
   return (a+b)*1;
  }
  else return 0;
}
  int f2(int a,int b){
  if(a>0){
   return (a+b)*1;
  }
  else return 0;
}

那么在 .icf文件中,这样写:
place at address mem:0x08018000 { section .text object test.o };
编译完成后, f1就定位在0x08018000 处了,当然f2也紧跟在f1后面。整个test.c文件的所有函数,都在0x08018000 之后。

如果有多个函数需要单独更新,建议采用第二种方式, 只需要对c文件编译后的地址定位,那么该c文件的所有函数都定位了。

绝对定位的函数,只要指定了地址,那么在flash里面的位置就是固定的。


即使是两个不同的工程,比如第一个工程为实际工程,里面有所有的工程文件,  第二个工程为更新专用工程,里面仅仅只有test.c文件,里面的函数是同名的,定位地址与第一个工程也一样。

那么这样编译后,第二个工程里面的固件片断,是可以用来更新一个工程的固件的。

这样还可以派生出一个很怪的用法:
我可以把更新专用工程,公布给别人,他只需要在test.c里面,编写函数的具体内容。 然后一样可以更新产品的固件。
真正的实际工程,是不需要公布的。

以上是对函数的绝对定位处理。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2)变量定位

变量绝对定位:
__no_init char array1[100]@0x2000B000;

变量绝对定位,无须修改.icf,直接指定

这个array1就定位在RAM中的0x2000B000

常量绝对定位:
const char str1[8]@".MYSEG"="test11!!";
常量绝对定位,需要改.icf文件:
place at address mem:0x08018500 { readonly section .MYSEG};
 
 
 
 
 
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-3-13 14:13:40 | 显示全部楼层

RE:IAR调试KE02,如何将函数放到flash中的指定地址?(已解决)

感谢楼上的经验分享。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

351

帖子

0

高级会员

Rank: 4

积分
973
最后登录
1970-1-1
发表于 2014-3-14 10:16:07 | 显示全部楼层

回复:IAR调试KE02,如何将函数放到flash中的指定地址?(已解决)

感谢楼主分享的经验
又学到一招。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-19 05:02 , Processed in 0.092821 second(s), 25 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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