[ZLG-ARM] 请教 KEIL ARM下如何把一个函数定位到指定地址及如何调用

[复制链接]
 楼主| wlsq910 发表于 2007-6-19 15:46 | 显示全部楼层 |阅读模式
simplelive 发表于 2007-6-19 20:32 | 显示全部楼层

网上好像有解决办法

如果是ADS,可以用分散加载文件,KEIL我就不知道了,但调用可以用函数指针,就像NXP的IAP命令一样。
 楼主| wlsq910 发表于 2007-6-20 09:24 | 显示全部楼层

我看见KEIL的LINKER里面有一个分散加载的文件&nbsp;不知道能不能通过这里来修改实现<br /><br />;&nbsp;*************************************************************<br />;&nbsp;***&nbsp;Scatter-Loading&nbsp;Description&nbsp;File&nbsp;generated&nbsp;by&nbsp;uVision&nbsp;***<br />;&nbsp;*************************************************************<br /><br />LR_IROM1&nbsp;0x00000000&nbsp;0x00040000&nbsp;&nbsp;{&nbsp;&nbsp;;&nbsp;load&nbsp;region<br />&nbsp;&nbsp;ER_IROM1&nbsp;0x00000000&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;load&nbsp;address&nbsp;=&nbsp;execution&nbsp;address<br />&nbsp;&nbsp;&nbsp;*.o&nbsp;(RESET,&nbsp;+First)<br />&nbsp;&nbsp;&nbsp;*&nbsp;(+RO)<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;RW_IRAM1&nbsp;0x40000000&nbsp;0x00004000&nbsp;&nbsp;{&nbsp;&nbsp;;&nbsp;RW&nbsp;data<br />&nbsp;&nbsp;&nbsp;*&nbsp;(+RW&nbsp;+ZI)<br />&nbsp;&nbsp;}<br />}
 楼主| wlsq910 发表于 2007-6-20 16:38 | 显示全部楼层

下班啦 顶一下 还是没人知道吗?

  
lenglx 发表于 2007-6-21 12:53 | 显示全部楼层

分散加载固然可以

但如果你使用MDK3.03以后的版本,你可以使用__at()宏<br /><br />void&nbsp;__at(0x1f00)&nbsp;foo()<br />{<br />//....<br />}<br /><br />记得&nbsp;#include&nbsp;&ltabsacc.h&gt&nbsp;哦
 楼主| wlsq910 发表于 2007-6-21 15:24 | 显示全部楼层

谢谢!还是不行呢

void&nbsp;_at(0x1000)&nbsp;IAP_test(void)&nbsp;&nbsp;我这样定义的&nbsp;也包含了#include&nbsp;&ltabsacc.h&gt&nbsp;&nbsp;但是编译不过&nbsp;<br />main.c(185):&nbsp;error:&nbsp;&nbsp;#79:&nbsp;expected&nbsp;a&nbsp;type&nbsp;specifier<br />main.c(185):&nbsp;error:&nbsp;&nbsp;#141-D:&nbsp;unnamed&nbsp;prototyped&nbsp;parameters&nbsp;not&nbsp;allowed&nbsp;when&nbsp;body&nbsp;is&nbsp;present<br /><br />我用的MDK3.05
lenglx 发表于 2007-6-21 15:56 | 显示全部楼层

你可仔细检查过了

是__at(2个下划线),而不是一个
 楼主| wlsq910 发表于 2007-6-21 15:59 | 显示全部楼层

呵呵 谢谢!真的少了一个下划线 太感谢了!

  
zhychmine 发表于 2013-12-24 17:07 | 显示全部楼层
好几年前的帖子啊,现在遇到这个问题了,试了试这个方法不行,不知道是不是因为我使用的是KEIL MDK 4.72的原因和当时的版本不一致。如果4.72还使用这种方法是不可行的。现在借这个帖子为现在还不知道的,并且遇到这个问题的同学提供些帮助,大家共同学习哈,方法如下:
1.C程序里的设置
/*   函数在  app.c   里面*/
void my_function(void) __attribute__((section("sectionone")));  //这里将函数声明在一个用户指定的段里

void my_function(void)
{
//函数体
}
2.分散加载文件.sct文件的设置
这里是关键,分散加载的机制我也只是初见门道,只提供一个方法,大家可以试试:
;     以下为   工程名.sct  里的函数体      
;     这里我们需要把分散加载地址更换,否则出现了函数的入口地址出现在想要的0x00020000但是函数体不在的情况,这里我也没有特别清楚,反正现在暂
;     时使用软件仿真会出现我要调用这个函数的语句指向了0x00020000但是在这个地方没有函数的情况,大家实验有不同的欢迎指正~。
;     还有,如果这样编译以后,会出现bin文件生成错误的情况,我分析可能是因为hex镜像文件可以指定地址,而bin文件不可以,而我们生成的镜像文件
;     不是连续的,有个函数出现在了较高地址0x00020000上,所以编译器生成了一个错误
LR_IROM1 0x00000000 0x00100000  
{    ; load region size_region
  ER_IROM1 0x00000000 0x00100000  
  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  
  RW_IRAM1 0x20000000 0x00040000  {  ; RW data
   .ANY (+RW +ZI)
  }
}
LR_IROM2 0x00020000 0x00020000
{
  ER_IROM2 0x00020000 0x00020000
  {
    app.o (sectionone)
  }  
}


以上是一个暂时的解决方法,在keil mdk 4.72上可以使用,如果大家还有什么问题或者觉得我这个方法有问题的欢迎email我:zhychmine@163.com
zhychmine 发表于 2013-12-24 17:12 | 显示全部楼层
上面的帖子忘记说了,__at()错误的原因是编译器给出警告,__at()只能对变量起作用,如果使用,会产生一个警告并且不产生任何作用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

5

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部