打印
[ZLG-ARM]

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

[复制链接]
10739|9
手机看帖
扫描二维码
随时随地手机跟帖
沙发
simplelive| | 2007-6-19 20:32 | 只看该作者

网上好像有解决办法

如果是ADS,可以用分散加载文件,KEIL我就不知道了,但调用可以用函数指针,就像NXP的IAP命令一样。

使用特权

评论回复
板凳
wlsq910|  楼主 | 2007-6-20 09:24 | 只看该作者

我看见KEIL的LINKER里面有一个分散加载的文件 不知道能不能通过这里来修改实现

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00040000  {  ; load region
  ER_IROM1 0x00000000  {       ; load address = execution address
   *.o (RESET, +First)
   * (+RO)
  }
  RW_IRAM1 0x40000000 0x00004000  {  ; RW data
   * (+RW +ZI)
  }
}

使用特权

评论回复
地板
wlsq910|  楼主 | 2007-6-20 16:38 | 只看该作者

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

使用特权

评论回复
5
lenglx| | 2007-6-21 12:53 | 只看该作者

分散加载固然可以

但如果你使用MDK3.03以后的版本,你可以使用__at()宏

void __at(0x1f00) foo()
{
//....
}

记得 #include <absacc.h> 哦

使用特权

评论回复
6
wlsq910|  楼主 | 2007-6-21 15:24 | 只看该作者

谢谢!还是不行呢

void _at(0x1000) IAP_test(void)  我这样定义的 也包含了#include <absacc.h>  但是编译不过 
main.c(185): error:  #79: expected a type specifier
main.c(185): error:  #141-D: unnamed prototyped parameters not allowed when body is present

我用的MDK3.05

使用特权

评论回复
7
lenglx| | 2007-6-21 15:56 | 只看该作者

你可仔细检查过了

是__at(2个下划线),而不是一个

使用特权

评论回复
8
wlsq910|  楼主 | 2007-6-21 15:59 | 只看该作者

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

使用特权

评论回复
9
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

使用特权

评论回复
10
zhychmine| | 2013-12-24 17:12 | 只看该作者
上面的帖子忘记说了,__at()错误的原因是编译器给出警告,__at()只能对变量起作用,如果使用,会产生一个警告并且不产生任何作用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

28

帖子

0

粉丝