[跪求达人指点] 无极折磨 之:keil uVision 编译出来的90KB .hex 文件有几个 Byte 不一样的奇怪问题

时间:2022-10-23 06:47:15
环境:  
OS : win_xp2  
文件系统: C 盘 FAT32,安装keil, D盘 NTFS,存放程序和编译结果等。 

编译器: keil uVision 2 ,uVision 3,uVision 4 都使用过。 
        已经使用了晓风网提供的 修正 0xfd 的问题 的文件。。 

单片机:MCS-51 
8051-based microcontroller with ** RF tranceiver, 
10-bit ADC, SPI, UART, PWM, 32 KBytes Flash ROM,  
2K Bytes Code RAM, 256 Bytes DATA Memory, 2K Bytes XDATA Memory 

编译过程:解压原厂打包的代码包,直接使用解压出来的 *.uv2 文件 以及代码,进行编译。 

结果:得到的.hex 文件为90KB,用 UE打开大概 2000行。 
      其中,和解压包得到的原厂附带的 .hex文件比较,有两行中各有 2 BYTE不一样。 

见下: 
1.原厂版本: 
358 行   :10164B007E00D12DE4F551F1315010127FB6747735 
370行    :10170B00F2E4F551F1315015127FB6D19E127EE6FF 

2.编译得到的版本: 
358 行   :10164B007E00D12DE4F551F1315010127FAD74773E 
370行    :10170B00F2E4F551F1315015127FADD19E127EE608 


请注意上面的  FB ---FA, 35 ---3E  



另外,原厂版本 有 2044行,而我编译的版本只有 2043 行。 
最后的 2,3行也不一样,是校验码和版本号之类的。 

====================== 
1.本人没有修改过任何的代码或者配置文件。 
2.可能有人会问,代码是否原厂修改过,而当然和附带的HEX文件不一样。这一点我无法证明。相信不会是这个问题。 
3.编译结果放到调试板中,可以 运行。但是最终结果不对。 
4.附带的HEX文件在调试板中运行一切正常。 

20 个解决方案

#1


下载了3,4个版本的 keil uVision. 
反复 安装 和卸载了N次。 


1.如果没有安装keil uVision 2,单纯的安装版本 3 或者 4,都无法编译通过。(不得其解。。。) 
2. 在安装了 keil uVision 2/3/4以后,无论使用那个版本,编译出来的结果一样。 
3.原厂提供的工程文件是 .uv2 结尾。 
4.原厂的用户说明建议使用keil uVision3.51。 
  由于我无法找到这个版本,使用了 3.31版本,按照原厂给出的设置来编译代码,却无法通过。 
  大概意思是 :代码访问越界 之类的。 

#2


或许代码真的是不小心误改了。不过很奇怪,如果没有安装keil uVision 2,单纯的安装版本 3 或者 4,都无法编译通过。没试过这种情况。.uv2 结尾的,那就用uv2版本软件编译吧,至于越界问题,可能版本不兼容,芯片选择已经改变,你可以设置 选择更大资源的52单片机试试。呵呵,以前没碰过这么怪的问题,所以,只能说,楼主有时间的话,可以尝试。

#3


。.uv2 结尾的,那就用uv2版本软件编译吧,至于越界问题,可能版本不兼容,芯片选择已经改变,你可以设置 选择更大资源的52单片机试试。呵呵,以前没碰过这么怪的问题,所以,只能说,楼主有时间的话,可以尝试。
=====================================================================
首先谢谢·~~

选片也是按照用户手册来选的。

#4


代码,工程文件,HEX文件的最后修改日期是同一天。 
估计自带的HEX文件编译出来以后,代码是没有修改过的。 

---虽然这个并不可以证明代码是否真的没有改了。


另外,如果只安装 keil uVision 3 
会有这样的错误: 
keil uvision3 for toolset undefined .... 
Path.... 


搜索了网上的几种解决方法,除了 修改注册表 那个方法没有使用以外, 
其他的重新安装,使用其他版本或者其他人的tool.ini等都用过了,没有效果。 

安装了版本2 以后,就没有这个问题了。 

#5


会不会和 TOOL.INI有关? 
为什么如果不按照版本2,版本3,版本4都编译不过? 
和keil uVision 无关? 


如何验证。。。?

QQ 79526162 
有兴趣讨论或者需要代码或者有其他问题的,请加我。

#6


难道你按照的keil uVision3是arm版本的MDK,应该不会啊,按照的时候会提示选择选C51还是ARM的,,关于TOOL.INI的问题,试过,是这样的,在同一操作系统下,我安装了keil uVision2,同时安装了ARM版本的keil uVision3 ,又名MDK,假如你用MDK打开51prj就会出现TOOL.INI的配置问题。。。。。。。。

