(1)再次感谢你分享你的使用经验,让我找到了金水151编译器的一个BUG。 (2)我根据你给出的程序截图重建了一个Keil的项目: (3)我用STCIDE打开这个项目: 然后进行编译,结果果然是有7个错误: (4)这让我看到了金水151编译器V2.2版的一个重要BUG:对汇编语言进行编译时具体的每个出错信息没有显示到STCIDE的“输出信息框”中。这个BUG会在以后得版本中解决。
(5)不过为了支持第三方IDE用“MakeFile”的方法使用金水151编译器,编译后所有的编译信息(包括汇编语言出错信息)都会存放在一个与项目工程名称相同的MSG文件中: (6)MSG文件是一个文本文件,可以用写字板等程序打开查看。对上面程序编译后的MSG文件的内容如下: 这些错误主要由于红绿灯的BIT定义错误引起的,即第4行和第5行中BIT定义的基地址P0没有定义引起的。
(7)如果加上P0端口定义和支线红灯定义(第1、2行程序),编译就可以通过了,下面是完整的程序: (8)对编译结果HEX文件进行反汇编得到以下结果: 从中可以看出这个编译结果是正确的。 (9)重要说明:在上面程序中,对于没有定义的500ms延时函数“DELAY”,函数地址被编译为0000H,并且没有进行出错检测。用户得自己注意 (10)笔者在设计金水151时采用这个Keil的C51规范的考虑是为了“避免无用代码扩散”,直接忽略没有定义的函数。 比如A模块(一个源程序文件)调用了B模块的一个函数FN1,那么就需要加载模块B。但是如果模块B中还有其他在本项目中没有用到的函数FN2,在FN2中调用了模块C中的函数,这时编译器就需要一个策略来决定要不要加载模块C。
由于本项目没有用到函数FN2,自然也不会用到模块C的任何内容。这时如果加载模块C,就会造成空间浪费,甚至造成连锁反应,还需要加载项目中并没有使用的模块D、模块E等等,这个现象称“无用代码扩散”。如果终止可能的连锁反应,不加载模块C,那么函数FN2就没有完整实现,因为其中访问了不存在的函数,就像上面例子的延时函数DELAY。
|