零基础学习51单片机之keilC51常见错误汇总2

11.ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: USARTDATACOUNT

SEGMENT: ?DT?USART_READWRITE

Ram空间不足:

外部变量:定义处不用加External,声明处要加External

将以data 型别定义的公共变量修改为idata 型别的定义

12***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL

SYMBOL: VOLUME

MODULE: C:8051OSDM.OBJ (OSDM)

ADDRESS: 4036H

定义了某某函数或全部变量在不同文件里面想调用它,却在包含头文件里面少了extern语句,或只有主程序和包含头文件没有(EXTERN......定义语句(函数)).

如果调试时有些if结构里的语句符合条件没有执行,或者某些语句不符合条件也被执行,那是因为if和else里有相同的语句,编译的时候作优化处理了。

13WARNING 15 (MULTIPLE CALL TO SEGMENT) 症状

原因

Warning 15向我们表明了linker发现了一个函数,这个函数不仅在main code里被调用了,而且在ISR(或者被ISR调用的函数中)被调用了。或者是被同时被多个ISR同时调用了。

这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函数已经在执行时它可能被另一个ISR所调用。这样就会导致结果是可变的而且很可能会导致一些参数的错误。

另一个问题就是本地变量和参数所使用的内存可能被其他函数的内存覆盖。如果函数是由中断所调用的,则此函数的内存就会被使用。这会引起其它函数的内存错误。

解决方法

有几种方法去解决这个问题

如果你100%确认这个函数的两个副本都不会同时执行(如果此函数是被main调用并且中断是未被使能的)并且此函数没有使用内存(只使用的寄存器),那么你就可以忽略此警告

如果此函数使用了内存,你就要使用OVERLAY directive来将此函数从覆盖分析(overlay anaysis)中移除。举例如下:

OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)

如上语句能阻止被此函数使用的内存遭到覆盖。如果这个函数调用了你程序中其他的在别处的函数,那么你可能需要将这些函数也排除在覆盖分析之外。

如果当此函数在执行时可以被调用,那么事情就会变得比较的复杂。你可能需要:无论何时当从main中调用此函数时,需要关闭中断。你可能需要对被调用的函数使用#pragma disable。你也必须使用

OVERLAY directive将此函数从overlay analysis中移除。为此函数创建两个副本。一个给main,一个给ISR。

使此函数可重入。

14E:VCWORK2815.C(826): error C236: _wrbyte: different length of parameter lists

子函数里的形参声明的方式不对,需要每个参数都定义一下类型

E:VCWORK2815.C(743): error C183: unmodifiable lvalue

出现error C183: unmodifiable lvalue的错误,最后发现时存在一个数组是uchar code xx[5],后边把它用作接受串口的缓冲区,显示uchar code是不能改变的,是写在rom中的。应该改成uchar xx[5],这是写在ram中的

原因:修改了不能改变的变量,

E:VCWORK2815.C(799): error C242: array[]: too many initializers

15 ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: _WRITE_DATA MODULE: .ds18b20start.obj (DS18B20

c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下。

对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通常会直接定义在c文件中,在程序之前加int i定义。如果要在头文件中定义有以下两种方法:用extern来声明:extern int i;这一句只是对变量i进行声明,在c 文件的程序之前必须加上int i进行定义。extern int i=0;这一句声明和定义都做了。

对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头文件中声明(不需要初始化),然后在一个c文件中定义(该初始化的要初始化)。如果在头文件中定义,则编译的时候会出现重复定义的错误。如果只有头文件中声明就会出现没有定义有警告。

经验分享 程序员 微信小程序 职场和发展