keil编译后生成的M51文件解析

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


以下是对m51文件的解析。參考一下:
BL51 BANKED LINKER/LOCATER V6.11, INVOKED BY:
C:\KEIL\C51\BIN\BL51.EXE 1910base.obj, 1910.obj TO Keil_1910 RAMSIZE (256) STACK (?

STACK (0080H)) MEMORY

MODEL: SMALL WITH FLOATING POINT ARITHMETIC INPUT MODULES INCLUDED: 1910base.obj (PROC1910) 1910.obj ( 1910 ) C: \KEIL\C51\LIB\C51FPS.LIB (?C?FPADD) ……………………………… ; 省略类同部分 C: \KEIL\C51\LIB\C51S.LIB (?

C?

LSTPDATA) LINK MAP OF

MODULE: Keil_1910 (PROC1910) ; 存储器数据分配情况 ; 类型 起始地址 长度 类型 段名 TYPE BASE LENGTH RELOCATION SEGMENT NAME ----------------------------------------------------- * * * * * * * D A T A M E M O R Y * * * * * * * ; 内部数据内存区分配情况,REG代表是常规寄存器, REG 0000H 0008H ABSOLUTE " REG BANK 0 " ; 寄存器类型,从0000H開始,0008H个字节,绝对定位。寄存器BANK0 REG 0008H 0008H ABSOLUTE " REG BANK 1 " ; 寄存器类型。从0000H開始,0008H个字节。绝对定位。寄存器BANK1 DATA 0010H 0006H UNIT ?

DT?1910 BL51 BANKED LINKER/LOCATER V6.

11 12/ 30/ 2009 16: 15: 01 PAGE 2 DATA 0016H 0005H UNIT ?DT?_WRITESLITPARAMETER?

1910

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

STACK

; 堆栈区,8051压栈的方式是向上增长,可绝对定位 * * * * * * * X D A T A M E M O R Y * * * * * * * ; 外部数据内存分配情况,XDATA表示数据存放在外部数据存储器上 XDATA 0000H 0065H UNIT ?XD?1910 ; XDATA是存放在外部数据存储器上的数据。可訪问地址范围0-65535。速度最慢 XDATA 0065H 000CH UNIT _XDATA_GROUP_ * * * * * * * C O D E M E M O R Y * * * * * * * ; 程序存储器分配情况,CODE代表是的程序指令 CODE 0000H 0003H ABSOLUTE CODE 0003H 0005H UNIT ?PR?RESETWATCHDOGTIMER?1910 0008H 0003H *** GAP *** CODE 000BH 0003H ABSOLUTE ………………………… ; 省略类同部分 CODE 000EH 0011H UNIT ?PR?_XWRITEPOINTER?1910 CODE 5846H 0039H UNIT ?PR?

_READPORT?1910 CODE 587FH 0031H UNIT ?PR?_X5045_WRITE?

1910 CODE 58B0H 0030H UNIT ?PR?X5045_READ?1910 CODE 58E0H 002CH UNIT ?

PR?INITSYSTEM?1910 CODE 590CH 002CH UNIT ?PR?_XOUTBYTE?1910 CODE 5938H 0028H UNIT ?PR?XINBYTE?1910 CODE 5960H 0025H UNIT ?PR?_XREADCHAR?1910 CODE 5985H 0020H UNIT ?

PR?

READSERIALADDRESS?

1910 CODE 59A5H 0020H UNIT ?CO?1910 CODE 59C5H 0017H UNIT ?PR?

SETWRITESTATE?

1910 CODE 59DCH 000CH UNIT ?PR?GETWIPSTATE?1910 CODE 59E8H 000CH UNIT ?PR?_ABS?ABS OVERLAY MAP OF

MODULE: Keil_1910 (PROC1910) ; 下面是各函数中的数据分配情况 ; 段名 位操作数据起址地址 DATA数据 IDATA数据 XDATA数据 SEGMENT BIT_GROUP DATA_GROUP IDATA_GROUP XDATA_GROUP +--> CALLED SEGMENT START LENGTH START LENGTH START LENGTH START LENGTH ---------------------------------------------------------------------------------------------------------------------- ?C_C51STARTUP ----- ----- ----- ----- ----- ----- ----- ----- +--> ?PR?

MAIN?1910 +--> ?C_INITSEG

; main()函数中数据使用情况(下面是调用的函数列表) ?PR?MAIN?1910 ----- ----- 0023H 0001H ----- ----- ----- ----- +--> ?PR?INITSYS?

1910 +--> ?PR?SENDBACKACCUMULATEERROR?1910 +--> ?PR?INSTRECEIVEOK?1910 +--> ?PR?EXECUTEINSTRUCTION?1910 +--> ?PR?RESETWATCHDOGTIMER?1910 …………………………………

; 省略类同部分 ; 下面是变量、常量和寄存器等的存储位置分配 SYMBOL TABLE OF MODULE: Keil_1910 (PROC1910) ; 地址 类型 名称 VALUE TYPE NAME ---------------------------------- ------- MODULE PROC1910 C:55B0H SEGMENT ASMFUNCTIONS ; C:55B0H--C代表是在Code区,即存在程序存储器(ROM)上。55B0H是地址 C: 55C1H PUBLIC DETERMINEBAUDRATE …………………………………… ; 省略类同部分 D:00A8H SYMBOL IE ; D代表DATA型数据,存在RAM上0-127之间。或者在 128 .. 255 范围内的一个特殊功能寄存器(SFR), …………………………………… ; 类同部分省略 N: 0000H SYMBOL PROC1910 …………………………………… ; B:0088H. 4 SYMBOL TR0 ; B代表能够位寻址的数据或寄存器 B:0088H. 6 SYMBOL TR1 …………………………………… ; C: 0000H SYMBOL _ICE_DUMMY_ X:0000H PUBLIC LampMotorCurrentPhase ; X代表存放在外部存储器XRAM区的数据 C: 4E55H PUBLIC SendBack ………………………………… ; C:0026H PUBLIC ExecuteInstruction ; C代表村放在CODE驱动的数据或指令 D: 00B0H PUBLIC P3 C: 4ADEH PUBLIC _ReadAD C: 568AH PUBLIC InstReceiveOK …………………………………… ; I:0071H PUBLIC ScanEndWaveLength ; I 代表能够IDATA型数据 ………………………………… C: 41E9H PUBLIC _CheckLampEnergy X: 0049H PUBLIC FilterMotorCurrentPhase …………………………………… ; 省略 ; 下面是编译结果 *** 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)

转载于:https://www.cnblogs.com/zhchoutai/p/6898244.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值