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)
keil编译后生成的M51文件解析的更多相关文章
- OpenWrt编译后生成的bin文件:jffs2与squashfs、factory与sysupgrade
OpenWrt编译后会生成多个bin文件,比如 openwrt-ar71xx-generic-tl-wr841nd-jffs2-factory.bin 8126464 openwrt-ar71xx-g ...
- winform代码反编译后图片等资源文件恢复解决方案
用Reflector工具反编译的winform代码,图片等资源文件不能很好的反编译成功. 这里有一个笨的解决方案.首先我们要了解图片资源当初加入到工程的几种方式,及他们所在的位置. 一般winform ...
- Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案
原文:Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案 如果你是用Visual Studio自带的打包项目打包了一个I ...
- vc++ 6.0编译后生成的文件
程序在编译后,在目标路径下会生成多个文件 Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg ...
- c#:Reflector+Reflexil 修改编译后的dll/exe文件
不知道大家有没有这样的经历:现场实施时测试出一个bug,明明知道某个dll/exe文件只要修改一二行代码即可,但手头没有开发环境,紧急情况下,可以用reflector + reflexil 临时直接修 ...
- Keil编译后的各文件介绍
编译生成的文件: .plg:编译器编译结果 .hex和.bin:可执行文件 .map和.lst:链接文件 .obj:目标文件 .crf..lnp..d和.axf:调试文件 .opt:保存工程配置信息 ...
- ICP编程软件配置(烧写KEIL编译后的bin文件)
1. 安装NuMicro_ICP_Programming_Tool_1.29.6425软件 2. 打开软件后选择目标芯片后点击“连接”按钮 3. 添加程序 4. 点击设定按钮进行设定 5. 点击开始 ...
- 关于有些.aidl源码的eclipse编译后生成.java文件的错
最近下载了一个aidl源码.导入到eclipse.一直报错.无法运行到. (我是1号图) 2. .然后怎么想都不知道怎么解决.百度和谷歌了n遍. 还是找不到.后来在一个不起眼的地方看到说: aidl不 ...
- 编译Speex生成so库文件(android-speex)
项目中需要用音频格式转换,之前使用VoAacEncoder,部分手机总是莫名崩溃,所以决定不再使用VoAacEncoder,换做Speex来完成格式转换,但是没有找到Speex的库文件,网上介绍的都是 ...
随机推荐
- Kerberos 简介——教你做个好人
文章导读: 对称加密 非对称加密 数字证书 Kerberos认证流程 Hadoop生态利用Kerberos认证机制来识别可靠的服务和节点,保障Hadoop集群的安全,那么Kerberos到底是什么?为 ...
- [ POI 2012 ] Letters
\(\\\) \(Description\) 给出两个长度为 \(N\) 的字符串\(S_1,S_2\),且保证两个字符串中每一个字符出现次数相同. 现在一次操作可以交换相邻的两个字符,问将 \(S_ ...
- 08使用NanoPiM1Plus在Android4.4.2下接TF卡
08使用NanoPiM1Plus在Android4.4.2下接TF卡 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/5 17:51 版本: ...
- UVM基础之---------uvm report 机制分析
uvm 中的信息报告机制相对来说比较简单,功能上来说主要分为两部分: 第一通过ID对component的信息报告冗余级别进行控制,针对每个冗余级别进行不同的行为控制.这部分工作主要由uvm_repor ...
- HDU_1584_(DFS)
蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 并发编程学习笔记(4)----jdk5中提供的原子类及Lock使用及原理
(1)jdk中原子类的使用: jdk5中提供了很多原子类,它会使变量的操作变成原子性的. 原子性:原子性指的是一个操作是不可中断的,即使是在多个线程一起操作的情况下,一个操作一旦开始,就不会被其他线程 ...
- 梦想CAD控件安卓图层
新建图层 CAD中我们设置好图层后除了我们平常的绘图时选择线段的颜色,线型,线宽等作用,而且我们还可以在出图时选择性显示图形,冻结图形,已达到我们想要的效果. 实现代码说明: //增加一个图层 参数为 ...
- nginx_location用法总结
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配 ...
- 洛谷——P3811 【模板】乘法逆元
P3811 [模板]乘法逆元 线性求逆元 逆元定义:若$a*x\equiv1 (\bmod {b})$,且$a$与$b$互质,那么我们就能定义: $x$为$a$的逆元,记为$a^{-1}$,所以我们也 ...
- Luogu P1297 [国家集训队]单选错位
P1297 [国家集训队]单选错位 题目背景 原 <网线切割>请前往P1577 题目描述 gx和lc去参加noip初赛,其中有一种题型叫单项选择题,顾名思义,只有一个选项是正确答案.试卷上 ...