查看完整版本: RealView MDK中如何指定子程序入口地址

admin 发表于 2014-10-12 15:25:18

RealView MDK中如何指定子程序入口地址

强大的MDK几乎可以满足我们所需要的所有功能。一般在链接时各程序的地址是由链接器自动分配的。但在有些时候,比如做测试时,需要将某个指定的子程序入口地址固定在一个指定的地址。其实通过一些简单的配置就可达到这一目的。下面以C51版MDK为例说明其配置过程。
比如某例程中有UART_VINIT、IO_VINIT、MAIN_VINIT、MAIN、TIMER2等函数。其中TIMER2是我们需要固定其入口地址的函数。编译链接之后在工程目录下会生成M51文件(后缀为M51)。可以用记事本将其打开。打开后我们找到LINK MAP OF MODULE 项,在默认编译链接情况下其内容为:
LINK MAP OF MODULE:T2test2 (TIMER)


            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG   0000H   0008H   ABSOLUTE   "REG BANK 0"
            DATA    0008H   0001H   UNIT         ?DT?MAIN?TIMER
            DATA    0009H   0001H   UNIT         ?DT?GETCHAR
                  000AH   0016H                  *** GAP ***
            BIT   0020H.0   0000H.1   UNIT         ?BI?GETCHAR
                  0020H.1   0000H.7                *** GAP ***
            IDATA   0021H   0001H   UNIT         ?STACK

            * * * * * * *   C O D E   M E M O R Y   * * * * * * *
            CODE    0000H   0003H   ABSOLUTE   
                  0003H   0028H                  *** GAP ***
            CODE    002BH   0003H   ABSOLUTE   
                  002EH   07D2H                  *** GAP ***
            CODE    0800H   0062H   UNIT         ?PR?MAIN?TIMER
            CODE    0862H   0027H   UNIT         ?PR?PUTCHAR?PUTCHAR
            CODE    0889H   0026H   UNIT         ?C?LIB_CODE
            CODE    08AFH   001FH   UNIT         ?PR?UART_VINIT?STARTUP
            CODE    08CEH   001EH   UNIT         ?PR?MAIN_VINIT?STARTUP
            CODE    08ECH   0011H   UNIT         ?PR?GETCHAR?GETCHAR
            CODE    08FDH   000CH   UNIT         ?C_C51STARTUP
            CODE    0909H   000BH   UNIT         ?PR?TIMER2?TIMER
            CODE    0914H   000AH   UNIT         ?PR?_GETKEY?_GETKEY
            CODE    091EH   0004H   UNIT         ?PR?IO_VINIT?STARTUP
以上就是链接后各函数的入口地址信息。找到我们需要指定入口地址的项。这里假设我们需要指定TIMER2这个子函数。找到其对应项“?PR?TIMER2?TIMER”,其中间部分即为函数名,后部分为所在文件名。我们发现其入口地址为0909H,长度为000BH。找到这一项之后,复制其值。然后打开菜单Project,选择Options,再选择BL51 Locate项。在Code栏后面的输入框里粘下所复制的值,然后在后面加上小括号,括号内给出其入口地址的值。如 ?PR?TIMER2?TIMER(0x1000)。如图一所示:



图一
点击确定后,重新编译链接,再打开M51文件,发现LINK MAP OF MODULE项内容变为:
LINK MAP OF MODULE:T2test2 (TIMER)


            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG   0000H   0008H   ABSOLUTE   "REG BANK 0"
            DATA    0008H   0001H   UNIT         ?DT?MAIN?TIMER
            DATA    0009H   0001H   UNIT         ?DT?GETCHAR
                  000AH   0016H                  *** GAP ***
            BIT   0020H.0   0000H.1   UNIT         ?BI?GETCHAR
                  0020H.1   0000H.7                *** GAP ***
            IDATA   0021H   0001H   UNIT         ?STACK

            * * * * * * *   C O D E   M E M O R Y   * * * * * * *
            CODE    0000H   0003H   ABSOLUTE   
                  0003H   0028H                  *** GAP ***
            CODE    002BH   0003H   ABSOLUTE   
                  002EH   07D2H                  *** GAP ***
            CODE    0800H   0062H   UNIT         ?PR?MAIN?TIMER
            CODE    0862H   0027H   UNIT         ?PR?PUTCHAR?PUTCHAR
            CODE    0889H   0026H   UNIT         ?C?LIB_CODE
            CODE    08AFH   001FH   UNIT         ?PR?UART_VINIT?STARTUP
            CODE    08CEH   001EH   UNIT         ?PR?MAIN_VINIT?STARTUP
            CODE    08ECH   0011H   UNIT         ?PR?GETCHAR?GETCHAR
            CODE    08FDH   000CH   UNIT         ?C_C51STARTUP
            CODE    0909H   000AH   UNIT         ?PR?_GETKEY?_GETKEY
            CODE    0913H   0004H   UNIT         ?PR?IO_VINIT?STARTUP
                  0917H   06E9H                  *** GAP ***
            CODE    1000H   000BH   UNIT         ?PR?TIMER2?TIMER
在链接信息中发现TIMER2函数已经定位到地址1000H。当然在下载到目标板或者在模拟器中调试时,可以发现在地址1000H处是函数TIMER2的入口地址。至此,子函数定位完成。

页: [1]
查看完整版本: RealView MDK中如何指定子程序入口地址