beiquan 发表于 2010-1-25 12:34:28

keil中的程序代码定位功能

关于C语言,我们一般都知道对于RAM定位可以用关键字 _at_,但对于程序代码定位往往感到很迷惑.

其实keil中的程序代码定位功能极为强大

Menu: Options for Target 'Target' -> BL Locate

Use Memory Layout from Target Dialog
      Code Range: 0X01D3-0XFFFF
      Xdata Range: 0X0000--0XFFFF
Code:
?C_C51STARTUP(0X1D3),?C_INITSEG,?PR?UART0_ISR?BOOTLOAD,?PR?MAIN?BOOTLOAD,?PR?BOOT_LOAD?BOOTLOAD,?PR?MAIN_START?IDENTIFIER(0X400)

以上就是程序定位的一个实例,可以按照该模式,对没个函数进行精确定位,可能有人对“,?PR?UART0_ISR?BOOTLOAD”之类的写法比较迷惑,其实只要我们仔细研读MAP文件就能发现其中的奥妙,下面就是定位后的 MAP 文件,有兴趣的朋友可以琢磨一下:

* * * * * * *   C O D E   M E M O R Y   * * * * * * *
                           *** GAP ***
CODE    01D3H    008CH UNIT         ?C_C51STARTUP
CODE    025FH   0018H UNIT         ?C_INITSEG
CODE    0277H    0011H UNIT         ?PR?UART0_ISR?BOOTLOAD
CODE    0288H   00C5H UNIT         ?PR?MAIN?BOOTLOAD
CODE    034DH    00B3H UNIT         ?PR?BOOT_LOAD?BOOTLOAD
CODE    0400H   0782H UNIT         ?PR?MAIN_START?IDENTIFIER
            
Principle: ?PR?MAIN_START?IDENTIFIER(0X400)
BaseRle: 0X400(DWNLD_SECTOR)


第二种方法

在工程的Option   For   Target   -   BL51   Locate页的CODE编辑框内填入“?PR?
函数名?文件名(地址)”,多个定位用“,”隔开。
例如:?PR?_SetLedFlash?MAIN(0x1000),?PR?ClrLedFlash?MAIN(0x1100)
把函数void   SetLedFlash(U8   m_data);和void   ClrLedFlash(void);分别定位在
0x1000和0x1100处。
定位的时候要注意留够足够空间。另外,一般只有系统需要做在线更新,或者是汇编与C混
合,或者同一个单片机里有多个工程,通常是不需要做函数定位的,这样做会降低编译器
的效率

xiaojian 发表于 2010-1-25 14:02:01

我也传一段,网上找来的:
1、函数定位:
假如要把C源文件 tools.c 中的函数
int BIN2HEX(int xx)
{
...
}
放在CODE MEMORY的0x1000处,先编译该工程,然后打开该工程的M51文件,在
* * *   C O D E   M E M O R Y   * * *
行下找出要定位的函数的名称,应该形如:
CODE    xxxxH   xxxxH   UNIT         ?PR?_BCD2HEX?TOOLS
然后在:
Project->Options for Target ...->BL51 Locate:Code
中填写如下内容:
?PR?_BCD2HEX?TOOLS(0x1000)
再次Build,在M51中会发现该函数已放在CODE MEMORY的0x1000处了

2、赋初值的变量定位:
要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,则如下操作:
在工程中建立一个新的文件,如InitVars.c,在其中对要处理的变量赋初值(假设是code变
量):
char code myVer = {"COPYRIGHT 2001-11"};
然后将该文件加入工程,编译,打开M51文件,若定义的是code型,则在
* * *   C O D E   M E M O R Y   * * *
下可找到:
CODE    xxxxH   xxxxH   UNIT         ?CO?INITVARS
然后在:
Project->Options for Target ...->BL51 Locate:Code
中填入:
?CO?INITVARS(0x200)
再次编译即可。

相应地,如为xdata变量,则InitVars.c中写:
char xdata myVer = {"COPYRIGHT 2001-11"};
然后将该文件加入工程,编译,打开M51文件,在
* * *X D A T A   M E M O R Y* * *
下可找到:
XDATA   xxxxH   xxxxH   UNIT         ?XD?INITVARS
然后在:
Project->Options for Target ...->BL51 Locate:Xdata
中填入:
?XD?INITVARS(0x200)
再次编译即可。相应地,若定义的是data/idata等变量,则相应处理即可。

3、若有多个变量或函数要进行绝对地址定位,则应按地址从低到高的顺序排列

eduhf_123 发表于 2010-1-25 16:13:25

MARK Keil技巧
MARK 代码定位

idly 发表于 2010-1-27 11:42:25

mark

464839941xql 发表于 2012-5-30 23:08:42

这是写得最仔细的帖子,网上搜的其他的都看不懂,或看了也不知怎么弄。顶啊!

danju 发表于 2012-5-30 23:31:38

xdata我一直用_at_的,原来也可以在option里面呢,谢谢分享

hamipeter 发表于 2012-5-31 00:10:55

_at_在keil中定位很方便!

fydzaa 发表于 2012-5-31 12:37:20

MARK Keil技巧

ifus 发表于 2012-5-31 12:55:24

没搞过这样的,只知道下载程序
页: [1]
查看完整版本: keil中的程序代码定位功能