打印

keil中关于函数定位的问题

[复制链接]
3964|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
andrew.xu|  楼主 | 2009-2-17 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的问题是keil(RMDK3.24)环境下如何指定某个函数存放地址
下面是网上收集的方法:
1,使用分散加载文件
但是这个好像是针对文件的,单个函数不知道行不行,就是行也比较麻烦
2,在工程的Option For Target-BL51 Locate页的CODE编辑框内填入"?PR?函数名?文件名(地址)",多个定位用","隔开。 
例如:
    ?PR?_SetLedFlash?MAIN(0x1000)    把函数void SetLedFlash(U8 m_data);定位在0x1000处
    ?PR?ClrLedFlash?MAIN(0x1100)    把函数void ClrLedFlash(void);定位在0x1100处
    带参数的函数名称前加"_" 
很明显,太麻烦
3,MDK3.03以后的版本,可以使用__at()宏
例如:
C语言:
    #include <absacc.h>

    const char MyText[] __at(0x1F00) = "TEXT AT ADDRESS 0x1F00";
    int x __at(0x40003000);     // variable at address 0x40003000

    void __at(0x40000000) Func(void)
    {
    }
汇编:
    AREA |.ARM.__AT_0xFFE0|, CODE, READONLY

这个方法好,简单,好像问题解决了,但是经过实验,变量和常量的定位都正确.
函数就不对了,
 我使用的是RMDK3.24+ULINK2+STM32103Z,编译后提示如下告警:
..xxx.c(820): warning:  #1202-D: invalid attribute for function "函数名称"
不管,进入仿真,结果地址没变化,没效果.后来查看了帮助,里面也没有提到针对函数的用法,是不是这个__at()指令本身就是不能对函数使用的,或者对于函数有自己的特殊指令?

请教哪位仁兄,如何解决这个问题,就是keil下如何简单的定位函数地址?
谢谢!

相关帖子

沙发
computer00| | 2009-2-17 14:39 | 只看该作者

俺只会第二种...而且这么久也从来没用过函数定位功能....

使用特权

评论回复
板凳
赤铸| | 2009-2-17 20:47 | 只看该作者

定位不就是为了规定调用入口之类吗?

我用的Keil 7.0版本,用 _at_ 关键字定位变量,你那个 MDK 版本居然可以用 __at 定义函数(至少语法没错)

有个办法:在汇编里定位个函数,用它调用(跳转到) C 语言函数

使用特权

评论回复
地板
andrew.xu|  楼主 | 2009-2-18 15:27 | 只看该作者

谢谢

用的是不多,正好碰到了,想研究下简便的方法,像IAR有个"@"就很好用

我也觉得__at语法是没错的,不知道为啥不行

有个办法:在汇编里定位个函数,用它调用(跳转到) C 语言函数
这个办法的问题是我的c语言函数还是由编译器自动指定的,没有到我希望的地方去

使用特权

评论回复
5
赤铸| | 2009-2-19 10:40 | 只看该作者

入口地址确定不就行了?

直接调用汇编函数,中间跳转到别的地方很要紧吗?中断调用不都是这么跳转的?

汇编函数也可以写个C语言的原型,用起来都不需要知道它是什么语言写的

使用特权

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

本版积分规则

9

主题

149

帖子

0

粉丝