通过*.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)

keil编译后生成的M51文件解析的更多相关文章

  1. OpenWrt编译后生成的bin文件:jffs2与squashfs、factory与sysupgrade

    OpenWrt编译后会生成多个bin文件,比如 openwrt-ar71xx-generic-tl-wr841nd-jffs2-factory.bin 8126464 openwrt-ar71xx-g ...

  2. winform代码反编译后图片等资源文件恢复解决方案

    用Reflector工具反编译的winform代码,图片等资源文件不能很好的反编译成功. 这里有一个笨的解决方案.首先我们要了解图片资源当初加入到工程的几种方式,及他们所在的位置. 一般winform ...

  3. Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案

    原文:Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案 如果你是用Visual Studio自带的打包项目打包了一个I ...

  4. vc++ 6.0编译后生成的文件

    程序在编译后,在目标路径下会生成多个文件    Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg  ...

  5. c#:Reflector+Reflexil 修改编译后的dll/exe文件

    不知道大家有没有这样的经历:现场实施时测试出一个bug,明明知道某个dll/exe文件只要修改一二行代码即可,但手头没有开发环境,紧急情况下,可以用reflector + reflexil 临时直接修 ...

  6. Keil编译后的各文件介绍

    编译生成的文件: .plg:编译器编译结果 .hex和.bin:可执行文件 .map和.lst:链接文件 .obj:目标文件 .crf..lnp..d和.axf:调试文件 .opt:保存工程配置信息 ...

  7. ICP编程软件配置(烧写KEIL编译后的bin文件)

    1. 安装NuMicro_ICP_Programming_Tool_1.29.6425软件 2. 打开软件后选择目标芯片后点击“连接”按钮 3. 添加程序 4. 点击设定按钮进行设定 5. 点击开始 ...

  8. 关于有些.aidl源码的eclipse编译后生成.java文件的错

    最近下载了一个aidl源码.导入到eclipse.一直报错.无法运行到. (我是1号图) 2. .然后怎么想都不知道怎么解决.百度和谷歌了n遍. 还是找不到.后来在一个不起眼的地方看到说: aidl不 ...

  9. 编译Speex生成so库文件(android-speex)

    项目中需要用音频格式转换,之前使用VoAacEncoder,部分手机总是莫名崩溃,所以决定不再使用VoAacEncoder,换做Speex来完成格式转换,但是没有找到Speex的库文件,网上介绍的都是 ...

随机推荐

  1. CF540C Ice Cave

    思路: 搜索. 加回溯会超时,不加回溯就过了,不是很理解. 实现: #include <iostream> #include <cstdio> using namespace ...

  2. 93. [NOIP2001] 数的划分

    问题描述 将整数n分成k份,且每份不能为空,任意两种方案不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. ...

  3. 树莓派zero_w设置中文(已成功)

    树莓派默认是采用英文字库的,而且系统里没有预装中文字库,所以即使你在locale中改成中文,也不会显示中文,只会显示一堆方块.因此需要我们手动来安装中文字体. 好在有一个中文字体是免费开源使用的.ss ...

  4. android调用webservice接口获取信息

    我的有一篇博客上讲了如何基于CXF搭建webservice,service层的接口会被部署到tomcat上,这一篇我就讲一下如何在安卓中调用这些接口传递参数. 1.在lib中放入ksoap2的jar包 ...

  5. jboss项目设置域名

    1.在jboss-web.xml中添加<virtual-host>www.ceshi.com</virtual-host> <jboss-web> <cont ...

  6. solr深分页,游标操作分页,解决性能问题

    solr深分页,游标操作分页,解决性能问题 @Test public void pageByCursor() { try { solrServer.connect(); String query = ...

  7. form表单清空、重置

    form_live为formID <input type="button" value="重置" onclick="$('#form_live' ...

  8. public private protected

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...

  9. acedssget F 方式

    ads_point p1; ads_point p2; acedGetPoint(NULL, _T("\n插入第一点"), p1); acedGetPoint(p1, _T(&qu ...

  10. 梦想CAD控件网页版关于自定义命令

    在CAD控件操作中,为方便使用者,使用自定义命令发出命令,完成CAD绘图,修改,保存等操作.点击此处在线演示. _DMxDrawX::RegistUserCustomCommand 向CAD控件注册一 ...