[牛人杂谈] keil编译后生成的M51文件解析

[复制链接]
1170|3
 楼主| yiyigirl2014 发表于 2018-12-7 20:40 | 显示全部楼层 |阅读模式
通过*.m51文件我们能够清楚的看到单片机存储器的使用情况,以及能够看到每一个变量包含局部变量的位置。之前碰到一个问题,相同的程序,在small模式下编译后执行没问题,但在large模式下能够编译。可是执行出错。最后查看m51文件,发现了问题。在一个对时序要求非常严格的地方声明几个局部变量。这几个局部变量有的被分配到data中。有的分配到xdata,在xdata中的变量訪问时间要大于data中。导致整个代码时间管控出现混乱,最后将分配到xdata的变量用data修饰后。,编译成功通过。




 楼主| yiyigirl2014 发表于 2018-12-7 20:40 | 显示全部楼层
以下是对m51文件的解析。參考一下:
  1. BL51 BANKED LINKER/LOCATER V6.11, INVOKED BY:
  2. C:\KEIL\C51\BIN\BL51.EXE 1910base.obj, 1910.obj TO Keil_1910 RAMSIZE (256) STACK (?
  3. STACK (0080H))

  4. MEMORY MODEL: SMALL WITH FLOATING POINT ARITHMETIC

  5. INPUT MODULES INCLUDED:
  6.   1910base.obj (PROC1910)
  7.   1910.obj (1910)
  8.   C:\KEIL\C51\LIB\C51FPS.LIB (?C?FPADD)
  9.   ………………………………  ;省略类同部分
  10.   C:\KEIL\C51\LIB\C51S.LIB (?

  11. C?

  12. LSTPDATA)

  13. LINK MAP OF MODULE:  Keil_1910 (PROC1910)

  14. ;           存储器数据分配情况
  15. ;           类型    起始地址    长度       类型           段名
  16.             TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
  17.             -----------------------------------------------------

  18.             * * * * * * *   D A T A   M E M O R Y   * * * * * * *  ; 内部数据内存区分配情况,REG代表是常规寄存器,
  19.             REG     0000H     0008H     ABSOLUTE     "REG BANK 0"  ; 寄存器类型,从0000H開始,0008H个字节,绝对定位。寄存器BANK0
  20.             REG     0008H     0008H     ABSOLUTE     "REG BANK 1"  ; 寄存器类型。从0000H開始,0008H个字节。绝对定位。寄存器BANK1
  21.             DATA    0010H     0006H     UNIT         ?

  22. DT?1910


  23. BL51 BANKED LINKER/LOCATER V6.11                                                      12/30/2009  16:15:01  PAGE 2


  24.             DATA    0016H     0005H     UNIT         ?DT?_WRITESLITPARAMETER?

  25. 1910    ;DATA代表是DATA型数据,可訪问地址范围0-128。或者在 128 .. 255 范围内的一个特殊功能寄存器(SFR)。以直接寻址方式操作
  26.             DATA    001BH     0004H     UNIT         ?DT?_READSLITPARAMETER?1910
  27.                     001FH     0001H                  *** GAP ***                     ;代表空余。未用
  28.             DATA    0020H     0001H     BIT_ADDR     ?BA?1910
  29.             BIT     0021H.0   0001H.4   UNIT         ?BI?1910                        ;BIT代表能够位操作的数据,是在内部数据存储空间中 20H .. 2FH 区域中一个位的地址,或者 8051 位可寻址 SFR 的一个位地址。
  30.             BIT     0022H.4   0000H.4   UNIT         _BIT_GROUP_
  31.             DATA    0023H     002DH     UNIT         _DATA_GROUP_
  32.             IDATA   0050H     001FH     UNIT         _IDATA_GROUP_                   ;IDATA是可訪问地址范围 0 to 255 内的数据,以间接寻址方式操作。速度略慢于DATA型数据
  33.             IDATA   006FH     0006H     UNIT         ?ID?1910
  34.                     0075H     000BH                  *** GAP ***
  35.             IDATA   0080H     0001H     UNIT         ?

  36. STACK                          ;堆栈区,8051压栈的方式是向上增长,可绝对定位

  37.             * * * * * * *  X D A T A   M E M O R Y  * * * * * * *                    ;外部数据内存分配情况,XDATA表示数据存放在外部数据存储器上
  38.             XDATA   0000H     0065H     UNIT         ?XD?1910                        ;XDATA是存放在外部数据存储器上的数据。可訪问地址范围0-65535。速度最慢
  39.             XDATA   0065H     000CH     UNIT         _XDATA_GROUP_

  40.             * * * * * * *   C O D E   M E M O R Y   * * * * * * *                    ;程序存储器分配情况,CODE代表是的程序指令
  41.             CODE    0000H     0003H     ABSOLUTE     
  42.             CODE    0003H     0005H     UNIT         ?PR?RESETWATCHDOGTIMER?1910
  43.                     0008H     0003H                  *** GAP ***
  44.             CODE    000BH     0003H     ABSOLUTE   
  45.             ………………………… ;省略类同部分
  46.             CODE    000EH     0011H     UNIT         ?PR?_XWRITEPOINTER?1910
  47.             CODE    5846H     0039H     UNIT         ?PR?

  48. _READPORT?1910
  49.             CODE    587FH     0031H     UNIT         ?PR?_X5045_WRITE?

  50. 1910
  51.             CODE    58B0H     0030H     UNIT         ?PR?X5045_READ?1910
  52.             CODE    58E0H     002CH     UNIT         ?

  53. PR?INITSYSTEM?1910
  54.             CODE    590CH     002CH     UNIT         ?PR?_XOUTBYTE?1910
  55.             CODE    5938H     0028H     UNIT         ?PR?XINBYTE?1910
  56.             CODE    5960H     0025H     UNIT         ?PR?_XREADCHAR?1910
  57.             CODE    5985H     0020H     UNIT         ?

  58. PR?

  59. READSERIALADDRESS?

  60. 1910
  61.             CODE    59A5H     0020H     UNIT         ?CO?1910
  62.             CODE    59C5H     0017H     UNIT         ?PR?

  63. SETWRITESTATE?

  64. 1910
  65.             CODE    59DCH     000CH     UNIT         ?PR?GETWIPSTATE?1910
  66.             CODE    59E8H     000CH     UNIT         ?PR?_ABS?ABS



  67. OVERLAY MAP OF MODULE:   Keil_1910 (PROC1910)

  68. ;下面是各函数中的数据分配情况
  69. ;段名                                       位操作数据起址地址      DATA数据             IDATA数据           XDATA数据
  70. SEGMENT                                       BIT_GROUP          DATA_GROUP          IDATA_GROUP         XDATA_GROUP
  71.   +--> CALLED SEGMENT                      START    LENGTH     START    LENGTH     START    LENGTH     START    LENGTH
  72. ----------------------------------------------------------------------------------------------------------------------
  73. ?C_C51STARTUP                              -----    -----      -----    -----      -----    -----      -----    -----
  74.   +--> ?PR?

  75. MAIN?1910
  76.   +--> ?C_INITSEG
  77.   
  78. ; main()函数中数据使用情况(下面是调用的函数列表)
  79. ?PR?MAIN?1910                              -----    -----      0023H    0001H      -----    -----      -----    -----
  80.   +--> ?PR?INITSYS?

  81. 1910
  82.   +--> ?PR?SENDBACKACCUMULATEERROR?1910
  83.   +--> ?PR?INSTRECEIVEOK?1910
  84.   +--> ?PR?EXECUTEINSTRUCTION?1910
  85.   +--> ?PR?RESETWATCHDOGTIMER?1910
  86. …………………………………;省略类同部分


  87. ;下面是变量、常量和寄存器等的存储位置分配

  88. SYMBOL TABLE OF MODULE:  Keil_1910 (PROC1910)

  89. ;地址            类型          名称
  90.   VALUE           TYPE          NAME
  91.   ----------------------------------
  92.   -------         MODULE        PROC1910
  93.   C:55B0H         SEGMENT       ASMFUNCTIONS              ;C:55B0H--C代表是在Code区,即存在程序存储器(ROM)上。55B0H是地址
  94.   C:55C1H         PUBLIC        DETERMINEBAUDRATE
  95.   ……………………………………;省略类同部分  
  96.   D:00A8H         SYMBOL        IE                        ;D代表DATA型数据,存在RAM上0-127之间。或者在 128 .. 255 范围内的一个特殊功能寄存器(SFR),
  97.   ……………………………………;类同部分省略
  98.   N:0000H         SYMBOL        PROC1910
  99.   ……………………………………;
  100.   B:0088H.4       SYMBOL        TR0                       ;B代表能够位寻址的数据或寄存器
  101.   B:0088H.6       SYMBOL        TR1
  102.   ……………………………………;
  103.   C:0000H         SYMBOL        _ICE_DUMMY_   
  104.   X:0000H         PUBLIC        LampMotorCurrentPhase     ;X代表存放在外部存储器XRAM区的数据
  105.   C:4E55H         PUBLIC        SendBack
  106.   …………………………………;
  107.   C:0026H         PUBLIC        ExecuteInstruction        ;C代表村放在CODE驱动的数据或指令
  108.   D:00B0H         PUBLIC        P3
  109.   C:4ADEH         PUBLIC        _ReadAD
  110.   C:568AH         PUBLIC        InstReceiveOK
  111.   ……………………………………;
  112.   I:0071H         PUBLIC        ScanEndWaveLength         ;I 代表能够IDATA型数据
  113.   …………………………………
  114.   C:41E9H         PUBLIC        _CheckLampEnergy
  115.   X:0049H         PUBLIC        FilterMotorCurrentPhase
  116.   ……………………………………;省略
 楼主| yiyigirl2014 发表于 2018-12-7 20:40 | 显示全部楼层
;下面是编译结果
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_WRITESLITPARAMETER?

1910

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?

ASSIGNSLITPARAMETER?

1910

Program Size: data=117.0 xdata=113 code=23021
LINK/LOCATE RUN COMPLETE.  2 WARNING(S),  0 ERROR(S)
xuanhuanzi 发表于 2018-12-7 22:11 | 显示全部楼层
听说过A51,怎么还有个M51文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

3676

帖子

10

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