#7


上面有误;

难道你安装的keil uVision3是arm版本的MDK,应该不会啊,安装的时候会提示选择选C51还是ARM的,,关于TOOL.INI的问题,试过,是这样的,在同一操作系统下,我安装了keil uVision2,同时安装了ARM版本的keil uVision3 ,又名MDK,假如你用MDK打开51prj就会出现TOOL.INI的配置问题,不知道和你现在的问题同不同。。。。。。。。

#8


难道你按照的keil uVision3是arm版本的MDK


============================================

兄弟你这一提,我觉得应该是。
反正我发现版本3的  C51.EXE 是在 /keil/arm/bin/下面的。。。

#9


晕,哈哈,罪魁祸首浮出水面了,哈哈,那楼主你就安装的时候选择C51。。。。。。

#10


这个是单纯的版本4 编译时候的错误提示,版本3 好像也类似。

版本4 C51.EXE 的位置在 C:\Keil\C51\BIN
==========================
linking...
LX51 LINKER/LOCATER V4.41 - SN: Eval Version
COPYRIGHT KEIL ELEKTRONIK GmbH 1995 - 2009
@.\BUILD_~1\SERIAL~1\Rels\..\SERIAL~1.LNP ".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\serialappl.obj",
".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\conhandle.obj",
".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\UART_buf_io.obj",
"..\..\Z-Wave\rf_freq\ZW_rf_030x_US.obj",
"..\..\Z-Wave\lib\controller_static_nosuc_norep_ZW030x\zw_controller_static_nosuc_norep_ZW030xs.lib" 
TO ".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\..\serialapi_controller_static_nosuc_norep_ZW030x_US" 
PRINT(".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\list\..\serialapi_controller_static_nosuc_norep_ZW030x_US.map") DW (13,16,25) NOOL CLASSES(IDATA(D:0-D:0xff),XDATA(X:0-X:0x7ff),CODE(C:0-C:0x7fff))
SEGMENTS(?CO?ZW_RF020X_FTBL (C:0X7F80)) 
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   CODE
    SEGMENT: ?PR?_COMMANDHANDLER?ZW_CONTROLLER
    LENGTH:  0008EBH   
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 063BAH
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 06736H
******************************************************************************
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 79CBH BYTE (1522%) *
******************************************************************************
Program Size: data=255.5 xdata=1984 const=108 code=32716
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   CODE
    SEGMENT: ?PR?_COMMANDHANDLER?ZW_CONTROLLER
    LENGTH:  0008EBH   

#11


引用 9 楼 peasant_lee 的回复:
晕,哈哈,罪魁祸首浮出水面了,哈哈,那楼主你就安装的时候选择C51。。。。。。


弱弱的问。。。。。。要怎么选择的呢》?
我记得有这样一个选项:
eval version    or     full version

我选择了后者。

#12


下面提供版本4下的 完整的LOG。


Build target 'Release'
compiling serialappl.c...
compiling conhandle.c...
assembling UART_buf_io.a51...
linking...
LX51 LINKER/LOCATER V4.41 - SN: Eval Version
COPYRIGHT KEIL ELEKTRONIK GmbH 1995 - 2009
@.\BUILD_~1\SERIAL~1\Rels\..\SERIAL~1.LNP ".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\serialappl.obj",
".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\conhandle.obj",
".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\UART_buf_io.obj",
"..\..\Z-Wave\rf_freq\ZW_rf_030x_US.obj",
"..\..\Z-Wave\lib\controller_static_nosuc_norep_ZW030x\zw_controller_static_nosuc_norep_ZW030xs.lib" 
TO ".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\..\serialapi_controller_static_nosuc_norep_ZW030x_US" 
PRINT(".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\list\..\serialapi_controller_static_nosuc_norep_ZW030x_US.map") DW (13,16,25) NOOL CLASSES(IDATA(D:0-D:0xff),XDATA(X:0-X:0x7ff),CODE(C:0-C:0x7fff))
SEGMENTS(?CO?ZW_RF020X_FTBL (C:0X7F80)) 
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   CODE
    SEGMENT: ?PR?_COMMANDHANDLER?ZW_CONTROLLER
    LENGTH:  0008EBH   
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 063BAH
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 06736H
******************************************************************************
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 79CBH BYTE (1522%) *
******************************************************************************
Program Size: data=255.5 xdata=1984 const=108 code=32716
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   CODE
    SEGMENT: ?PR?_COMMANDHANDLER?ZW_CONTROLLER
    LENGTH:  0008EBH   
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 063BAH
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 06736H
*** ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
    LIMIT:   0800H BYTES
Target not created

#13


代码超了,,,,

#14


eval version or full version,这个没参考,看你按照的文件,,我加你QQ

#15


佩服,hoho

#16


补充一下,上面提及的版本4的错误信息,是由于没有使用破解补丁,导致的2K限制,发生的。

使用了补丁以后,可以编译通过,不过,运行效果还是不行。。。

#17


越走越费解。。。。

#18


该回复于2010-04-22 14:24:08被版主删除

#19


该回复于2010-04-22 14:50:46被版主删除

#20


最终原因是因为,原厂给的代码,有2个头文件不够新导致的。。
和编译器没有关心。。。
晕死

另外,之前我不太了解这里发帖要结帖。。
虽然晚了点,但是还算做了,呵呵。

#1


下载了3,4个版本的 keil uVision. 
反复 安装 和卸载了N次。 


1.如果没有安装keil uVision 2,单纯的安装版本 3 或者 4,都无法编译通过。(不得其解。。。) 
2. 在安装了 keil uVision 2/3/4以后,无论使用那个版本,编译出来的结果一样。 
3.原厂提供的工程文件是 .uv2 结尾。 
4.原厂的用户说明建议使用keil uVision3.51。 
  由于我无法找到这个版本,使用了 3.31版本,按照原厂给出的设置来编译代码,却无法通过。 
  大概意思是 :代码访问越界 之类的。 

#2


或许代码真的是不小心误改了。不过很奇怪,如果没有安装keil uVision 2,单纯的安装版本 3 或者 4,都无法编译通过。没试过这种情况。.uv2 结尾的,那就用uv2版本软件编译吧,至于越界问题,可能版本不兼容,芯片选择已经改变,你可以设置 选择更大资源的52单片机试试。呵呵,以前没碰过这么怪的问题,所以,只能说,楼主有时间的话,可以尝试。

#3


。.uv2 结尾的,那就用uv2版本软件编译吧,至于越界问题,可能版本不兼容,芯片选择已经改变,你可以设置 选择更大资源的52单片机试试。呵呵,以前没碰过这么怪的问题,所以,只能说,楼主有时间的话,可以尝试。
=====================================================================
首先谢谢·~~

选片也是按照用户手册来选的。

#4


代码,工程文件,HEX文件的最后修改日期是同一天。 
估计自带的HEX文件编译出来以后,代码是没有修改过的。 

---虽然这个并不可以证明代码是否真的没有改了。


另外,如果只安装 keil uVision 3 
会有这样的错误: 
keil uvision3 for toolset undefined .... 
Path.... 


搜索了网上的几种解决方法,除了 修改注册表 那个方法没有使用以外, 
其他的重新安装,使用其他版本或者其他人的tool.ini等都用过了,没有效果。 

安装了版本2 以后,就没有这个问题了。 

#5


会不会和 TOOL.INI有关? 
为什么如果不按照版本2,版本3,版本4都编译不过? 
和keil uVision 无关? 


如何验证。。。?

QQ 79526162 
有兴趣讨论或者需要代码或者有其他问题的,请加我。

#6


难道你按照的keil uVision3是arm版本的MDK,应该不会啊,按照的时候会提示选择选C51还是ARM的,,关于TOOL.INI的问题,试过,是这样的,在同一操作系统下,我安装了keil uVision2,同时安装了ARM版本的keil uVision3 ,又名MDK,假如你用MDK打开51prj就会出现TOOL.INI的配置问题。。。。。。。。

#7


上面有误;

难道你安装的keil uVision3是arm版本的MDK,应该不会啊,安装的时候会提示选择选C51还是ARM的,,关于TOOL.INI的问题,试过,是这样的,在同一操作系统下,我安装了keil uVision2,同时安装了ARM版本的keil uVision3 ,又名MDK,假如你用MDK打开51prj就会出现TOOL.INI的配置问题,不知道和你现在的问题同不同。。。。。。。。

#8


难道你按照的keil uVision3是arm版本的MDK


============================================

兄弟你这一提,我觉得应该是。
反正我发现版本3的  C51.EXE 是在 /keil/arm/bin/下面的。。。

#9


晕,哈哈,罪魁祸首浮出水面了,哈哈,那楼主你就安装的时候选择C51。。。。。。

#10


这个是单纯的版本4 编译时候的错误提示,版本3 好像也类似。

版本4 C51.EXE 的位置在 C:\Keil\C51\BIN
==========================
linking...
LX51 LINKER/LOCATER V4.41 - SN: Eval Version
COPYRIGHT KEIL ELEKTRONIK GmbH 1995 - 2009
@.\BUILD_~1\SERIAL~1\Rels\..\SERIAL~1.LNP ".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\serialappl.obj",
".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\conhandle.obj",
".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\UART_buf_io.obj",
"..\..\Z-Wave\rf_freq\ZW_rf_030x_US.obj",
"..\..\Z-Wave\lib\controller_static_nosuc_norep_ZW030x\zw_controller_static_nosuc_norep_ZW030xs.lib" 
TO ".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\..\serialapi_controller_static_nosuc_norep_ZW030x_US" 
PRINT(".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\list\..\serialapi_controller_static_nosuc_norep_ZW030x_US.map") DW (13,16,25) NOOL CLASSES(IDATA(D:0-D:0xff),XDATA(X:0-X:0x7ff),CODE(C:0-C:0x7fff))
SEGMENTS(?CO?ZW_RF020X_FTBL (C:0X7F80)) 
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   CODE
    SEGMENT: ?PR?_COMMANDHANDLER?ZW_CONTROLLER
    LENGTH:  0008EBH   
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 063BAH
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 06736H
******************************************************************************
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 79CBH BYTE (1522%) *
******************************************************************************
Program Size: data=255.5 xdata=1984 const=108 code=32716
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   CODE
    SEGMENT: ?PR?_COMMANDHANDLER?ZW_CONTROLLER
    LENGTH:  0008EBH   

#11


引用 9 楼 peasant_lee 的回复:
晕,哈哈,罪魁祸首浮出水面了,哈哈,那楼主你就安装的时候选择C51。。。。。。


弱弱的问。。。。。。要怎么选择的呢》?
我记得有这样一个选项:
eval version    or     full version

我选择了后者。

#12


下面提供版本4下的 完整的LOG。


Build target 'Release'
compiling serialappl.c...
compiling conhandle.c...
assembling UART_buf_io.a51...
linking...
LX51 LINKER/LOCATER V4.41 - SN: Eval Version
COPYRIGHT KEIL ELEKTRONIK GmbH 1995 - 2009
@.\BUILD_~1\SERIAL~1\Rels\..\SERIAL~1.LNP ".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\serialappl.obj",
".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\conhandle.obj",
".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\UART_buf_io.obj",
"..\..\Z-Wave\rf_freq\ZW_rf_030x_US.obj",
"..\..\Z-Wave\lib\controller_static_nosuc_norep_ZW030x\zw_controller_static_nosuc_norep_ZW030xs.lib" 
TO ".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\Rels\..\serialapi_controller_static_nosuc_norep_ZW030x_US" 
PRINT(".\build_prj\serialapi_controller_static_nosuc_norep_ZW030x_US\list\..\serialapi_controller_static_nosuc_norep_ZW030x_US.map") DW (13,16,25) NOOL CLASSES(IDATA(D:0-D:0xff),XDATA(X:0-X:0x7ff),CODE(C:0-C:0x7fff))
SEGMENTS(?CO?ZW_RF020X_FTBL (C:0X7F80)) 
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   CODE
    SEGMENT: ?PR?_COMMANDHANDLER?ZW_CONTROLLER
    LENGTH:  0008EBH   
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 063BAH
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 06736H
******************************************************************************
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 79CBH BYTE (1522%) *
******************************************************************************
Program Size: data=255.5 xdata=1984 const=108 code=32716
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   CODE
    SEGMENT: ?PR?_COMMANDHANDLER?ZW_CONTROLLER
    LENGTH:  0008EBH   
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 063BAH
*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS
    CAUSE:   JUMP TARGET OUT OF RANGE
    ADDRESS: 06736H
*** ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
    LIMIT:   0800H BYTES
Target not created

#13


代码超了,,,,

#14


eval version or full version,这个没参考,看你按照的文件,,我加你QQ

#15


佩服,hoho

#16


补充一下,上面提及的版本4的错误信息,是由于没有使用破解补丁,导致的2K限制,发生的。

使用了补丁以后,可以编译通过,不过,运行效果还是不行。。。

#17


越走越费解。。。。

#18


该回复于2010-04-22 14:24:08被版主删除

#19


该回复于2010-04-22 14:50:46被版主删除

#20


最终原因是因为,原厂给的代码,有2个头文件不够新导致的。。
和编译器没有关心。。。
晕死

另外,之前我不太了解这里发帖要结帖。。
虽然晚了点,但是还算做了,呵呵。

#21